Iptables ~ Comprendre les bases d’un Firewall
Mis à jour le , par Jacky Thierry, dans la catégorie #Sécurité & adminsys

Les attaques et le piratage étant de plus en plus fréquents sur le net, mettre un firewall sur son système est aujourd’hui un prérequis indispensable pour naviguer et protéger son réseaux. Ce tutorial, divisé en plusieurs articles, a pour but d’établir un système de défense via iptables afin de contrer les potentielles attaques, et de mettre en place des règles de redirection pour desservir tout un réseau local.
Iptables est l’outil de firewall sous linux, nous allons voir son fonctionnement de base dans cet article, avant d’étudier comment faire un firewall pour sa machine locale, puis mettre en place un routeur sécurisé pour protéger tout son réseaux.
Fonctionnement d’iptables
Iptables est un outil en ligne de commande qui crée ses règles directement depuis les arguments qu’il reçoit. Il possède 3 tables pour classer nos règles selon les besoins, contenant elles même plusieurs chaînes (catégories) :
- FILTER : c’est la table par défaut, classée en 3 chaînes : INPUT (entrant), OUTPUT (sortant), et FORWARD (redirection)
- NAT : c’est la table utilisée pour rediriger le trafic vers une autre machine. Elle possèdes les chaînes : PREROUTING (routage entrant), POSTROUTING (routage sortant) et OUTPUT (sortant)
- MANGLE : c’est la table contenant toutes les autres règles. On y retrouve les 5 chaînes vu ci dessus
Chaque règle est donc définie par ses arguments, les plus utilisés sont :
- -t : préciser la table
- -A : indiquer la chaîne
- -j : demander une action (accepter: ACCEPT, bloquer : DROP, loguer: LOG, natter : DNAT, etc..)
- -i : interface réseaux de la connexion entrante
- -o : interface réseaux de la connexion sortante
- -p : protocole
- -s : ip source
- -d : ip de destination
- –sports : ports source
- –dports : ports de destination
- -m : matcher une règle
- -F : vider une chaîne de ses règles
- -P : demander une action par défaut sur une chaine
- -D : supprimer une règle
Ainsi une règle simple pour ouvrir le port 22 sur un serveur ressemblera à ça :
iptables -t filter -A INPUT -p tcp --dport 22 -j ACCEPT iptables -t filter -A OUTPUT -p tcp --sport 22 -j ACCEPT
Chaque connexion nécessite un accès en entrée pour délivrer la demande et un accès en sortie pour envoyer la réponse. Il faut donc faire 2 règles, une en INPUT et une en OUTPUT.
Créer, lister et supprimer des règles
Il convient en premier lieu de voir les actions de bases, à savoir lister les règles existantes, en créer de nouvelles, et en supprimer.
- Ajouter une règle : pour bloquer l’accès entrant au port 80
iptables -t filter -A INPUT -p tcp --dport 80 -j DROP
- Lister les règles : pour obtenir les règles de la table filter avec leur numéro
iptables -t filter -vL --line-number
- Supprimer une règle : pour enlever la règle précédemment ajoutée (numéro 1)
iptables -t filter -D INPUT 1
A l’ajout d’une règle, celle ci prendra un numéro, celui ci est visible dans la 1ère colonne lors d’un listage, il faudra le reprendre une supprimer une règle. Dans cette exemple, nous n’avons créé qu’une seule règle, celle ci a donc le numéro 1.
Réinitialiser une chaîne et lui demander de mettre une action par défaut
Au démarrage du système, iptables ne possède aucune règle et accepte tout par défaut. Lors de tests, il peut arriver qu’une règle soit mal définie ou trop restrictive et qu’il soit plus simple de tout remettre à 0. Pour cela, on peut redémarrer la machine, ou plus simple, supprimer toutes les règles d’une chaîne et changer son action.
- Supprimer toutes les règles d’une chaîne :
iptables -t filter -F INPUT
- Supprimer toutes les règles d’une table :
iptables -t filter -F
- Changer l’action par défaut d’une chaîne :
iptables -t filter -P INPUT ACCEPT
Pour aller plus loin : exemples de règles
- Bloquer les tentatives de connexion d’une ip spécifique (1.1.1.1) à notre serveur web
iptables -t filter -A INPUT -p tcp -s 1.1.1.1 --dport 80 -j DROP
- Autoriser les connexions FTP depuis le net
iptables -t filter -A INPUT -p tcp --dport 21 -j ACCEPT iptables -t filter -A OUTPUT -p tcp --sport 21 -j ACCEPT
- Bloquer le SSH depuis un réseau local de classe C (192.168.0.*)
iptables -A INPUT -p tcp -s 192.168.0.0/24 --dport 22 -j DROP
- Autoriser les connexions SMTP, IMAP et POP
iptables -A INPUT -p tcp -m multiport --dport 25,110,143 -j ACCEPT iptables -A OUTPUT -p tcp -m multiport --sport 25,110,143 -j ACCEPT
- Autoriser seulement les connexions entrantes en SSH sans pouvoir en initialiser
iptables -A INPUT -p tcp --dport 22 -m state --state NEW,RELATED,ESTABLISHED -j ACCEPT iptables -A OUTPUT -p tcp --sport 22 -m state --state RELATED,ESTABLISHED -j ACCEPT