Iptables est le nom de la commande qui contrôle le firewall Netfilter, qui est un module du noyau GNU/Linux. Ensemble, ils permettent de filtrer des paquets (IPv4, IPv6..) en configurant des règles et des chaînes définis par l’administrateur système.
Introduction
Architecture
Table FILTER
La table FILTER contient les règles de filtrage des paquets en général.
Chaîne INPUT : Cette chaîne décide du sort des paquets entrants à destination des hôtes locaux.
Chaîne OUTPUT : Celle-ci décide du sort des paquets sortants, émis par les hôtes locaux.
Chaîne FORWARD : Ici, ce sont les paquets qui traversent et qui suivent les routes (passerelles).
Table NAT
La table NAT permet de faire de la translation d’adresse réseau (NAT) avec les différents paquets circulants.
Chaîne PREROUTING : Permet de faire de la redirection de ports, WAN vers LAN. On peut par exemple rediriger les paquets à destination du port 80 sur notre passerelle/IP public vers un hôte local sur le port 8080.
Chaîne POSTROUTING : Permet de faire du SNAT, MASQUERADE. Masquer les adresses des hôtes locaux avec une IP « officielle » qui elle sera vu des hôtes WAN.
Chaîne OUTPUT : Modifier la destination des paquets générés localement.
Table MANGLE
La table MANGLE quand à elle, permet de marquer les flux des paquets entrants et générés localement pour un traitement spécifique de ces paquets. On peut privilégier certains flux par rapport à d’autre, ce qui revient à faire de la QoS.
Syntaxes
ACCEPT : Accepter les paquets.
DROP : Rejeter les paquets sans en avertir le demandeur.
REJECT : Rejeter les paquets en avertissant le demandeur avec un paquet RESET.
Utiliser DROP permet d’éviter de donner des informations supplémentaires en cas de scan réseau par exemple.
En utilisant REJECT, la connexion sera vu comme directement rejetée. C’est utilisé pour indiquer à l’autre extrémité que le port est inacessible.
Tandis qu’avec DROP, elle apparaîtra comme connexion expirée, timed-out. Une adresse IP innocupée. De plus, la vitesse de scan sera considérablement ralentis avec un paquet « dropé ». Un scanner réseau basique attendra qu’une tentative de connexion soit terminée avant de commencer la suivante. Cependant, ceci est à prendre avec des pincettes puisqu’il est possible de fixer un délai de temporisation pour chaque port et de continuer ou non le scan malgré une connexion timed-out.
Plus d’informations ici : Drop versus Reject.
Exemples de commande
Autoriser le ping sortant ainsi que la réponse (écho entrant) du destinataire.
iptables -A OUTPUT -p icmp -j ACCEPT iptables -A INPUT -p icmp -icmp-type echo-reply -j ACCEPT
Autoriser les requêtes vers le service DNS et les réponses
iptables -A OUTPUT -p udp --dport 53 -j ACCEPT iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
Afficher ce que contient la table filter
iptables -L -t filter
Afficher ce que contient la table NAT
iptables -L -t nat
Autoriser les connexions sortantes vers le HTTP, HTTPS et le retour
iptables -A OUTPUT -p tcp --dport 80 -j ACCEPT iptables -A OUTPUT -p tcp --dport 443 -j ACCEPT iptables -A INPUT -m stade --state RELATED,ESTABLISHED -j ACCEPT
Rejeter les paquets à destination du réseau 192.168.1.0/24
iptables -A OUTPUT -d 192.168.1.0/24 -j DROP
Autoriser une connexion SSH provenant du réseau 172.16.0.0/16
iptables -A INPUT -p tcp -s 172.16.0.0/16 --dport 22 -j ACCEPT
Fixer les politiques par défaut
Il s’agit de la politique par défaut quand rien ne « match ». On choisis dans ce cas-là de tout refuser.
iptables -P INPUT DROP iptables -P OUTPUT DROP iptables -P FORWARD DROP
IP Masquerade et routage
Avec l’IP Masquerade, les adresses privées utilisent toutes la même adresse publique. La translation se fait avec la chaîne POSTROUTING.
On active tout d’abord le routage entre les cartes :
echo > 1 /proc/sys/net/ipv4/ip_forward
On traduiras les adresses provenant du réseau 192.168.1.0/24 avec l’IP de l’interface eth1.
iptables -t nat -f POSTROUTING iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth1 -j MASQUERADE
Suppression d’une règle iptables
Voici la démarche à suivre pour la suppression d’une règle iptables précise.
Affichage des règles INPUT, OUTPUT et FORWARD avec numéro de lignes :
iptables -L --line-number
Si l’on souhaite au contraire afficher les tables PREROUTING et POSTROUTING avec toujours les numéros de lignes affichés :
iptables -L -t nat --line-number
On choisis de supprimer la ligne, en choisissant la table et le numéro de ligne concernés:
iptables -D [Table] [Numéro]
Je souhaite par exemple supprimer la ligne 6 de la table OUTPUT
iptables -D OUTPUT 6