IPTABLES(8) iptables 1.8.10 IPTABLES(8)

iptables/ip6tables — Outil d'administration pour le filtrage et le NAT des paquets IPv4/IPv6

iptables [-t table] {-A|-C|-D|-V} chaine spécification_de_règle

ip6tables [-t table] {-A|-C|-D|-V} chaine spécification_de_règle

iptables [-t table] -I chaine [numéro_de_règle] spécification_de_règle

iptables [-t table] -R chaine numéro_de_règle spécification_de_règle

iptables [-t table] -D chaine numéro_de_règle

iptables [-t table] -S [chaine [numéro_de_règle]]

iptables [-t table] {-F|-L|-Z} [chaine [numéro_de_règle]] [options...]

iptables [-t table] -N chaine

iptables [-t table] -X [chaine]

iptables [-t table] -P chaine cible

iptables [-t table] -E ancienne_chaine nouvelle_chaine

spécification_de_règle = [correspondances...] [cible]

correspondance = -m nom_correspondance [options_par_correspondance]

cible = -j nom_cible [options_par_cible]

Iptables et ip6tables permettent de définir, entretenir et inspecter les tables de règles de filtrage des paquets IPv4 et IPv6 dans le noyau Linux. Plusieurs tables peuvent être définies. Chaque table contient des chaines prédéfinies, mais peut aussi contenir des chaines définies par l'utilisateur.

Chaque chaine est une liste de règles qui peuvent s'appliquer à un ensemble de paquets. Chaque règle spécifie quoi faire d'un paquet qui correspond. Cette action que l'on nomme « cible » peut être un saut vers une chaine définie par l'utilisateur dans la même table.

Une règle de pare-feu spécifie des critères pour un paquet et une cible. Si un paquet ne correspond pas, la règle suivante dans la chaine est examinée ; s'il correspond, la règle suivante est spécifiée par la valeur de la cible qui peut être le nom d'une chaine définie par l'utilisateur, une des cibles décrites dans iptables-extensions(8) ou une des valeurs spéciales ACCEPT, DROP ou RETURN.

ACCEPT signifie que le paquet peut passer. DROP signifie que le paquet doit être rejeté. RETURN signifie que l'on doit arrêter de parcourir cette chaine et reprendre à la règle suivante de la chaine précédente (appelante). Si la fin d'une chaine prédéfinie est atteinte ou si une règle d'une chaine prédéfinie ayant pour cible RETURN s'applique, la cible par défaut de la chaine déterminera le sort du paquet.

Il existe actuellement cinq tables indépendantes (la liste des tables présentes à tout moment dépend des options de configuration du noyau et de la liste des modules présents).

Cette option spécifie la table de correspondance des paquets sur laquelle la commande doit opérer. Si le noyau est configuré pour charger les modules automatiquement, il tentera de charger le module approprié à cette table, s'il ne l'est pas déjà.

Les tables sont les suivantes :

Il s'agit de la table par défaut (dans le cas où aucune option -t n'est spécifiée). Elle contient les chaines prédéfinies INPUT (pour les paquets destinés aux sockets locaux), FORWARD (pour les paquets routés par la machine) et OUTPUT (pour les paquets générés localement).
Cette table est consultée quand arrive un paquet qui crée une nouvelle connexion. Elle comporte quatre chaines prédéfinies : PREROUTING (pour modifier les paquets dès leur entrée), INPUT (pour modifier les paquets destinés aux sockets locaux), OUTPUT (pour modifier les paquets générés localement avant leur routage) et POSTROUTING (pour modifier les paquets lorsqu'ils sont sur le point de sortir). Le NAT IPv6 est pris en charge depuis la version 3.7 du noyau.
Cette table est utilisée pour une modification spécialisée des paquets. Jusqu'à la version 2.4.17 du noyau, elle comportait deux chaines prédéfinies : PREROUTING (pour la modification des paquets entrants avant leur routage) et OUTPUT (pour la modification des paquets générés localement avant leur routage). Depuis la version 2.4.18, trois autres chaines prédéfinies sont prises en charge : INPUT (pour les paquets entrant dans la machine elle-même), FORWARD (pour la modification des paquets routés à travers la machine) et POSTROUTING (pour modifier les paquets lorsqu'ils sont sur le point de sortir).
Cette table est principalement utilisée pour configurer les exemptions de suivi de connexion en combinaison avec la cible NOTRACK. Elle s'enregistre aux accroches netfilter avec une priorité supérieure et est ainsi appelée avant ip_conntrack ou toute autre table IP. Elle comporte les chaines prédéfinies suivantes : PREROUTING (pour les paquets arrivant par toute interface réseau) et OUTPUT (pour les paquets générés par des processus locaux).
Cette table est utilisée pour les règles Mandatory Access Control (MAC), comme celles qui sont activées par les cibles SECMARK et CONNSECMARK. Mandatory Access Control est implémenté par les modules de sécurité Linux comme SELinux. La table security est appelée après la table filter, ce qui permet à toute règle Discretionary Access Control (DAC) de la table filter de prendre effet avant les règles MAC. Elle comporte les chaines prédéfinies suivantes : INPUT (pour les paquets entrant dans la machine elle-même), OUTPUT (pour la modification des paquets générés localement avant leur routage) et FORWARD (pour la modification des paquets routés à travers la machine).

Les options reconnues par iptables et ip6tables peuvent être réparties en plusieurs groupes.

Ces options spécifient l'action à exécuter. Sauf indications contraires précisées plus loin, la ligne de commande ne peut comporter qu'une seule de ces options. Pour les versions longues des noms de commande et d'option, il vous suffit de préciser suffisamment de lettres pour être sûr qu'iptables puisse les différencier des autres commandes et options.

Ajouter une ou plusieurs règles à la fin de la chaine indiquée. Lorsque les noms de source et/ou destination se résolvent en plusieurs adresses, une règle sera ajoutée pour chaque combinaison d'adresses possible.
Vérifier si une règle correspondant à la spécification existe dans la chaine indiquée. Cette commande utilise la même logique que -D pour trouver une entrée qui correspond, mais ne modifie pas la configuration d'iptables existante et utilise son code de retour pour indiquer un succès ou un échec.
Supprimer une ou plusieurs règles de la chaine indiquée. Il existe deux versions de cette commande : la règle peut être référencée par son numéro dans la chaine (en commençant par 1 pour la première règle) ou par une correspondance avec une certaine règle.
Insérer une ou plusieurs règles dans la chaine indiquée avec le numéro de règle donné. Ainsi, si le numéro donné est 1, la(les) règle(s) sont insérées en tête de chaine. Il s'agit d'ailleurs du comportement par défaut si aucun numéro de règle n'est donné.
Remplacer une règle dans la chaine indiquée. Si les noms de source et/ou de destination se résolvent en plusieurs adresses, la commande échouera. Les règles sont numérotées à partir de 1.
Lister toutes les règles de la chaine indiquée. Si aucune chaine n'est indiquée, toutes les chaines sont listées. Cette commande, comme toutes les autres commandes d'iptables, s'applique à la table indiquée (la table par défaut est filter) ; ainsi, les règles de NAT peuvent être listées par
 iptables -t nat -n -L
Veuillez noter que cette option est souvent utilisée en combinaison avec l'option -n afin d'éviter de longues recherches DNS inverses. On peut aussi spécifier l'option -Z (zéro), auquel cas la(les) chaine(s) seront automatiquement listées puis mises à zéro. La sortie exacte dépend des autres options spécifiées. Les règles exactes sont supprimées à moins que vous n'utilisiez
 iptables -L -v
ou iptables-save(8).
Afficher toutes les règles de la chaine indiquée. Si aucune chaine n'est indiquée, toutes les chaines sont affichées comme avec iptables-save. Cette commande, comme toutes les autres commandes d'iptables, s'applique à la table indiquée (la table par défaut est filter).
Vider la chaine indiquée (ou toutes les chaines de la table si aucune chaine n'est indiquée). Cette option produit le même effet qu'un effacement de toutes les règles une par une.
Remettre à zéro les compteurs de paquets et d'octets de toutes les chaines, ou seulement de la chaine indiquée, ou seulement de la règle indiquée dans une chaine donnée. On peut aussi ajouter l'option -L, --list (list) pour voir les compteurs juste avant leur réinitialisation (voir plus haut).
Créer une nouvelle chaine définie par l'utilisateur avec le nom donné. Il ne doit pas exister de cible avec le même nom.
Supprimer la chaine indiquée. Il ne doit pas exister de références à cette chaine. S'il en existe, vous devez supprimer ou remplacer les règles contenant ces références pour que la chaine puisse être supprimée. La chaine doit être vide, autrement dit ne contenir aucune règle. Si aucune chaine n'est indiquée, cette option va supprimer toutes les chaines vides de la table. Les chaines prédéfinies vides ne peuvent être supprimées qu'à l'aide de iptables-nft.
Définir l'action par défaut de la chaine prédéfinie (non définie par l'utilisateur) avec la cible donnée. La cible de l'action par défaut est soit ACCEPT, soit DROP.
Renommer la chaine spécifiée avec le nouveau nom donné. Cette action est cosmétique et n'a aucun effet sur la structure de la table.
Afficher l'aide. Donner une description (actuellement très brève) de la syntaxe de la commande.

Les paramètres suivants complètent l'énoncé d'une règle (lorsqu'ils sont utilisés dans une des commandes add, delete, insert, replace et append).

-4, --ipv4
Ce paramètre n'a aucun effet avec iptables et iptables-restore. Si une règle utilisant le paramètre -4 est insérée à l'aide de (et seulement de) ip6tables-restore, elle sera ignorée silencieusement. Toutes les autres utilisations provoqueront une erreur. Ce paramètre permet d'inscrire des règles IPv4 et IPv6 dans un seul fichier de règles à utiliser avec iptables-restore et ip6tables-restore.
-6, --ipv6
Si une règle utilisant le paramètre -6 est insérée à l'aide de (et seulement de) iptables-restore, elle sera ignorée silencieusement. Toutes les autres utilisations provoqueront une erreur. Ce paramètre permet d'inscrire des règles IPv4 et IPv6 dans un seul fichier de règles à utiliser avec iptables-restore et ip6tables-restore. Ce paramètre n'a aucun effet avec ip6tables et ip6tables-restore.
[!] -p, --protocol protocole
Le protocole de la règle ou du paquet à vérifier. Le protocole spécifié peut être tcp, udp, udplite, icmp, icmpv6, esp, ah, sctp, mh, ou le mot-clé spécial « all », ou une valeur numérique représentant un des protocoles précités ou un protocole différent. Un nom de protocole issu de /etc/protocols est aussi autorisé. Un argument « ! » avant le protocole inverse le test. Le nombre zéro est équivalent à all. « all » correspond à tous les protocoles et c'est la valeur du paramètre par défaut si ce dernier est omis. Notez que dans ip6tables, à l'exception de esp, les en-têtes d'extensions IPv6 ne sont pas autorisés. esp et ipv6-nonext peuvent être utilisés à partir de la version 2.6.11 du noyau. Le nombre zéro est équivalent à all, ce qui implique que vous ne pouvez pas tester le champ protocole pour la valeur 0 directement. Pour rechercher une correspondance avec un en-tête HBH, même s'il s'agissait du dernier, vous ne pouvez pas utiliser -p 0 ; vous devrez toujours utiliser -m hbh.
[!] -s, --source adresse[/masque][,...]
Spécifier la source. Address peut être un nom de réseau, un nom d'hôte, une adresse réseau IP (avec /mask) ou une adresse IP complète. Les noms d'hôtes ne seront résolus qu'une seule fois avant que la règle ne soit soumise au noyau. Notez que spécifier un nom devant être résolu à distance, par exemple par DNS, est vraiment une mauvaise idée. mask peut être soit un masque réseau ipv4 (pour iptables), soit un nombre indiquant le nombre de bits à 1 en partant de la gauche du masque réseau. Ainsi, un masque iptables de 24 est équivalent à 255.255.255.0. Un argument « ! » avant la spécification de l'adresse inverse les critères de sélection de cette adresse. --src est un alias pour ce paramètre. On peut spécifier plusieurs adresses, mais cela entraînera la création de plusieurs règles (lors d'un ajout avec -A) ou la suppression de plusieurs règles (avec -D).
[!] -d, --destination adresse[/masque][,...]
Spécifier la destination. Voir la description du paramètre -s (source) pour une description détaillée de la syntaxe. --dst est un alias pour ce paramètre.
Spécifier une correspondance à utiliser, c'est-à-dire un module d'extension qui vérifie une propriété spécifique. L'ensemble de correspondances constitue la condition à laquelle une cible sera invoquée. Les correspondances sont évaluées de la première à la dernière selon leurs spécifications dans la ligne de commande et travaillent en mode court-circuit ; c'est-à-dire que si l'une d'entre elles a pour résultat « faux », l'évaluation s'arrête.
Spécifier la cible de la règle ; c'est-à-dire quoi faire si le paquet correspond aux critères de sélection. La cible peut être une chaine définie par l'utilisateur (différente de celle dans laquelle se trouve la règle), une des cibles prédéfinies spéciales qui décident du sort du paquet immédiatement ou une extension (voir plus loin EXTENSIONS DE CORRESPONDANCE ET DE CIBLE). Si ce paramètre est omis pour une règle (et si -g n'est pas utilisé), la recherche de correspondance de la règle au paquet n'aura aucun effet sur le sort de ce dernier, mais les compteurs de la règle seront incrémentés.
Spécifier que le traitement doit continuer dans la chaine donnée. Contrairement à l'utilisation de l'option --jump, RETURN ne poursuivra pas le traitement dans cette chaine, mais plutôt dans la chaine qui nous a appelé à l'aide de --jump.
[!] -i, --in-interface nom
Le nom de l'interface sur laquelle le paquet a été reçu (seulement pour les paquets qui entrent dans les chaines INPUT, FORWARD ou PREROUTING). Si l'argument « ! » précède le nom de l'interface, le critère de sélection sera inversé. Si le nom de l'interface se termine par un « + », toute interface qui commence par ce nom correspondra. Si ce paramètre est omis, toute interface correspondra.
[!] -o, --out-interface nom
Le nom de l'interface par laquelle le paquet est sur le point d'être envoyé (seulement pour les paquets entrant dans les chaines FORWARD, OUTPUT ou POSTROUTING). Si l'argument « ! » précède le nom de l'interface, le critère de sélection sera inversé. Si le nom de l'interface se termine par un « + », toute interface qui commence par ce nom correspondra. Si ce paramètre est omis, toute interface correspondra.
[!] -f, --fragment
Spécifier ce paramètre signifie que la règle ne fait référence qu'au second fragment IPv4 et les suivants des paquets fragmentés. Comme il n'y a aucun moyen de déterminer les ports source ou destination d'un tel paquet (ou le type ICMP), ce paquet ne correspondra à aucune règle qui spécifie des ports. Si l'argument « ! » précède le symbole « -f », la règle ne recherchera de correspondance qu'avec les fragments d'en-tête ou les paquets non fragmentés. Ce paramètre est spécifique à IPv4 et n'est pas disponible dans ip6tables.
Ce paramètre permet à l'administrateur d'initialiser les compteurs de paquets et d'octets d'une règle (au cours des opérations INSERT, APPEND et REPLACE).

Les options supplémentaires suivantes peuvent être spécifiées :

Affichage détaillé. Avec cette option, la commande list affiche le nom de l'interface, les options des règles (s'il y en a) et les masques TOS (Type Of Service). Les compteurs de paquets et d'octets sont aussi affichés avec le suffixe « K », « M » ou « G » pour les multiplicateurs 1 000, 1 000 000 et 1 000 000 000, respectivement (voir cependant le drapeau -x pour modifier cela). Dans le cas d'un ajout, d'une insertion, d'une suppression ou d'un remplacement, cette option provoque l'affichage d'informations détaillées à propos de la ou les règle(s). -v peut aussi être spécifiée plusieurs fois pour éventuellement afficher des instructions de débogage plus détaillées : si elle est spécifiée deux fois, iptables-legacy affichera les informations et les entrées de la table dans le style libiptc, et iptables-nft affichera les règles dans le style netlink (code VM) ; si elle est spécifiée trois fois, iptables-nft affichera aussi tout message netlink envoyé au noyau.
Afficher la version du programme et l'API du noyau utilisée.
Attendre le verrouillage de xtables. Pour prévenir l'exécution simultanée de plusieurs instances du programme, ce dernier va tenter d'obtenir un verrouillage exclusif à son lancement. Par défaut, le programme s'arrêtera s'il ne peut pas obtenir le verrouillage. Avec cette option, le programme attendra (indéfiniment ou pendant une durée définie par l'argument facultatif secondes) jusqu'à ce qu'il obtienne le verrouillage exclusif.
Afficher les informations sous forme numérique. Les adresses IP et les numéros de port seront affichés au format numérique. Par défaut, le programme tente de les afficher sous la forme de nom d'hôte, de nom de réseau ou de service (lorsque c'est possible).
Afficher les nombres sous forme étendue. Afficher la valeur exacte des compteurs de paquets et d'octets au lieu de leur valeur arrondie au Ko (multiple de 1000), au Mo (multiple de 1000K) ou au Go (multiple de 1000M). Cette option n'est pertinente que pour la commande -L.
Lors de l'affichage des règles, ajouter, au début de chacune d'entre elles, les numéros de ligne qui correspondent à la position de la règle dans la chaine.
Lors de l'ajout ou de l'insertion de règles dans une chaine, utiliser commande pour charger tout module nécessaire (cibles, extensions de correspondance, etc.).

iptables utilise le fichier /run/xtables.lock pour obtenir un verrouillage exclusif à son lancement.

On peut utiliser la variable d'environnement XTABLES_LOCKFILE pour modifier le comportement par défaut.

iptables peut utiliser des versions étendues des recherches de correspondance de paquets et des modules de cibles. Une liste de ces extensions est disponible dans la page de manuel iptables-extensions(8).

Différents messages d'erreur peuvent s'afficher sur la sortie d'erreur standard. Le code de retour de 0 indique un fonctionnement correct. Les erreurs qui semblent être causées par des paramètres de la ligne de commande non valables ou non pertinents génèrent un code de retour de 2. Les erreurs qui indiquent une incompatibilité entre le noyau et l'espace utilisateur génèrent un code de retour de 3. Les erreurs qui indiquent un problème de ressource, comme un verrou occupé, un échec d'allocation de mémoire ou des messages d'erreur du noyau génèrent un code de retour de 4. Enfin, les autres erreurs génèrent un code de retour de 1.

Des bogues ? Qu'est-ce que c'est ? ;-) Ok, vous devriez jeter un coup d'œil à https://bugzilla.netfilter.org/. iptables s'arrêtera avec un code d'erreur de 111 s'il voit qu'il a été appelé en tant que programme setuid-to-root. iptables ne peut pas être utilisé en toute sécurité de cette manière, car il fait confiance aux bibliothèques partagées (correspondances, cibles) chargées à l'exécution ; le chemin de recherche peut être défini en utilisant des variables d'environnement.

iptables est très similaire à ipchains de Rusty Russell. La principale différence réside dans le fait que les chaines INPUT et OUTPUT ne sont parcourues que par les paquets entrant dans l'hôte local et générés par l'hôte local, respectivement. Ainsi, tout paquet ne parcourt qu'une des trois chaines (sauf pour le trafic loopback qui implique les deux chaines INPUT et OUTPUT) ; auparavant, un paquet transféré passait par les trois chaines.

Une autre différence importante réside dans le fait que -i fait référence à l'interface d'entrée, que -o fait référence à l'interface de sortie et que les deux sont valables pour les paquets qui entrent dans la chaine FORWARD.

Les différentes formes de NAT ont été séparées ; iptables est un pur filtre de paquets lorsqu'il utilise la table par défaut « filter » avec des modules d'extension optionnels. Cela devrait éviter l'essentiel de la confusion sur la combinaison du camouflage d'IP (masquerading) et du filtrage de paquets vue auparavant. Les options suivantes sont donc maintenant gérées différemment :

 -j MASQ
 -M -S
 -M -L
Il y a plusieurs autres changements dans iptables.

iptables-apply(8), iptables-save(8), iptables-restore(8), iptables-extensions(8),

Le packet-filtering-HOWTO détaille l'utilisation d'iptables pour le filtrage de paquets, le NAT-HOWTO détaille le NAT, le netfilter-extensions-HOWTO détaille les extensions qui ne font pas partie de la distribution standard et le netfilter-hacking-HOWTO détaille le fonctionnement interne de netfilter.
Voir https://www.netfilter.org/.

Rusty Russell est à l'origine de l'écriture d'iptables en consultation préalable avec Michael Neuling.

Marc Boucher a poussé Rusty à abandonner ipnatctl en mettant en avant un cadriciel de sélection de paquets générique dans iptables ; puis il a écrit la table mangle, la correspondance basée sur le propriétaire, le dispositif de marquage et s'est investi çà et là en développant des trucs sympas dans tous les domaines.

James Morris a écrit la cible TOS et la correspondance basée sur tos.

Jozsef Kadlecsik a écrit la cible REJECT.

Harald Welte a écrit les cibles ULOG et NFQUEUE, la nouvelle bibliothèque libiptc, ainsi que les correspondances et cibles TTL, DSCP et ECN.

L'Équipe Centrale Netfilter se compose de : Jozsef Kadlecsik, Pablo Neira Ayuso, Eric Leblond, Florian Westphal et Arturo Borrero Gonzalez. Les membres émérites de l'Équipe Centrale sont : Marc Boucher, Martin Josefsson, Yasuyuki Kozakai, James Morris, Harald Welte et Rusty Russell.

Page de manuel initialement écrite par Herve Eychenne <rv@wallfire.org>.

Cette page de manuel s'applique à iptables/ip6tables 1.8.10.

La traduction française de cette page de manuel a été créée par Christophe Donnier, Guillaume Audirac et Lucien Gentis <lucien.gentis@waika9.com>

Cette traduction est une documentation libre ; veuillez vous reporter à la GNU General Public License version 3 concernant les conditions de copie et de distribution. Il n'y a aucune RESPONSABILITÉ LÉGALE.

Si vous découvrez un bogue dans la traduction de cette page de manuel, veuillez envoyer un message à debian-l10n-french@lists.debian.org.

iptables 1.8.10