iptables/ip6tables — outil d’administration pour le filtrage des paquets IPv4/IPv6 et la NAT
SYNTAXE
iptables [-t table] {-A|-C|-D|-V} chain rule-specification
ip6tables [-t table] {-A|-C|-D|-V} chain rule-specification
iptables [-t table] -I chain [rulenum] rule-specification
iptables [-t table] -R chain rulenum rule-specification
iptables [-t table] -D chain rulenum
iptables [-t table] -S [chain [rulenum]]
iptables [-t table] {-F|-L|-Z} [chain [rulenum]] [options...]
iptables [-t table] -N chain
iptables [-t table] -X [chain]
iptables [-t table] -P chain policy
iptables [-t table] -E old-chain-name new-chain-name
rule-specification := [matches...] [target]
match := -m matchname [per-match-options]
target := -j targetname [per-target-options]
DESCRIPTION
Iptables et ip6tables sont utilisés pour configurer, maintenir et inspecter les tables des règles de filtrage des paquets IPv4 et IPv6 dans le noyau Linux. Plusieurs tables différentes peuvent être définies. Chaque table contient un certain nombre de chaînes intégrées et peut également contenir des chaînes définies par l’utilisateur.
Chaque chaîne est une liste de règles qui peuvent correspondre à un ensemble de paquets. Chaque règle spécifie ce qu’il faut faire avec un paquet qui correspond. Ceci est appelé une « cible », qui peut être un saut vers une chaîne définie par l’utilisateur dans la même table.
CIBLES
Une règle de pare-feu spécifie des critères pour un paquet et une cible. Si le paquet ne correspond pas, la règle suivante de la chaîne 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 chaîne définie par l’utilisateur, l’une des cibles décrites dans iptables-extensions(8), ou l’une des valeurs spéciales ACCEPT, DROP ou RETURN.
ACCEPT signifie laisser passer le paquet. DROP signifie supprimer le paquet. RETURN signifie arrêter de parcourir cette chaîne et reprendre à la règle suivante de la chaîne précédente (appelante). Si la fin d’une chaîne intégrée est atteinte ou qu’une règle dans une chaîne intégrée avec la cible RETURN est correspondante, la cible spécifiée par la politique de la chaîne détermine le sort du paquet.
TABLES
Il existe actuellement cinq tables indépendantes (les tables présentes à un moment donné dépendent des options de configuration du noyau et des modules présents).
-t, --table table
Cette option spécifie la table de correspondance de paquets sur laquelle la commande doit opérer. Si le noyau est configuré avec le chargement automatique des modules, une tentative sera faite de charger le module approprié pour cette table s’il n’y est pas déjà.
Les tables sont les suivantes :
filter :
Il s’agit de la table par défaut (si aucune option -t n’est spécifiée). Elle contient les chaînes intégrées suivantes : INPUT (pour les paquets destinés aux sockets locaux), FORWARD (pour les paquets qui sont routés à travers la boîte) et OUTPUT (pour les paquets générés localement).
nat :
Cette table est consultée lorsqu’un paquet qui crée une nouvelle connexion est rencontré. Elle est composée de quatre chaînes intégrées : PREROUTING (pour modifier les paquets dès leur arrivée), INPUT (pour modifier les paquets destinés aux sockets locaux), OUTPUT (pour modifier les paquets générés localement avant le routage) et POSTROUTING (pour modifier les paquets juste avant leur envoi). La prise en charge d’IPv6 NAT est disponible depuis le noyau 3.7.
mangle :
Cette table est utilisée pour la modification spécialisée des paquets. Jusqu’au noyau 2.4.17, elle comportait deux chaînes intégrées : PREROUTING (pour modifier les paquets entrants avant le routage) et OUTPUT (pour modifier les paquets générés localement avant le routage). Depuis le noyau 2.4.18, trois autres chaînes intégrées sont également prises en charge : INPUT (pour les paquets entrant dans la boîte elle-même), FORWARD (pour modifier les paquets qui sont routés à travers la boîte) et POSTROUTING (pour modifier les paquets juste avant leur envoi).
raw :
Cette table est principalement utilisée pour configurer les exemptions du suivi de connexion en combinaison avec la cible NOTRACK. Elle s’enregistre auprès des hooks netfilter avec une priorité plus élevée et est donc appelée avant ip_conntrack ou tout autre IP tables. Elle fournit les chaînes intégrées suivantes : PREROUTING (pour les paquets arrivant via n’importe quelle interface réseau) et OUTPUT (pour les paquets générés par les processus locaux).
security :
Cette table est utilisée pour les règles de contrôle d’accès obligatoire (MAC), telles que celles activées par les cibles SECMARK et CONNSECMARK. Le contrôle d’accès obligatoire est implémenté par les modules de sécurité Linux tels que SELinux. La table de sécurité est appelée après la table de filtre, ce qui permet à toutes les règles de contrôle d’accès discrétionnaire (DAC) de la table de filtre de prendre effet avant les règles MAC. Cette table fournit les chaînes intégrées suivantes : INPUT (pour les paquets entrant dans la boîte elle-même), OUTPUT (pour modifier les paquets générés localement avant le routage) et FORWARD (pour modifier les paquets qui sont routés à travers la boîte).
OPTIONS
Les options reconnues par iptables et ip6tables peuvent être divisées en plusieurs groupes.
COMMANDES
Ces options spécifient l’action souhaitée à effectuer. Une seule d’entre elles peut être spécifiée sur la ligne de commande, sauf indication contraire ci-dessous. Pour les versions longues des noms de commande et d’options, vous devez utiliser uniquement suffisamment de lettres pour qu’iptables puisse les différencier de toutes les autres options.
-A, --append chain rule-specification
Ajoute une ou plusieurs règles à la fin de la chaîne sélectionnée. Lorsque les noms de source et/ou de destination se résolvent en plus d’une adresse, une règle sera ajoutée pour chaque combinaison d’adresses possible.
-C, --check chain rule-specification
Vérifie si une règle correspondant à la spécification existe dans la chaîne sélectionnée. Cette commande utilise la même logique que -D pour trouver une entrée correspondante, mais ne modifie pas la configuration iptables existante et utilise son code de sortie pour indiquer le succès ou l’échec.
-D, --delete chain règle-spécification
-D, --delete chain numéro-de-règle
Supprimer une ou plusieurs règles de la chaîne sélectionnée. Il existe deux versions de cette commande : la règle peut être spécifiée sous forme de numéro dans la chaîne (en commençant par 1 pour la première règle) ou par une règle à faire correspondre.
-I, --insert chain [numéro-de-règle] règle-spécification
Insérer une ou plusieurs règles dans la chaîne sélectionnée, au numéro de règle spécifié. Ainsi, si le numéro de règle est 1, la règle ou les règles sont insérées en tête de chaîne. C'est également le comportement par défaut si aucun numéro de règle n'est spécifié.
-R, --replace chain numéro-de-règle règle-spécification
Remplacer une règle dans la chaîne sélectionnée. Si les noms source et/ou destination se résolvent en plusieurs adresses, la commande échouera. Les règles sont numérotées en commençant par 1.
-L, --list [chaîne]
Lister toutes les règles de la chaîne sélectionnée. Si aucune chaîne n'est sélectionnée, toutes les chaînes sont listées. Comme toutes les autres commandes iptables, elle s'applique à la table spécifiée (la table « filter » est la table par défaut), de sorte que les règles NAT sont listées avec iptables -t nat -n -L Veuillez noter qu'elle est souvent utilisée avec l'option -n, afin d'éviter les longues recherches DNS inversées. Il est également possible de spécifier l'option -Z (zéro), auquel cas la ou les chaînes seront listées et mises à zéro de manière atomique. La sortie exacte est affectée par les autres arguments donnés. Les règles exactes sont supprimées jusqu'à ce que vous utilisiez iptables -L -v ou iptables-save(8).
-S, --list-rules [chaîne]
Afficher toutes les règles de la chaîne sélectionnée. Si aucune chaîne n'est sélectionnée, toutes les chaînes sont affichées, comme avec iptables-save. Comme toutes les autres commandes iptables, elle s'applique à la table spécifiée (la table « filter » est la table par défaut).
-F, --flush [chaîne]
Vider la chaîne sélectionnée (toutes les chaînes de la table si aucune n'est donnée). Cela équivaut à supprimer toutes les règles une par une.
-Z, --zero [chaîne [numéro-de-règle]]
Mettre à zéro les compteurs de paquets et d'octets dans toutes les chaînes, ou uniquement dans la chaîne donnée, ou uniquement dans la règle donnée d'une chaîne. Il est possible de spécifier également l'option -L, --list (lister), afin de visualiser les compteurs immédiatement avant qu'ils ne soient effacés. (Voir ci-dessus.)
-N, --new-chain chaîne
Créer une nouvelle chaîne définie par l'utilisateur avec le nom donné. Il ne doit pas y avoir de cible portant ce nom.
-X, --delete-chain [chaîne]
Supprimer la chaîne spécifiée. Il ne doit y avoir aucune référence à cette chaîne. Si c'est le cas, vous devez supprimer ou remplacer les règles qui y font référence avant que la chaîne ne puisse être supprimée. La chaîne doit être vide, c'est-à-dire ne pas contenir de règles. Si aucun argument n'est donné, elle supprimera toutes les chaînes vides de la table. Les chaînes intégrées vides ne peuvent être supprimées qu'avec iptables-nft.
-P, --policy chaîne cible
Définir la politique pour la chaîne intégrée (non définie par l'utilisateur) à la cible donnée. La cible de politique doit être soit ACCEPT, soit DROP.
-E, --rename-chain old-chain new-chain
Renomme la chaîne spécifiée par l'utilisateur avec le nom fourni par l'utilisateur. Ceci est purement cosmétique et n'affecte pas la structure de la table.
-h Aide. Affiche une description (actuellement très brève) de la syntaxe de la commande.
PARAMÈTRES
Les paramètres suivants constituent une spécification de règle (telle qu'elle est utilisée dans les commandes add, delete, insert, replace et append).
-4, --ipv4
Cette option n'a aucun effet dans iptables et iptables-restore. Si une règle utilisant l'option -4 est insérée avec (et uniquement avec) ip6tables-restore, elle sera ignorée silencieusement. Toute autre utilisation générera une erreur. Cette option permet d'avoir des règles IPv4 et IPv6 dans un seul fichier de règles pour une utilisation avec iptables-restore et ip6tables-restore.
-6, --ipv6
Si une règle utilisant l'option -6 est insérée avec (et uniquement avec) iptables-restore, elle sera ignorée silencieusement. Toute autre utilisation générera une erreur. Cette option permet d'avoir des règles IPv4 et IPv6 dans un seul fichier de règles pour une utilisation avec iptables-restore et ip6tables-restore. Cette option n'a aucun effet dans ip6tables et ip6tables-restore.
[!] -p, --protocol protocol
Le protocole de la règle ou du paquet à vérifier. Le protocole spécifié peut être l'un des suivants : tcp, udp, udplite, icmp, icmpv6, esp, ah, sctp, mh ou le mot-clé spécial "all", ou il peut s'agir d'une valeur numérique représentant l'un de ces protocoles ou un autre. Un nom de protocole provenant de /etc/protocols est également autorisé. Un argument "!" avant le protocole inverse le test. Le nombre zéro est équivalent à tous. "all" correspondra à tous les protocoles et est considéré comme la valeur par défaut lorsque cette option est omise. Notez qu'avec ip6tables, les en-têtes d'extension IPv6, à l'exception de esp, ne sont pas autorisés. esp et ipv6-nonext peuvent être utilisés avec une version du noyau 6.11 ou ultérieure. Le nombre zéro est équivalent à tous, ce qui signifie que vous ne pouvez pas tester le champ de protocole pour la valeur 0 directement. Pour faire correspondre un en-tête HBH, même s'il s'agissait du dernier, vous ne pouvez pas utiliser -p 0, mais vous devez toujours utiliser -m hbh.
[!] -s, --source address[/mask][,...]
Spécification de la source. L'adresse peut être un nom de réseau, un nom d'hôte, une adresse IP de réseau (avec /masque) ou une adresse IP simple. Les noms d'hôtes seront résolus une seule fois, avant que la règle ne soit soumise au noyau. Veuillez noter que la spécification de tout nom à résoudre avec une requête distante telle que DNS est une très mauvaise idée. Le masque peut être un masque de réseau IPv4 (pour iptables) ou un nombre simple, spécifiant le nombre de 1 à gauche du masque de réseau. Ainsi, un masque iptables de 24 est équivalent à 255.255.255.0. Un argument "!" avant la spécification de l'adresse inverse le sens de l'adresse. L'indicateur --src est un alias pour cette option. Plusieurs adresses peuvent être spécifiées, mais cela se traduira par plusieurs règles (lors de l'ajout avec -A), ou entraînera la suppression de plusieurs règles (avec -D).
[!] -d, --destination address[/mask][,...]
Spécification de la destination. Voir la description de l'indicateur -s (source) pour une description détaillée de la syntaxe. L'indicateur --dst est un alias pour cette option.
-m, --match match
Spécifie une correspondance à utiliser, c’est-à-dire un module d’extension qui teste une propriété spécifique.
L’ensemble des correspondances constitue la condition dans laquelle une cible est invoquée. Les correspondances
sont évaluées de la première à la dernière, comme spécifié dans la ligne de commande, et fonctionnent en mode d’évaluation séquentielle, c’est-à-dire que si une extension renvoie faux, l’évaluation s’arrêtera.
-j, --jump target
Ceci spécifie la cible de la règle, c’est-à-dire ce qu’il faut faire si le paquet correspond. La
cible peut être une chaîne définie par l’utilisateur (autre que celle dans laquelle se trouve cette règle), l’une des cibles intégrées spéciales qui décident immédiatement du sort du paquet, ou une extension (voir CORRESPONDANCES ET EXTENSIONS DE CIBLE ci-dessous). Si cette option est omise dans une règle (et que -g n’est
pas utilisé), alors la correspondance avec la règle n’aura aucun effet sur le sort du paquet, mais les compteurs
de la règle seront incrémentés.
-g, --goto chain
Ceci spécifie que le traitement doit se poursuivre dans une chaîne spécifiée par l’utilisateur. Contrairement à l’option --jump, RETURN ne continuera pas le traitement dans cette chaîne, mais plutôt dans la
chaîne qui nous a appelés via --jump.
[!] -i, --in-interface name
Nom de l’interface par laquelle un paquet a été reçu (uniquement pour les paquets entrant dans les chaînes INPUT,
FORWARD et PREROUTING). Lorsque l’argument « ! » est utilisé avant le nom de l’interface,
le sens est inversé. Si le nom de l’interface se termine par un « + », alors toute interface qui commence par ce nom correspondra. Si cette option est omise, tout nom d’interface correspondra.
[!] -o, --out-interface name
Nom de l’interface par laquelle un paquet va être envoyé (pour les paquets entrant dans les chaînes FORWARD, OUTPUT et POSTROUTING). Lorsque l’argument « ! » est utilisé avant le nom de l’interface,
le sens est inversé. Si le nom de l’interface se termine par un « + », alors toute interface
qui commence par ce nom correspondra. Si cette option est omise, tout nom d’interface correspondra.
[!] -f, --fragment
Cela signifie que la règle ne fait référence qu’aux deuxième et autres fragments IPv4 de paquets fragmentés.
Puisqu’il n’est pas possible de déterminer le port source ou de destination d’un tel paquet
(ou le type ICMP), un tel paquet ne correspondra pas aux règles qui les spécifient. Lorsque l’argument « ! »
précède le drapeau « -f », la règle ne correspondra qu’aux fragments d’en-tête ou aux paquets non fragmentés. Cette option est spécifique à IPv4, elle n’est pas disponible dans ip6tables.
-c, --set-counters packets bytes
Cela permet à l’administrateur d’initialiser les compteurs de paquets et d’octets d’une règle (pendant les opérations INSERT, APPEND, REPLACE).
AUTRES OPTIONS
Les options supplémentaires suivantes peuvent être spécifiées :
-v, --verbose
Sortie détaillée. Cette option fait que la commande list affiche le nom de l’interface, les options de règle (le cas échéant) et les masques TOS. Les compteurs de paquets et d’octets sont également affichés, avec le
suffixe « K », « M » ou « G » pour les multiplicateurs de 1 000, 1 000 000 et 1 000 000 000 respectivement (mais
voir le drapeau -x pour modifier cela). Pour l’ajout, l’insertion, la suppression et le remplacement, cela
entraîne l’impression d’informations détaillées sur la règle ou les règles. -v peut être spécifié plusieurs fois pour éventuellement afficher des instructions de débogage plus détaillées : Spécifié deux fois, iptableslegacy affichera les informations de la table et les entrées dans libiptc, iptables-nft affichera les règles dans la présentation netlink
(code VM). Spécifié trois fois, iptables-nft affichera également tous les messages netlink
envoyés au noyau.
-V, --version
Affiche la version du programme et l’API du noyau utilisée.
-w, --wait [secondes]
Attend le verrou xtables. Pour éviter que plusieurs instances du programme ne soient exécutées simultanément, une tentative sera faite pour obtenir un verrou exclusif au lancement. Par défaut, le programme se terminera si le verrou ne peut pas être obtenu. Cette option fera en sorte que le programme attende (indéfiniment ou pendant un nombre de secondes spécifié) jusqu’à ce que le verrou exclusif puisse être obtenu.
-n, --numeric
Sortie numérique. Les adresses IP et les numéros de port seront affichés au format numérique. Par défaut, le programme tentera de les afficher sous forme de noms d’hôte, de noms de réseau ou de services (lorsque cela est applicable).
-x, --exact
Développe les nombres. Affiche la valeur exacte des compteurs de paquets et d’octets, au lieu d’afficher uniquement le nombre arrondi en K (multiples de 1000), M (multiples de 1000K) ou G (multiples de 1000M). Cette option est uniquement pertinente pour la commande -L.
--line-numbers
Lors de l’affichage des règles, ajoute des numéros de ligne au début de chaque règle, correspondant à la position de cette règle dans la chaîne.
--modprobe=commande
Lors de l’ajout ou de l’insertion de règles dans une chaîne, utilise la commande pour charger les modules nécessaires (cibles, extensions de correspondance, etc.).
FICHIER DE VERROU
iptables utilise le fichier /run/xtables.lock pour prendre un verrou exclusif au lancement.
La variable d’environnement XTABLES\_LOCKFILE peut être utilisée pour remplacer le paramètre par défaut.
EXTENSIONS DE CORRESPONDANCE ET DE CIBLE
iptables peut utiliser des modules d’extension de correspondance et de cible de paquets. Une liste de ces modules est disponible dans la page de manuel iptables-extensions(8).
DIAGNOSTICS
Divers messages d’erreur sont affichés sur la sortie standard d’erreur. Le code de sortie est 0 en cas de fonctionnement correct. Les erreurs qui semblent être causées par des paramètres de ligne de commande invalides ou incorrects entraînent un code de sortie de 2. Les erreurs qui indiquent une incompatibilité entre le noyau et l’espace utilisateur entraînent un code de sortie de 3. Les erreurs qui indiquent un problème de ressources, tel qu’un verrouillage occupé, une allocation de mémoire ayant échoué ou des messages d’erreur du noyau, entraînent un code de sortie de 4. Enfin, les autres erreurs entraînent un code de sortie de 1.
BUGS
Des bugs ? Qu’est-ce que c’est ? 😉 Vous pouvez consulter le site https://bugzilla.netfilter.org/.
iptables se terminera immédiatement avec un code d’erreur de 111 s’il détecte 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 au moment de l’exécution, et le chemin de recherche peut être défini à l’aide de variables d’environnement.
COMPATIBILITÉ AVEC IPCHAINS
Cet iptables est très similaire à ipchains de Rusty Russell. La principale différence est que les chaînes INPUT et OUTPUT ne sont traversées que pour les paquets entrant dans l’hôte local et provenant de l’hôte local, respectivement. Par conséquent, chaque paquet ne passe que par l’une des trois chaînes (à l’exception du trafic en boucle, qui implique les chaînes INPUT et OUTPUT ; auparavant, un paquet transféré passait par les trois chaînes).
L’autre différence principale est que -i fait référence à l’interface d’entrée ; -o fait référence à l’interface de sortie, et les deux sont disponibles pour les paquets entrant dans la chaîne FORWARD.
Les différentes formes de NAT ont été séparées ; iptables est un filtre de paquets pur lorsqu’il utilise la table filter par défaut, avec des modules d’extension optionnels. Cela devrait éviter une grande partie de la confusion concernant la combinaison du masquage IP et du filtrage de paquets observée auparavant. Ainsi, les options suivantes sont traitées différemment :
-j MASQ
-M -S
-M -L
Il existe plusieurs autres modifications dans iptables.
VOIR AUSSI
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 NAT, le netfilter-extensions-HOWTO détaille les extensions qui ne sont pas incluses dans la distribution standard, et le netfilter-hacking-HOWTO détaille les internes de netfilter. Voir https://www.netfilter.org/.
AUTEURS
Rusty Russell a initialement écrit iptables, en consultation avec Michael Neuling.
Marc Boucher a convaincu Rusty d’abandonner ipnatctl en plaidant pour un cadre de sélection de paquets générique dans iptables, puis a écrit la table mangle, la correspondance owner, le marquage et a fait des choses intéressantes partout.
James Morris a écrit la cible TOS et la correspondance tos.
Jozsef Kadlecsik a écrit la cible REJECT.
Harald Welte a écrit les cibles ULOG et NFQUEUE, la nouvelle libiptc, ainsi que les correspondances et cibles TTL, DSCP, ECN.
L’équipe principale de Netfilter est : Jozsef Kadlecsik, Pablo Neira Ayuso, Eric Leblond, Florian Westphal et Arturo Borrero Gonzalez. Les anciens membres de l’équipe principale sont : Marc Boucher, Martin Josefsson, Yasuyuki Kozakai, James Morris, Harald Welte et Rusty Russell.
La page de manuel a été initialement écrite par Herve Eychenne <_>.
VERSION
Cette page de manuel s’applique à iptables/ip6tables 1.8.11.