1 - Prérequis

Iptables est installé en standard sur toutes les distributions Linux récentes (noyau 2.4 et supérieur).

Si vous avez besoin de rediriger des paquets ip d'une interface réseau vers une autre il sera nécessaire d'exécuter cette commande pour que le noyau le prenne en compte :

root# echo 1 > /proc/sys/net/ipv4/ip_forward

2 - Les différentes tables

La table NAT (network address translation) : Utilisé pour la translation d'adresse ou de port.

  • Il y a 2 types de chaines : PREROUTING qui permet de spécifier "à l'arrivée du firewall" et la chaine POSTROUTING qui permet de spécifier "à la sortie du firewall".
  • Il existe 3 clibles : DNAT pour modifier l'adresse destination du paquet , SNAT pour modifier l'adresse source du paquet et MASQUERADE pour transformer les paquets sortants passant pour donner l'illusion qu'ils sortent de la passerelle elle-même par un port alloué dynamiquement.

La table FILTER : C'est la table par défaut lorsque l'on en spécifie pas, elle contient toutes les règles de filtrage.

  • Il y a 3 types de chaines : FORWARD pour les paquets passant par le firewall, INPUT pour les paquets entrant et OUPUT pour les paquets sortants.
  • Les chaines sont ACCEPT pour accepter le paquet, DROP pour rejeter le paquet sans message d'erreur si la règle est vérifiée, REJECT pour rejeter avec message d'erreur à l'expéditeur.

La table MANGLE : C'est la table qui contient les règles pour la modification de paquets.

3 - Les commandes principales

-A --append : Ajoute la règle à la fin de la chaine spécifiée.
exemple : # iptables -A INPUT ...

-D --delete : Permet de supprimer une chaine soit en spécifiant le numéro de la chaine ou la règle à retirer.
exemple : # iptables -D INPUT --dport 80 -j DROP
iptables -D INPUT 1

-R --replace ; Permet de remplacer un chaine spécifiée
exemple : # iptables -R INPUT 1 -s 192.168.0.3 -j DROP

-I --insert ; Permet d'ajouter une chaune dans un endroit spécifier, si aucun chiffre n'est spécifié la règle est ajouté à la suite de la chaine
exemple ; # iptables -I INPUT 1 --dport 80 -j ACCEPT

-L --list : Permet d'afficher les règles
exemple : iptables -L ou iptables -L INPUT

-F --flush : Permet de vider toutes les règles d'une chaine
exemple : iptables -F INPUT

-N --new-chain : Permet de créer une nouvelle chaine
exemple : iptables -N LOG_DROP

-X --delete-chain : Permet de supprimer une chaine
exemple : iptables -X LOG_DROP

-P --policy : permet de spécifier au noyau la politique par défaut d'une chaine DENY, ACCEPT, REJECT,DROP
exemple : iptables -P INPUT DROP

4 - Les commandes pour matcher

Le "!" peut être utilisé pour certaines commandes pour spécifier le contraire.
exemple : iptables -A INPUT -p tcp --source ! 192.168.1.2 -j DROP
Ce qui refuse tout le traffic tcp sauf ce qui provient de l'adresse ip 192.168.1.2

-j (jump) : Défini l'action à prendre si un paquet repond aux critères ACCEPT, LOG, DROP ...
exemple : iptables -A INPUT -p icmp -j ACCEPT

-p --protocol : Spécifie le protocole : tcp, udp, icmp, all
exemple : iptables -A INPUT -p tcp -j DROP

-s --source : Spécifie l'adresse source à matcher
-d --destination : Spécifie l'adresse de destination
exemple : iptables -A INPUT -p tcp -d 192.168.2.4 -j DROP

-i --in-interface : Spécifie une interface d'entrée
exemple : iptables -A INPUT -p icmp -i eth0 -j ACCEPT

-o --out-interface : Spécifie l'interface de sortie
exemple : iptables -A OUTPUT -p icmp -o eth1 -j DROP

-f --fragment : Paquet fragmenté
exemple : iptables -A INPUT -p icmp -f -j DROP

--sport --source-port : Spécifie le port source ou plage de ports, fonctionne auusi en udp, -m multiport permet de spécifier plusieurs port à matcher.
--dport --destination-port : Spécifie le port destination ou plage de ports , -m multiport pour plusieurs ports à matcher.
exemple : iptables -A INPUT -p tcp --sport 80 -j ACCEPT
iptables -A INPUT -p udp --sport 80 -j DROP
iptables -A OUTPUT -p tcp -m multiport --sport 3128,21,1000 -j DROP
iptables -A INPUT -p tcp --dport 110 -j DROP

--tcp-flags : Spécifie un flag tcp à matcher : SYN, ACK, FIN, RST, URG, PSH, ALL, NONE
exemple : iptables -A INPUT -p tcp --dport 42 --tcp-flags SYN,ACK -j ACCEPT

--icmp-type : Spécifie un type de paquet icmp à matcher
exemple : iptables -A INPUT -p icmp --icmp-type 8 -j DROP

--mac-source : Pour les adresses mac à matcher
exemple : iptables -A INPUT --mac-source BB:BB:AC:43:41:42:45:AA -j DROP

--state : Permet de spécifier l'état du paquet à matcher parmi les états suivants:
ESTABLISHED : paquet associ à une connexion déjà établie
NEW : paquet demandant une nouvelle connexion
INVALID : paquet associé à une connexion inconnue
RELATED : Nouvelle connexion mais liée, idéal pour les connexions FTP
exemple : iptables -A INPUT -i eth0 -p tcp --dport 80 -m state --state NEW,ESTABLISHED -j ACCEPT

5 - Quelques spécificités

Spécificités NAT :

--to-destination : Utilisé en target pour le DNAT, permet de spécifier l'adresse de destination de la translation, on peut également spécifier un port s'il est différent du port source.
exemple : iptables -t nat -A PREROUTING -d 1.2.3.4 -p tcp --dport 110 -j DNAT --to-destination 192.168.1.2:6134

--to-source : Utilisé en target pour le SNAT, permet de spécifier l'adresse source de la translation

Spécificités LOGS :

--log-level : Niveau de log
--log-prefix : Permet de spécifier un préfixe pour le logs

6 - Quelques liens :

l'article sur Netfilter