Module 3
Chapitre 04 - Firewalling
1. Introduction
1.1 Concepts
1.1.1 Notion de firewall
Un firewall est un processus qui analyse le trafic. Il y a 3 types de trafic distincts : entrant, sortant, traversant.

Un trafic est une chaîne à laquelle on peut appliquer un ensemble de règles.
Une règle est une ou plusieurs instructions auxquelles le trafic va correspondre ou non.
S'il n'y a pas correspondance, le paquet sera transmis à la règle suivante, mais s'il correspond, il est redirigé vers la cible pointé par la règle.
Une cible est une action effectuée sur le paquet. Les cibles les plus simples sont : accepter ou rejeter le paquet. Mais il est possible de faire d'autre action prédéfinis comme rediriger le paquet vers un autre hôte.
1.1.2 Principe de translation d'adresse
Le NAT (Network Address Translation) vous permet d'utiliser des adresses IP privées sur votre LAN et de translater ces adresses afin de les rendre accessible depuis un réseau public comme Internet.
Le réseau privé est défini sur l'interface intérieure et l'adresse publique sur l'interface extérieure de votre routeur.
Dans sa forme la plus simple ; appelé NAT statique ; une adresse privée unique est redirigée, vers une adresse publique unique.
La forme la plus utilisée de NAT est un groupe d'adresse privées translaté en une seule et unique adresse publique. Cette forme de NAT est appelée "overloading".
1.2 Netfilter
Netfilter est un pare-feu complet fonctionnant sous Linux (noyaux 2.4 et 2.6), il remplace ipchains qui fonctionnait sur les noyaux 2.2.
Les chaînes de Netfilter sont reparties dans 3 tables :
- FILTER : c'est la table par défaut, elle filtre les 3 trafics principaux.
- NAT : table dédiée à la redirection de paquets.
- MANGLE : table utilisée pour les services réseaux additionnels.
Netfilter fonctionne au niveau du noyau, pour l'administrer, iptables est utilisé.
2. Installation
2.1 Partie noyau : Netfilter
Netfilter agit au niveau du noyau, il est donc nécessaire d'activer certaines options à la compilation (en dur ou en modules). Voici la procédure à suivre pour une noyaux 2.6 (pour un noyau 2.4, la manipulation est fortement semblable).
bash-2.05b$ cd /usr/src/linux
bash-2.05b$ make menuconfig
Device drivers --->
Networking support --->
Networking options --->
[*] Network packet filtering (replaces ipchains) --->
IP : Netfilter configuration --->
Dans ce dernier menu, vous trouverez toutes les options de Netfilter.
bash-2.05b$ make
.....compilation....
bash-2.05b$ make modules_install
.....installation des modules.....
2.2 Partie administration : iptables
iptables doit être installé dans /sbin/iptables si ce n'est pas le cas (iptables est installé de base dans les distributions récentes) il faut télécharger iptables sur www.netfilter.org/download.html et prendre la dernière version.
Il faut ensuite se placer dans le répertoire où iptables a été téléchargé et exécuter les commandes suivantes :
bash-2.05b$ tar jxvf iptables-x.y.z.tar.bz2
bash-2.05b$ cd iptables-x.y.z
bash-2.05b$ make KERNEL_DIR=<chemin_vers_les_sources_du_noyaux>
bash-2.05b$ make install KERNEL_DIR=<chemin_vers_les_sources_du_noyaux>
Par défaut les sources se trouvent dans /usr/src/linux (lien symbolique).
Exemple :
bash-2.05b$ make KERNEL_DIR=/usr/src/linux-2.6.6/
.....compilation....
bash-2.05b$ make install KERNEL_DIR=/usr/src/linux-2.6.6/
.....installation.....
3. Utilisation d'iptables
3.1 La table FILTER
C'est la table par défaut lorsqu'on ne spécifie aucune table. Elle contient toutes les règles de filtrage :
- INPUT : pour les paquets entrants.
- OUPUT : pour les paquets sortants.
- FORWARD : pour les paquets traversants le firewall.
3.1.1 Les cibles de la table Filter
Lorsqu'un paquet correspond au motif de reconnaissance d'une règle, une décision est prise.
- ACCEPT : Permet d'accepter un paquet si la règle est vérifiée.
- REJECT : Permet de rejeter le paquet avec un retour d'erreur à l'expéditeur si la règle est vérifiée.
- --reject-with : Spécifier le type d'erreur a retourné. (icmp-net-unreachable, icmp-host-unreachable, icmp-port-unreachable, icmp-proto-unreachable, icmp-net-prohibited, icmp-host-prohibited)
- DROP : Permet de rejeter le paquet sans retour d'erreur à l'expéditeur si la règle est vérifiée.
- LOG : Permet de logguer le passage du paquet si la règle est vérifiée.
- --log-level : Spécifie le level des logs
- --log-prefix : Spécifie un préfix placer devant l'evenement, utile pour identifier les evenements different (29 charateres max).
Un exemple de règle illustrant cela serait :
bash-2.05b$ iptables -A INPUT -j DROP
commande Ajout de règles chaine concernée cible
Cette règle aura pour effet de bloquer tout le trafic entrant
3.1.2 Les cibles personnalisées
Il est également possible de créer ses propres cibles. De la même manière qu'une fonction permet de regrouper des taches en un seul groupe, la création d'une nouvelle chaîne permet de définir un jeu de règles pouvant être appelées en une fois.
3.1.2.1 Création de chaîne :
Syntaxe : -N --new-chain : Permet de créer une nouvelle chaîne.
Exemple :
bash-2.05b$ iptables -N LOG_DROP # On crée une nouvelle chaîne
bash-2.05b$ iptables -A LOG_DROP -j LOG --log-prefix ' DROPING PAQUET : '
bash-2.05b$ iptables -A LOG_DROP -j DROP
A présent nous avons créé une nouvelle chaîne que nous pouvons utiliser de la manière suivante ;
bash-2.05b$ iptables -A INPUT -j LOG_DROP
bash-2.05b$ iptables -A OUTPUT -j LOG_DROP
bash-2.05b$ iptables -A FORWARD -j LOG_DROP
3.1.2.2 Suppression de chaîne
Syntaxe : -X --delete-chain : Supprime la chaîne spécifiée.
Exemple :
bash-2.05b$ iptables -X LOG_DROP # Supprime la chaîne LOG_DROP.
3.2 Enregistrement et chargement de règles
Toutes les règles que l'on définit avec iptables sont stockées en mémoire. Si l'on éteint ou redemare la machine on pert les règles. Voici comment les sauvegarder puis les réutiliser.
3.2.1 Sauvegarder les règles
Syntaxe : iptables-save
Exemple :
bash-2.05b$ iptables-save > fichier.bak # il est necessaire de rediriger le flux dans un fichier.
3.2.2 Charger les règles
Syntaxe : iptables-reload
Exemple :
bash-2.05b$ iptables-relaod < fichier.bak
3.3 Les commandes principales
iptables est un logiciel qui fonctionne uniquement en ligne de commande, nous allons donc présenter les principales commandes :
| Argument | Description |
| -L --list | Affiche les règles d'une chaîne. |
| -A --append | Ajoute une règle à la fin de la chaîne spécifie. |
| -I --insert | Permet d'insérer une règle dans une chaîne. |
| -D --delete | Supprime une chaîne. |
| -R --replace | Remplace la règle spécifiée par une autre règle. |
| -F --flush | Permet d'effacer toutes les règles d'une chaîne. |
| -P --policy | Spécifie au noyau la cible à appliquer par défaut à une chaîne. |
bash-2.05b$ iptables -L # Affiche toutes les règles de toutes les chaînes de la table FILTER.
bash-2.05b$ iptables -L OUTPUT # Affiche toutes les règles de la chaîne OUTPUT.
bash-2.05b$ iptables -A OUTPUT -j DROP # Ajoute la règle -j DROP à la fin de la chaîne OUTPUT.
bash-2.05b$ iptables -I OUTPUT 1 -j DROP # Insère la règle -j DROP avant la règle 1 (cette règle devient donc la première) .
bash-2.05b$ iptables -D OUTPUT -j DROP # Supprime la règle OUTPUT -j DROP
bash-2.05b$ iptables -D OUTPUT 1 # Supprime la première règle de la chaîne OUTPUT
bash-2.05b$ iptables -R OUTPUT 1 -j DROP # Remplace la première règle de la chaîne OUTPUT par -j DROP.
bash-2.05b$ iptables -F # Efface toutes les règles de toutes les chaînes.
bash-2.05b$ iptables -F INPUT # Efface toutes les règles de la chaîne INPUT.
bash-2.05b$ iptables -P OUTPUT DROP # utilise la target DROP par défaut si aucune règle ne s'applique au paquet
3.4 Options
| Note: | |
Le "!" signifie le contraire (comme en programmation). |
3.4.1 Options globales
| Argument | Description |
| -s --source | Spécifie une adresse source à traiter. |
| -d --destination | Spécifie une adresse de destination. |
| -i --in-interface | Spécifie une interface d'entrée. |
| -o --out-interface | Spécifie une interface de sortie. |
bash-2.05b$ iptables -A INPUT -s !192.168.1.8 -j ACCEPT # Autorise tout sauf l'hôte 192.168.1.8 à entrer sur la machine.
bash-2.05b$ iptables -A INPUT -s 192.168.1.0/24 -j ACCEPT # Autorise le sous-réseaux 192.168.1.0 à entrer sur la machine.
bash-2.05b$ iptables -A FORWARD -d 192.168.1.1 -j ACCEPT # Autorise la transmition de paquet vers l'hôte 192.168.1.1
bash-2.05b$ iptables -A INPUT -i eth0 -j DROP # Refuse le trafic en entrée sur l'interface eth0.
bash-2.05b$ iptables -A OUTPUT -o eth0 -j DROP # Refuse les paquets qui sort par eth0
3.4.2 Options protocoles
l'option -p peut prendre plusieurs sous options, elles ne peuvent être utilisées qu'après l'utilisation de l'option -p.
| Argument | Description |
| -p --protocol | spécifie un protocole udp, tcp, icmp ou all (pour tous les protocoles) |
| --sport --source-port | Spécifie le port source (ou une plage de 15 ports maximum avec l'option -m multiport) |
| --dport --destination-port | Spécifie le port de destination (ou une plage de 15 ports maximum avec l'option -m multiport). |
| --icmp-type | Spécifie un type de paquet ICMP à traiter (Option utilisable uniquement pour le protocole icmp). |
bash-2.05b$ iptables -A INPUT -p icmp -j ACCEPT # Autorise le protocole ICMP (ping) en entrée.
bash-2.05b$ iptables -A INPUT -p tcp --sport 80 -j ACCEPT # Accepte les données envoyer par un site web.
bash-2.05b$ iptables -A INPUT -p tcp -m multiport --sport 80,21,22 -j ACCEPT # Accepte les données envoyer par un site web, un ftp et un serveur SSH.
bash-2.05b$ iptables -A INPUT -p tcp --dport 21 -j ACCEPT # Accepte le port 21 (FTP) en entrée.
bash-2.05b$ iptables -A OUPUT -p tcp -m multiport --dport 6667,6668 -j DROP # Refuse les ports 6667 et 6668 en sortie (impossible de se connecter à IRC).
bash-2.05b$ iptables -A INPUT -p icmp --icmp-type 8 -j DROP # Refuse les icmp echo-request
3.4.3 Options de correspondance
l'option -m marche sur le même principe que l'option -p. Elle doit être suivi d'une et une seule option : mac , state, limit ou multiport vu ci-dessus.
--mac-source : spécifie une adresse MAC à traiter
Exemple :
bash-2.05b$ iptables -A INPUT -m mac --mac-source 00-08-6C-E0-1B-BE -j DROP # Interdit l'adresse MAC 00-08-6C-E0-1B-BE en entrée.
--state : spécifie l'état du paquet à traiter dont voici les état possibles :
- NEW : Paquet demandant une nouvelle connexion (SYN)
- ESTABLISHED : Paquet associé à une connexion déjà établie (ACK)
- RELATED : Nouvelle connexion liée (FTP ou message d'erreur envoyer par ICMP)
- INVALID : Connexion inconnue.
Exemple :
bash-2.05b$ iptables -A INPUT -p tcp -m state --state NEW -j DROP #Refuse les nouvelles connetions entrante.
--limit : Spécifie une limite par rapport au temps.
Les valeurs temporels utilisable sont :
- /second
- /minute
- /hour
- /day
Exemple :
bash-2.05b$ iptables -A INPUT -p icmp -m limit --limit 3/second -J ACCEPT # accpetera 3 icmp par seconde, le 4eme sera rejeter.
3.5 NAT (Network Address Translation)
Table NAT : Table utilisée pour la translation d'adresse ou de port.
Il y a 2 types de chaînes :
- PREROUTING : paquets entrants sur le firewall.
- POSTROUTING : paquets sortants du firewall.
3.5.1 Les cibles pour NAT
MASQUERADE (uniquement POSTROUTING)
La passerelle (la machine où est installée iptables) transforme les paquets sortants pour donner l'illusion qu'ils sortent de celle-ci par un port alloué dynamiquement ; lorsque la passerelle reçoit une réponse (d'Internet par exemple) sur ce port, elle utilise une table de correspondance entre le port et les machines du réseau local qu'elle gère pour lui faire suivre le paquet.
Exemple :
bash-2.05b$ iptables -t nat -A POSTROUTING -o eth1 -j MASQUERADE # tout les paquet sortant par eth0 auront l'ip de eth0.
DNAT (uniquement PREROUTING)
Permet de modifier l'adresse de destination du paquet.
--to-destination : Utiliser avec la cible DNAT, permet de spécifier l'adresse de destination de la translation.
Exemple :
bash-2.05b$ iptables -t nat -A PREROUTING -p tcp --dport 5660 -j DNAT --to-destination 192.168.0.7:5660
Route les paquets tcp à destination du port 5660 vers l'adresse privée 192.168.0.7 (port 5660 également).
SNAT (uniquement POSTOUTING)
Permet de modifier l'adresse source du paquet.
--to-source : Utiliser avec la cible SNAT, permet de spécifier l'adresse source de la translation.
S'utilise de la même manière que "--to-destination".
4. Options noyau
Il est possible de changer des options du noyau via le pseudo-systeme de fichier : /proc. iptables est composé en 2 partie. Une partie d'administration par ligne de commande comme on vient de le voir, mais la plus grosse partie du travail se fait au niveau du le noyau.
Comment modifier une option ? Sous Linux, tout est fichier, il faudra seulement changer la valeur de ce fichier. 1 actif, 0 inactif.
echo "1" > /proc/sys/net/ipv4/ip_forward
Pourquoi utiliser les options noyaux à la place de règles iptables ? Tous simplement car cela demande moins de ressources. Lorsqu'un paquet arrive, il est d'abord analysé par le noyau puis il passe par toutes les règles de iptables. Plus tôt un paquet non désiré est rejeté moins de ressources seront utilisées.
L'inconvénient, c'est que les options du noyau ne sont pas aussi précises que pourrait l'être des règles iptables.
4.1 Options relatives aux ICMP
/proc/sys/net/ipv4/icmp_echo_ignore_broadcasts :
Ignore les ping envoyés par broadcasts ou multicasts. Souvent utilisé pour eviter les "Ping Scanning"
/proc/sys/net/ipv4/icmp_echo_ignore_all :
Ignore tous les ping envoyés par broadcasts, multicasts ou ceux destiné à la machine directement.
/proc/sys/net/ipv4/conf/all/accept_redirects :
Accepte la redirection de ping dans le cas d'un routeur ou d'une passerelle.
4.2 Options relatives aux IP
/proc/sys/net/ipv4/ip_forward :
Cette option est indispensable pour faire passerelle.n Elle autorise le transfert de paquet entre 2 interfaces.
/proc/sys/net/ipv4/conf/all/rp_filter :
Empêche l' "ip spoofing". Le noyau vérifie que la concordance IP/Interface soit cohérente. Par exemple une IP privée ne sera pas accepter si elle vient par l'interface connecter à internet.