Ceci est une ancienne révision du document !



Iptables

Iptables est une interface "ligne de commande" permettant de configurer Netfilter1).

il existe une autre interface plus récente : UFW, ainsi que 2 interfaces graphiques (gUFW et Firestarter).

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.

iptables existe aussi pour l'ipv6, pour cela il suffit d'utiliser la commande ip6tables au lieu de iptables

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
ATTENTION, si vous avez modifié la règle par defaut pour le blocage (iptables -P INPUT DROP voir plus bas) et que vous tapez iptables -F vous bloquerez tous les accès … y compris celui en cours …

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 -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

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
Si vous vous êtes servi de WebMin pour créer vos règles de bases. Le fichier à éditer pour vos règles de FireWall est /etc/iptables.up.rules

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.

Déplacez le script iptables dans /etc/init.d

sudo mv /emplacement/du/script/iptables /etc/init.d

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
Cette astuce n'est pas recommandable.

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
Ce script est juste un exemple, ce script peut-être utilisé pour une utilisation courante, il offre plutôt une bonne "protection".
#!/bin/bash
 
# Script iptables by BeAvEr.
 
## Règles iptables.
 
## On flush iptables.
 
/sbin/iptables -F
 
## On supprime toutes les chaînes utilisateurs.
 
/sbin/iptables -X
 
## On drop tout le trafic entrant.
 
/sbin/iptables -P INPUT DROP
 
## On drop tout le trafic sortant.
 
/sbin/iptables -P OUTPUT DROP
 
## On drop le forward.
 
/sbin/iptables -P FORWARD DROP
 
## On drop les scans XMAS et NULL.
 
/sbin/iptables -A INPUT -p tcp --tcp-flags FIN,URG,PSH FIN,URG,PSH -j DROP
 
/sbin/iptables -A INPUT -p tcp --tcp-flags ALL ALL -j DROP
 
/sbin/iptables -A INPUT -p tcp --tcp-flags ALL NONE -j DROP
 
/sbin/iptables -A INPUT -p tcp --tcp-flags SYN,RST SYN,RST -j DROP
 
## Dropper silencieusement tous les paquets broadcastés.
 
/sbin/iptables -A INPUT -m pkttype --pkt-type broadcast -j DROP
 
## Permettre à une connexion ouverte de recevoir du trafic en entrée.
 
/sbin/iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
 
## Permettre à une connexion ouverte de recevoir du trafic en sortie.
 
/sbin/iptables -A OUTPUT -m state ! --state INVALID -j ACCEPT
 
## On accepte la boucle locale en entrée.
 
/sbin/iptables -I INPUT -i lo -j ACCEPT
 
## On log les paquets en entrée.
 
/sbin/iptables -A INPUT -j LOG
 
## On log les paquets forward.
 
/sbin/iptables -A FORWARD -j LOG 
 
exit 0

La table FILTER permet de filtrer les paquets réseaux. Tout paquet entrant est analysé afin de déterminer sa source et sa destination, elle permet soit de : DROP, LOG, ACCEPT, REJECT, les paquets.

La table FILTER se compose de trois sortes de chaine:

INPUT, OUTPUT, FORWARD.

Input : Si le paquet est adressé au poste, il est confronté au filtre INPUT.

Output : Si le paquet sort du poste, il passera donc par la chaine OUTPUT.

Forward : Si une quelconque règle autorise le paquet à entrer, le paquet passera la barrière de INPUT, si il n'y a pas de règle spécifique qui autorise le paquet à entrer, et à condition qu'il soit actif (FORWARDÉ), la trame passera par le filtre FORWARD.

Input : Permet d'analyser les paquets entrants.

Output : Permet d'analyser les paquets sortants.

Forward : Permet d'analyser et d'autoriser les trames à passer d'une interface à une autre, seulement dans le cadre d'une interface réseau servant de passerelle. merci

La table NAT devrait être utilisée seulement pour faire de la translation d'ips (NAT). En clair elle ne devrait servir qu'à traduire le champ de l'ip source d'un paquet ou celui de l'ip destination.

La table NAT se compose de trois sortes de chaine:

PREROUTING, POSTROUTING, OUTPUT.

Prerouting (trafic entrant avant le routage) : Cette chaine permet de négocier les trames arrivant de l'extérieur avant qu'elles ne soient routées.

Postrouting (trafic sortant après le routage) : Cette chaine permet de négocier les trames après la décision du routage, juste avant que le paquet soit envoyé.

Output : Idem que PREROUTING, pour les connexions issues d'un processus du système, le trafic est généré par la machine locale avant le routage.

La table MANGLE sert à modifier des paquets.

La table MANGLE se compose de deux sortes de chaine:

PREROUTING & OUTPUT

Prerouting: Permet de modifier les trames entrantes avant qu'elles ne soient routées.

Output: Permet de modifier les trames locales avant leur re-routage vers leur destination.

Définition à peaufiner..
Le module iptable_raw doit être chargé.

La table Raw est utilisée pour placer des marques sur les paquets qui ne doivent pas être vérifiés par le système de traçage. Ceci est fait en utilisant la cible NOTRACK sur le paquet.

La table RAW se compose de deux sortes de chaine:

PREROUTING & OUTPUT.

À venir, dans un futur proche ;).
  • 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 (Création du script iptables et modification majeure de la documentation),maverick62.


1)
Netfilter est un module du noyau Linux qui offre la possibilité de contrôler, modifier et filtrer les paquets IP, et de suivre les connexions. Il fournit ainsi les fonctions de pare-feu, de partage de connexions internet et d'autorisation du trafic réseau.
  • iptables.1309433980.txt.gz
  • Dernière modification: Le 15/12/2011, 15:19
  • (modification externe)