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 action
chaine
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).
- -t, --table
table
- 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 :
- filter :
- 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).
- nat :
- 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.
- mangle :
- 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).
- raw :
- 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).
- security
:
- 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.
- -A, --append chaine
spécification_de_règle
- 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.
- -C, --check chaine
spécification_de_règle
- 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.
- -D, --delete chaine
spécification_de_règle
- -D, --delete
chaine numéro_de_règle
- 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.
- -I, --insert
chaine [numéro_de_règle]
spécification_de_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é.
- -R, --replace
chaine numéro_de_règle
spécification_de_règle
- 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.
- -L, --list
[chaine]
- 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).
- -S, --list-rules
[chaine]
- 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).
- -F, --flush
[chaine]
- 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.
- -Z, --zero
[chaine [numéro_de_règle]]
- 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).
- -N, --new-chain
chaine
- 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.
- -X, --delete-chain
[chaine]
- 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.
- -P, --policy chaine
cible
- 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.
- -E, --rename-chain
ancienne_chaine nouvelle_chaine
- 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.
- -h
- 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.
- -m, --match
correspondance
- 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.
- -j, --jump
cible
- 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.
- -g, --goto
chaine
- 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.
- -c, --set-counters
paquets octets
- 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 :
- -v, --verbose
- 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.
- -V, --version
- Afficher la version du programme et l'API du noyau utilisée.
- -w, --wait
[secondes]
- 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.
- -n, --numeric
- 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).
- -x, --exact
- 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.
- --line-numbers
- 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.
- --modprobe=commande
- 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.11.
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.