Utilisation d’Iptables

Netfilter est une structure implémentant un pare-feu au sein du noyau linux. Il est utilisé à des fins d’interception et de manipulation de paquets réseau lors de réception et/ou d’émission de données réseau.

C’est un ensemble de fonctionnalités de filtrage de paquets réseau et se place entre la couche réseau du noyau et la couche applicative et supporte les protocoles IPv4, IPv6 (que nous aborderons dans ce document), DECnet et ARP.

Puisque Netfilter est implanté directement dans le noyau, il convient d’utiliser un programme en espace utilisateur.

Dans ce document, nous observerons l’utilisation d’iptables.

Vue générale de Netfilter

Netfilter peut intervenir en plusieurs endroits du système de gestion de la pile IP.
Pour chacune de ces étapes, Netfilter peut :

  • Imposer au noyau de supprimer le paquet,
  • Indiquer au noyau que le paquet est accepté
  • Modifier le paquet et le rendre au noyau
AccrocheChaîneDescription
NF_IP_PRE_ROUTINGPREROUTINGA ce stade, le paquet est brut. Il n’a subi aucune modification par rapport à ce que l’interface réseau a reçu.
NF_IP_LOCAL_ININPUTSi le paquet est destiné à la machine qui le reçoit, netfilter transmet aux processus locaux du serveur.
NF_IP_FORWARDFORWARDTout paquet qui transite d’une interface à une autre, sans interagir sur les processus du serveur local sera traité par cette chaîne.
NF_IP_LOCAL_OUTOUTPUTLe(s) paquet(s) vien(nen)t de sortir du serveur pare-feu en direction de la machine destinataire (qu’ils aient été générés par le pare-feu ou seulement transmis).
NF_IP_POSTROUTINGPOSTROUTINGA ce stade, les paquets sont prêts à être envoyés sur l’interface réseau.

Les tables

Une table permet de définir un comportement de Netfilter. C’est un ensemble de chaînes, composées de règles. Il existe cinq tables : Filter, NAT, Mangle, raw et security. D’autres peuvent être ajoutées ultérieurement.

La table FILTER

Cette table sert à filtrer ou trier les paquets réseau et à supprimer ceux qui pourraient être indésirables. Pour cela, la table utilise 3 chaines :

  • INPUT: Contrôle des paquets entrant
  • OUTPUT: Analyse les paquets sortant
  • FORWARD: Filtre les paquets qui passent d’une interface à une autre

La table NAT

Cette table sert à traduire des adresses réseau permettant de faire correspondre des adresses IP, non routables depuis l’extérieur, à une adresse, ou un ensemble d’adresses, uniques et routables.
Cela permet, par exemple, de faire correspondre une seule adresse externe à toutes les adresses d’un réseau privé.

Le SNAT est utilisé pour substituer à une adresse d’origine d’un paquet une autre adresse. Dans l’exemple ci-dessous, nous substituons l’adresse IP privée d’origine d’une station de travail, derrière un pare-feu, à une adresse IP publique.
La commande est :

iptables –t NAT –A POSTROUTING –p tcp –o [interface réseau] –J [cible] --to-source [adresse IP externe]

IPtables SNAT
La commande à saisir est :

iptables –t NAT –A POSTROUTING –p tcp –o [interface réseau] –J [cible] --to-destination [adresse IP du serveur cible]

Le DNAT est utilisé pour rediriger des paquets provenant d’une adresse réseau publique vers une adresse réseau privé, sans tenir compte du port. Dans l’exemple ci-dessous, nous avons un serveur web derrière un pare-feu devant être accessible depuis internet.La commande est :

iptables –t NAT –A POSTROUTING –p tcp –o [interface réseau] –J [cible] --to-destination [adresse IP du serveur cible]

IPtables DNAT
Ici la commande à saisir est :

 iptables –t NAT –A POSTROUTING –p tcp –o eth0 –j DNAT --to-destination 192.168.100.30
Outre le SNAT et le DNAT, la table NAT peut aussi accueillir des règles d’IP MASQUERADING. Celle-ci s’emploie de la même manière que le SNAT mais pour de la translation de ports et non d’adresses.
Exemple de commande (port):

 iptables -t NAT -A POSTROUTING -p TCP -j MASQUERADE --to-ports 80

Exemple de commande (plage de ports):

 iptables -t NAT -A POSTROUTING -p TCP -j MASQUERADE --to-ports 6000:6010

Pour en revenir à la définition d’une table NAT à l’aide des différentes techniques abordées ci-dessus, vous pouvez avoir recours aux 3 chaînes suivantes :

  • PREROUTING: Les paquets sont modifiés à l’entrée de la pile réseau
  • OUTPUT: Les paquets sortant sont modifiés
  • POSTROUTING: Les paquets prêts à être envoyés aux interfaces réseau sont modifiés

La table MANGLE

La table MANGLE est utile dans le cas de configurations avancées pour marquer des paquets passant par l’interface que l’on surveille selon des critères définis.

×
Avertissement : Ne pas utiliser cette table pour du filtrage, du DNAT, du SNAT ou du masquerading.
Pour plus d’informations sur cette table, nous vous suggérons de consulter la documentation suivante :
http://www.inetdoc.net/guides/iptables-tutorial/mangletable.htm

Les règles

Bases de la commande iptables

Chaque règle est une ligne lue par le noyau pour en déduire ce qu’il convient de faire d’un paquet. Si tous les critères – ou les correspondances – sont remplis, on exécute l’instruction donnée par la cible – ou le saut. Normalement, on écrit les règles dans une syntaxe qui ressemble à celle-ci :

 iptables [-t table] commande [correspondance] [cible/saut]
×
Avertissement : Avertissement : Par défaut, la table utilisée par la commande iptables sera toujours FILTER et rien ne l’oblige à indiquer l’instruction de cible en fin de ligne. La commande devrait toujours être en première position, ou à la rigueur, juste après la spécification de table.
La correspondance est la partie de la règle qui est envoyée au noyau pour identifier la caractéristique particulière du paquet.

Commandes

Cette section expose les commandes les plus utiles et ce qu’elles permettent de réaliser.
La commande signifie à iptables ce qu’il faut faire du reste de la règle qui est envoyée à l’interpréteur. Typiquement, il s’agit soit d’ajouter, soit d’effacer quelque-chose dans une table quelconque.

Les commandes suivantes sont disponibles pour iptables :

CommandeDescription
-A
–Append
Cette commande ajoute une règle à la fin d’une chaîne. La règle sera donc placée en dernière position dans la table de règles, et par conséquent vérifiée en dernier, sauf si des règles supplémentaires sont ajutées par la suite.
exemple :iptables –A INPUT –-dport 80 –j DROP
-D
–delete
Cette commande supprime une règle dans une chaîne. Il existe deux moyens de le faire; soit en précisant la règle complète (comme dans le premier exemple), soit en indiquant le numéro de la règle que vous visez.
exemple :iptables –D INPUT –-dport 80 –j DROP
-I
–insert
Cette commande insère une règle quelque-part dans une chaîne. La règle est insérée à l’emplacement donné par le numéro spécifié.
exemple :iptables –I INPUT 1 –-dport 80 –j ACCEPT
-L
–list
Cette commande dresse la liste des entrées de la chaîne donnée (PREROUTING, INPUT, OUTPUT, FORWARD, POSTROUTING).
exemple :iptables –L INPUT
-F
–flush
Cette commande vide la chaîne donnée de toutes ses règles.
exemple :iptables –F INPUT
-P
–policy
Cette commande indique au noyau de configurer une cible par défaut – ou une stratégie – sur une chaîne. Ceci conditionne le comportement par défaut de la chaîne.
Les seules cibles autorisées sont ACCEPT et DROP
exemple :iptables –P INPUT DROP

Options

Ce document n’ayant pas pour objectif de remplacer la page de man d’iptables, nous ne détaillerons pas toutes les options mais seulement les plus utiles.

Pour le reste, nous vous suggérons de consulter la documentation disponible ici.

OptionExplication
-i
–in-interface
Cette option est destinée à sélectionner les paquets issus d’une certaine interface. Cette option n’est autorisée que dans les chaînes INPUT, FORWARD et PREROUTING, et qu’elle retourne une erreur si elle est utilisée ailleurs.
exemple :iptables –A INPUT –i eth0
-p
–protocol
Cette correspondance permet de vérifier le type de protocole, par exemple TCP, UDP ou ICMP. De plus, le protocole doit nécessairement être l’un de ceux définis de manière interne (TCP, UDP ou ICMP), ou bien prendre une valeur existante dans le fichier /etc/protocols, et dans le cas contraire retourner une erreur. Le protocole peut aussi être entré sous forme d’un nombre entier.
Enfin, le protocole peut aussi prendre la valeur ALL, correspondant à tous les protocoles tcp, udp et icmp. La commande accepte aussi une liste de protocoles séparés par des virgules.
exemples :iptables -A INPUT -p tcp
iptables -A INPUT -p tcp,udp
iptables -A INPUT -p all
-j
–jump
Indique à la règle quelle action à effectuer sur tel ou tel paquet.
Plusieurs actions sont disponibles, les actions de bases sont ACCEPT, DROP et REJECT. Les actions avancées sont DNAT, SNAT (que nous avons abordé plus haut) et ULOG.
La cible ACCEPT permet d’autoriser le trafic des paquets vers une interface et un port spécifique.
La cible DROP bloque les paquet et les supprime. Cette politique peut s’appliquer sur tout types de paquet si rien n’est précisé.
La cible REJECT, tout comme la cible DROP, bloque les paquets et les supprime tout en envoyant un message d’erreur ICMP « port unreachable » (contrairement à DROP).
La cible ULOG est une méthode permettant de journaliser les paquets.
exemples :iptables -A INPUT -p tcp -i eth0 –dport ssh -j ACCEPT
→ Autorise le tafic ssh sur l’interface eth0
iptables -A INPUT -p tcp -i eth0 –dport 80 -j ACCEPT
→ Autorise le trafic sur le port 80 sur l’interface eth0iptables -P INPUT DROP
→ Supprimer tout trafic – attention, si une connexion ssh n’est pas permise dans les règles précédentes, il ne sera plus possible de se connecter au serveur.iptables -A INPUT -j REJECT –reject-with icmp-host-prohibited
→ Cette règle va rejeter les paquets « icmp host prohibited » destinés au pare-feu.iptables -t filter -A INPUT -p all -j ULOG –ulog-prefix=DefaultDrop
→ Cette règle va permettre de journaliser tout ce qui va être supprimé par la chaîne « INPUT »
×
Avertissement : Ne surtout pas oublier que les règles que l’on ajoute à iptables sont éphémères. Dès le redémarrage du serveur, celles-ci auront disparues.

Pour remédier à ce contexte, la commande suivante permettra de sauvegarder la configuration établie dans un fichier :

  • Sur Debian:
    iptables-save > /etc/iptables/rules.v4
  • Sur CentOS:
    iptables-save > /etc/sysconfig/iptables
  • Sur Ubuntu (12.04 et +) le paquet iptables-persistent permet de sauvegarder les règles dans le fichier rules.v4 (pour les règles IPv4) et rules.v6 (pour les règles IPv6) grâce à la commande suivante :
    iptables-persistent save

De plus le même paquet peut prendre deux autres arguments :

  • Pour vider les règles:
     iptables-persistent flush
  • Pour les recharger:
     iptables-persistent reload

Pour une configuration avancée de votre pare-feu, nous vous suggérons plusieurs documentations :

Retrouvez l’intégralité de cet article et bien plus encore sur notre base de connaissances.

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Copyright © 2014 Aruba.