Ceci est une ancienne révision du document !
Iptables
Iptables est une interface "ligne de commande" permettant de configurer Netfilter1).
Ce document contient les informations de base à propos de iptables, pour ceux qui souhaitent mettre en place un firewall et/ou un partage de connexion sans passer par une interface graphique. Les lecteurs désirant approfondir leur recherche trouveront des dizaines de tutoriels sur iptables & netfilter.
Firewall
Nous allons configurer notre firewall de la manière suivante :
- On bloque tout le trafic entrant par défaut.
- On autorise au cas par cas : le trafic appartenant ou lié à des connexions déjà établies et le trafic à destination des serveurs (web, ssh, etc.) que nous souhaitons mettre à disposition.
Afin de ne pas avoir de problème au moment où on crée ces règles, nous allons d'abord créer les autorisations, puis nous enverrons le reste en enfer.
En tapant « sudo iptables -L
», une liste de vos règles actuelles est affichée. Si vous (ou un logiciel) n'avez encore jamais touché à iptables, les chaines sont vides, et vous devriez voir :
Chain INPUT (policy ACCEPT) target prot opt source destination Chain FORWARD (policy ACCEPT) target prot opt source destination Chain OUTPUT (policy ACCEPT) target prot opt source destination
Pour l'instant, tout passe dans toutes les directions (policy ACCEPT). Pour cette configuration basique, seul le trafic entrant (chaine input) nous intéresse.
Si vous avez déjà modifié la configuration et que vous voulez la réinitialiser, tapez :
sudo iptables -F sudo iptables -X
Autoriser le trafic entrant d'une connexion déjà établie
Pour permettre à une connexion déjà ouverte de recevoir du trafic :
# iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
Permettre le trafic entrant sur un port spécifique
Pour permettre le trafic entrant sur le port 22 (traditionnellement utilisé par SSH, vous devrez indiquer à iptables tout le trafic TCP sur le port 22 de votre adaptateur réseau.
# iptables -A INPUT -p tcp -i eth0 --dport ssh -j ACCEPT
Cette commande ajoute une règle (-A
) à la chaine contrôlant le trafic entrant INPUT, pour autoriser le trafic (-j ACCEPT
), vers l'interface (-i
) eth0 et à destination du port (--dport
) SSH (on aurait pu mettre 22).
Maintenant vous pouvez vérifier vos règles iptables :
# iptables -L Chain INPUT (policy ACCEPT) target prot opt source destination ACCEPT all -- anywhere anywhere state RELATED,ESTABLISHED ACCEPT tcp -- anywhere anywhere tcp dpt:ssh
Maintenant, acceptons tout le trafic web (www
) entrant :
# iptables -A INPUT -p tcp -i eth0 --dport 80 -j ACCEPT
En regardant nos règles, nous avons :
# iptables -L Chain INPUT (policy ACCEPT) target prot opt source destination ACCEPT all -- anywhere anywhere state RELATED,ESTABLISHED ACCEPT tcp -- anywhere anywhere tcp dpt:ssh ACCEPT tcp -- anywhere anywhere tcp dpt:www
Nous avons exceptionnellement autorisé le trafic tcp pour ssh et les ports web, mais comme nous n'avons rien bloqué, tout le trafic passe quand même.
Bloquer le trafic
Maintenant que nous avons fini avec les autorisations, il faut maintenant bloquer le reste. Nous allons en fait modifier la « politique par défaut » (policy) de la chaine INPUT : cette décision (DROP) s'applique lorsqu'aucune règle n'a été appliquée à un paquet. Donc, si la tentative de connexion n'est permise par aucune des règles précédentes, elle sera rejetée.
# iptables -P INPUT DROP # iptables -L Chain INPUT (policy DROP) target prot opt source destination ACCEPT all -- anywhere anywhere state RELATED,ESTABLISHED ACCEPT tcp -- anywhere anywhere tcp dpt:ssh ACCEPT tcp -- anywhere anywhere tcp dpt:www
Un autre moyen de procéder est l'ajout en fin de chaine d'une règle supprimant les paquets (les paquets autorisés par les règles précédentes n'atteindraient pas celle-ci), via iptables -A INPUT -j DROP
, mais il faudrait alors faire attention à la position des futures règles.
Autoriser le trafic local
Un p'tit problème de notre configuration est que même l'interface locale (loopback) est bloquée.
Nous pourrions avoir écrit les règles de rejet seulement pour eth0 en spécifiant -i eth0
, mais nous pouvons aussi ajouter une règle pour loopback. Par exemple, nous pourrions l'insérer en 2e position :
# iptables -I INPUT 2 -i lo -j ACCEPT
Pour lister les règles plus en détail.
# iptables -L -v -n
Autoriser les requêtes ICMP (ping)
Il peut-être utile de valider les réponses aux requêtes "ping", ne serait-ce que pour s'assurer que le poste est toujours en activité.
# On autorise le PC a faire des pings sur des IP externes et à répondre aux requêtes "ping" iptables -A OUTPUT -p icmp -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT # On autorise les pings iptables -A INPUT -p icmp -j ACCEPT
Supprimer une règle
Si vous vous êtes trompé dans la création d'une règle et que cela vous bloque une connexion, vous pouvez supprimer une seule entrée plutôt que de tout réinitialiser.
Tout d'abord vous listez l'ensemble de vos régles avec l'affichage des lignes :
iptables -L --line-numbers
Ce qui personnellement me retourne :
Chain INPUT (policy DROP) num target prot opt source destination 1 DROP icmp -- anywhere anywhere 2 ACCEPT tcp -- anywhere anywhere tcp dpt:ssh 3 ACCEPT tcp -- anywhere anywhere tcp dpt:www 4 ACCEPT tcp -- anywhere anywhere tcp dpt:webmin Chain FORWARD (policy ACCEPT) num target prot opt source destination Chain OUTPUT (policy ACCEPT) num target prot opt source destination 1 ACCEPT tcp -- anywhere anywhere tcp spt:www 2 ACCEPT tcp -- anywhere anywhere tcp spt:12345
Je souhaite supprimer la ligne 2 de la chaine OUTPUT
Syntaxe : iptables -D chaine numéro_de_ligne
iptables -D OUTPUT 2
Appliquer les règles au démarrage
Vous avez testé vos règles, ça marche au poil, alors il reste à les appliquer au démarrage.
Commencez par éditer un fichier en root, que vous enregistrerez sous /etc/init.d/monIptables. La première ligne de ce fichier doit être :
#!/bin/bash
Cette ligne indique que le fichier doit être enregistré en tant que script bash.
Le reste du fichier doit contenir les commandes iptables que vous avez générées.
Rendez ce script exécutable :
sudo chmod +x /etc/init.d/monIptables
Pour indiquer à votre ordinateur de l'utiliser au démarrage, 2 solutions :
sudo update-rc.d monIptables defaults
OU alors, rajoutez dans le fichier /etc/rc.local la ligne :
/etc/init.d/monIptables
juste avant exit 0.
Ça devrait être bon. Au prochain redémarrage, vous pouvez vérifier que vos règles sont bien utilisées, en effectuant :
sudo iptables -L
Script iptables
#!/bin/bash # Script iptables by ... . ## Règles iptables. /sbin/iptables -F /sbin/iptables -X /sbin/iptables -P INPUT DROP /sbin/iptables -P OUTPUT DROP /sbin/iptables -P FORWARD DROP /sbin/iptables -P PREROUTING DROP /sbin/iptables -A OUTPUT -m state --state ! INVALID -j ACCEPT /sbin/iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT /sbin/iptables -I INPUT 2 -i lo -j ACCEPT /sbin/iptables -A INPUT -j LOG /sbin/iptables -A ICMP -j LOG /sbin/iptables -A FORWARD -j LOG /sbin/iptables -A PREROUTING -j LOG exit 0
Informations supplémentaires
En anglais :
En Français :
Sources
- Merci à Rusty Russell et son How-To, il est la base de cette page.
- Et merci surtout pour son travail au sein de l'équipe de développement de Netfilter.
Contributeurs : Kmeleon, eks,BeAvEr,maverick62.