Netfilter est un module qui permet de filtrer et de manipuler les paquets réseau qui passent dans le système.
Il fournit à Linux :
codice_1 est la commande qui permet de configurer Netfilter. Dans les dernières versions de Linux il existe aussi une nouvelle commande qui s'appelle codice_2 (pour "nftables").
Fonctionnement.
Netfilter intercepte les paquets réseau à différents endroits du système (à la réception, avant de les transmettre aux processus, avant de les envoyer à la carte réseau, etc.).
Les paquets interceptés passent à travers des "chaînes" qui vont déterminer ce que le système doit en faire.
En modifiant ces chaînes on va pouvoir bloquer certains paquets et en laisser passer d'autres.
Filtrage.
Dans son fonctionnement le plus simple, Netfilter permet de jeter ou de laisser passer les paquets qui entrent et qui sortent.
Il fournit pour cela trois chaînes principales :
En ajoutant des règles dans ces chaînes on pourra laisser passer ou jeter les paquets suivant certains critères.
Chaînes.
Une chaîne est un ensemble de règles qui indiquent ce qu'il faut faire des paquets qui la traversent.
Lorsqu'un paquet arrive dans une chaîne :
Règles.
Une règle est une combinaison de critères et une cible.
Lorsque tous les critères correspondent au paquet, le paquet est envoyé vers la cible.
Les critères disponibles et les actions possibles dépendent de la chaîne manipulée.
Syntaxe.
La syntaxe d'codice_1 et toutes les options sont décrites dans la page de man.
Pour chaque paramètre il existe généralement une forme longue avec deux tirets (par exemple codice_4) et une forme courte avec un seul tiret (par exemple codice_5).
Utiliser l'une ou l'autre n'a pas d'importance, elles sont équivalentes.
Les deux possibilités sont souvent représentées dans la documentation sous la forme codice_6.
Les paramètres indiqués entre crochets (par exemple codice_7) sont facultatifs.
Ce qui se trouve entre inférieur et supérieur (par exemple codice_8) doit être remplacé par une valeur.
La forme générale pour utiliser codice_1 est la suivante :
La table par défaut est la table "filter".
Commandes.
Les commandes principales sont les suivantes :
Affiche les règles contenues dans les chaînes ou seulement dans la chaîne sélectionnée.
Si le paramètre codice_10 est placé avant cette commande, le nombre de paquets ayant traversé chaque règle sera également affiché.
Ajoute une règle à la fin de la chaîne <chaine>.
Si tous les critères correspondent au paquet, il est envoyé à la cible.
Voir plus bas pour une description des critères et des cibles possibles.
Comme codice_4 mais ajoute la règle au début de la chaîne.
Supprime la règle correspondante de la chaîne.
Efface toutes les règles de la chaîne.
Si aucune chaîne n'est indiquée, toutes les chaînes de la table seront vidées.
Détermine la cible lorsqu'aucune règle n'a interrompu le parcours et que le paquet arrive en fin de chaîne.
Critères.
Les critères possibles sont nombreux.
En voici quelques-uns :
Le protocole est <protocole>.
Les protocoles possibles sont tcp, udp, icmp, all ou une valeur numérique.
Les valeurs de /etc/protocols sont aussi utilisables.
Si un point d'exclamation se trouve avant le protocole, le critère correspondra au paquet seulement s'il n'est pas du protocole spécifié.
L'adresse source est <adresse>.
Si un masque est précisé, seules les parties actives du masque seront comparées.
Par exemple, lorsqu'on écrit codice_12, toutes les adresses entre 192.168.5.0 et 192.168.5.255 correspondront.
On peut aussi écrire le masque sous la forme d'un nombre de bits (/8 correspond à 255.0.0.0, /24 à 255.255.255.0, etc.)
Le masque par défaut est /32 (/255.255.255.255), soit l'intégralité de l'adresse.
Un point d'exclamation ne fera correspondre le paquet que s'il n'a pas cette adresse source.
Comme --source mais pour l'adresse destination.
Le port destination est <port>.
Il est obligatoire de préciser le protocole (codice_13 ou codice_14) car dans les autres protocoles il n'y a pas de notion de port.
Comme --dport mais pour le port source.
L'interface réseau d'où provient le paquet. N'est utilisable que dans les chaînes INPUT et FORWARD.
L'interface réseau de laquelle va partir le paquet.
N'est utilisable que dans les chaînes OUTPUT et FORWARD.
Si le protocole choisi est icmp, permet de spécifier un type précis.
exemples de types: "echo-request" pour l'envoi d'un "ping", "echo-reply" pour la réponse à "ping"
Cibles.
Les cibles principales sont les suivantes :
Autorise le paquet à passer et interrompt son parcours de la chaîne.
Jette le paquet sans prévenir l'émetteur.
Le parcours de la chaîne est interrompu.
Comme DROP mais prévient l'émetteur que le paquet est rejeté.
La réponse envoyée à l'émetteur est également un paquet qui devra satisfaire les règles de sortie pour pouvoir passer.
Enregistre le paquet dans les logs systèmes.
Au <level> par défaut, le paquet est affiché sur la console principale du système.
Cette cible est utile pour voir certains paquets qui passent (pour débugger ou pour alerter).
Utilisation simple.
Le principe est assez simple à comprendre : un paquet IP arrive sur votre machine, vous devez
alors choisir ce que vous en faites. Vous pouvez l’accepter (ACCEPT), le rejeter (REJECT) ou le
dénier (DROP). La différence entre les deux derniers modes qu'avec REJECT on prévient l’envoyeur
que son paquet a été refusé, mais pas avec DROP.
Trois types de paquets peuvent passer par le firewall. Les paquets sortant (OUTPUT),
entrant (INPUT) ou « passant », c’est-à-dire qui ne font que rebondir sur le routeur qui doit les
rediriger FORWARD).
Pour organiser les règles d’acceptation/rejet, on procède de la façon suivante :
– INPUT, OUTPUT, FORWARD, sont appelés des chaînes
– une règle est un ensemble d’attributs auxquels correspond (ou non) un paquet : IP source,
IP destination, port source, port destination, protocole . . .
– quand un paquet passe par le firewall, il est aiguillé vers la chaîne correspondante
– ensuite, les règles de la chaîne sont testées une par une, dans l’ordre, sur le paquet. Dès
que le paquet correspond à une règle, on s’arrête. Si la règle stipule ACCEPT, le paquet
est accepté. Si elle stipule DROP, il est ignoré. Si elle stipule REJECT, il est refusé avec
acquittement. Les règles suivantes ne sont pas testées.
– si aucune règle ne correspond au paquet, la politique par défaut est appliquée. Elle peut
être positionnée à ACCEPT, DROP ou REJECT.
Il est plus sécurisant (mais plus long à mettre en place) d’utiliser une politique par défaut DROP
et de créer des règles ACCEPT.
La syntaxe d’iptables est la suivante :
Il y a bien sûr de nombreuses autres options.
Créer et appliquer des règles.
Toutes les commandes iptables sont tapées directement sur la ligne de commande du terminal.
Il est plus pratique de les inscrire dans un fichier script et de rendre ce script exécutable
(chmod +x). Ne donnez que les droits minimums à ce fichier pour qu’il ne puisse pas être lu et
modifié par tout le monde. Exemple de fichier :
iptables -F
iptables -P INPUT DROP
iptables -P OUTPUT DROP
iptables -P FORWARD DROP
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT
Quelques exemples.
Pour vider la chaine "INPUT" de la table "filter" (la table par défaut) :
La politique par défaut est d'accepter tous les paquets, ce qui est généralement un mauvais choix pour la sécurité.
Pour changer cette règle sur la chaine "FORWARD" de la table "filter" :
Pour laisser passer les paquets sur le port "telnet" qui viennent d'un réseau local (forme longue) :
Pour ignorer les autres paquets entrants sur le Port (logiciel)|port "telnet" (forme courte) :
Pour rejeter les paquets entrants sur le port 3128, souvent utilisé par les "proxies" :
Pour autoriser telnet vers votre machine (serveur telnet) :
Pour autoriser telnet depuis votre machine (client telnet) :
Destination NAT :
 iptables -t nat -A PREROUTING -p tcp --dport 80 -j DNAT --to 192.168.0.1
Le cas FTP.
Le protocole FTP est difficile à gérer avec un firewall car il utilise plusieurs connexions.
Lorsqu'on se connecte par FTP sur un serveur, on créé une connexion dite de "contrôle" qui permet d'envoyer les commandes au serveur.
Ensuite pour chaque transfert de fichier et chaque listage de répertoire, une nouvelle connexion de "données" sera créée.
Le firewall peut très bien gérer la connexion de contrôle, mais pas celles de transfert car elles sont faites sur des ports indéterminés.
Sur certains serveurs FTP il est possible de fixer une plage de ports à utiliser, et dans ce cas on peut faire du NAT simple.
Il est également possible d'utiliser le "conntrack ftp". C'est un module pour Netfilter qui inspecte les connexions FTP de contrôle pour détecter les connexions de données. Il indique alors au noyau que ces connexions sont liées à une autre connexion ("RELATED"). Pour autoriser ces connexions avec iptables on utilise le module "state".
Pour cela il faut charger le module ip_conntrack_ftp :
 modprobe ip_conntrack_ftp
Et autoriser les connexions "RELATED" en entrée et en sortie :
 iptables -A INPUT -m state --state RELATED -j ACCEPT
 iptables -A OUTPUT -m state --state RELATED -j ACCEPT