Iptables par l'exemple
Les critères
Filtrage par IP (couche 3 : réseaux)
Les règles peuvent contenir plusieurs critères, nous allons commencer par le plus simple : l’adresse IP. Il est possible de donner une adresse IP ou une adresse de réseau.
iptables -A INPUT -s 10.1.0.1/8 -j ACCEPT
iptables -A OUTPUT -d ! 10.1.0.0/8 -j DROP
Maintenant, nous acceptons les paquets entrants venant de l’hôte 10.1.0.1/8 et nous refusons tous paquets sortants qui ne sont pas à destination d’une machine sur le réseau 10.1.0.0/8 (négation grâce au "!").
Filtrage par interfaces (couche 1 : physique)
Une interface est un dispositif réseau physique ou virtuel possédant une ip (eg : eth0).
La boucle locale (lo) est une interface virtuelle utilisable uniquement par le machin elle-même.
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT
Ici, nous acceptons les connexions internes à notre système.
iptables -A INPUT -i eth0 -j ACCEPT
iptables -A INPUT -i ppp0 -j DROP
Nous acceptons les paquets entrant depuis l’interface eth0 mais pas ceux venant de ppp0. Notez que pour la chaîne FORWARD les deux drapeaux -o et -i peuvent être utilisés.
Combinaison de IP et interfaces.
A présent, nous connaissons deux critères (IP et interfaces) nous allons pouvoir les cumuler. Ceci est très utile pour empêcher, par exemple, l’IP Spoofing (prendre l’IP de quelqu’un d’autre).
iptables -A INPUT -i ppp0 -s 10.1.0.0/8 -j DROP
Si un paquet entrant par l’interface ppp0 (connexion Internet) contient une ip du réseau privé 10.1.0.0/8 c’est forcément un cas d’IP Spoofing. Quelqu’un essai de nous faire croire qu’il vient de notre réseau local.
iptables -A OUTPUT -o eth0 -d 10.1.0.2/8 -j ACCEPT
Nous acceptons les paquets sortants à destination de l’hôte 10.1.0.2/8, si le paquet passe par l’interface eth0.
Filtrage par protocole (couche 4 : transport)
Nous allons introduire un nouveau critère : le protocole utilisé. iptables reconnaît les deux protocoles routés les plus connus : TCP et UDP, ainsi que le protocole ICMP.
iptables -A OUTPUT -p udp --dport 53 -j ACCEPT
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
L’option --dport désigne le port de destination du paquet. Ici, nous acceptons les connexions sortantes vers un serveur DNS et les connexions entrantes sur notre serveur Web.
iptables -A OUTPUT -p tcp --sport 80 -j ACCEPT
L’option -sport désigne le port source du paquet, ici nous acceptons que notre serveur Web réponde aux requêtes des clients.
TCP Flags
TCP est un protocole orienté connexion, iptables permet de lire les marqueurs inscrits dans l’ en-tête du paquet.
Il existe six marqueurs: SYN, ACK, FIN, RST, URG, PSH.
iptables -A INPUT -p tcp --tcp-flags SYN,ACK,FIN SYN -j ACCEPT
L’option -tcp-flags prend deux argument, d’abord une liste des marqueurs à reconnaître puis la liste de leur état (1 ou 0). Ici, on vérifie que c’est un paquet où le marqueur SYN est à 1 et les deux marqueurs ACK et FIN sont à 0.
iptables -A INPUT -p tcp --tcp-flags ALL ALL -j DROP
On peut utiliser les mots clef ALL et NONE pour tous les marqueurs ou aucuns. La règle ci-dessus refuse un type de X-mas scan (tous les marqueurs sont à 1).
L’utilisation de cette option est compliqué, il est conseillé d’utiliser le module state (cf. Module State)
ICMP Type
Pour le protocole ICMP, nous allons pouvoir reconnaître les différents types.
iptables -A INPUT -p icmp --icmp-type echo-request -j DROP
Avec cette règle, notre pare-feu refusera tout les demandes faites via la commande ping.
Module State
iptables est un pare-feu dit "full state", c’est-à-dire que même sur des protocoles, comme udp, qui ne sont pas orientés connexion, on va pouvoir vérifier l’état de la connexion.
iptables -A INPUT -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -m state --state INVALID -j DROP
Maintenant nous acceptons les nouvelles connexions (eg : SYN) , les connexions déjà établies (eg : ACK) et les connexions en relation avec une connexion déjà établis (eg : FTP-data, IRC-dcc, …)
Tous les paquets qui ne peuvent pas êtres classés dans les états ci-dessus sont considérés comme invalide donc refusés.
Module Adresse Mac (couche 2 : liaison de données)
Ce module permet de vérifier l’adresse mac de l’expéditeur.
iptables -A INPUT -m mac --mac-source 00:09:99:45:34:34 -j DROP
Nous refusons tous paquets entrant venant du dispositif réseau avec l’adresse physique 00:09:99:45:34:34