iptables-extensions(8)

NOM
iptables-extensions — Liste des extensions dans la distribution standard d’iptables

SYNOPSIS
ip6tables [-m nom [options_module...]] [-j nom_action [options_action...]

iptables [-m nom [options_module...]] [-j nom_action [options_action...]

EXTENSIONS DE COMPARAISON
iptables peut utiliser des modules de comparaison étendue de paquets à l’aide des options -m ou --match suivies du nom du module de comparaison ; différentes options de ligne de commande complémentaires sont alors disponibles en fonction du module spécifique. Vous pouvez spécifier plusieurs modules de comparaison étendue sur une seule ligne, et vous pouvez utiliser l’options -h ou --help, une fois le module spécifié, afin d’obtenir une aide spécifique à ce dernier. Les modules de comparaison étendue sont pris en compte dans l’ordre selon lequel ils sont spécifiés dans la règle.

Si l’option -p ou --protocol a été spécifiée et si et seulement si une option inconnue est rencontrée, iptables va essayer de charger un module de comparaison de même nom que celui du protocole pour tenter de rendre l’option disponible.

  addrtype
Ce module vérifie la correspondance des paquets en fonction de leur type d’adresse. Les types d’adresse sont utilisés dans la pile réseau du noyau et classent les adresses en plusieurs groupes. La définition exacte de ces groupes dépend du protocole spécifique de couche trois.

Les types d’adresse valables sont les suivants :

UNSPEC
    une adresse non spécifiée (par exemple 0.0.0.0)

UNICAST
    une adresse unicast (connexion point-à-point)

LOCAL
    une adresse locale

BROADCAST
    une adresse de broadcast (diffusion générale)

ANYCAST
    un paquet anycast (une adresse pour plusieurs destinataires)

MULTICAST
    une adresse multicast (diffusion vers un groupe de destinataires)

BLACKHOLE
    une adresse blackhole (trou noir)

UNREACHABLE
    une adresse inaccessible

PROHIBIT
    une adresse interdite

THROW
    FIXME

NAT FIXME

XRESOLVE

[!] --src-type type
    Vérifier si l’adresse source est du type donné

[!] --dst-type type
    Vérifier si l’adresse de destination est du type donné

--limit-iface-in
    La vérification du type d’adresse peut être limitée à l’interface par laquelle entre le paquet. Cette option n’est valable que dans les chaînes PREROUTING, INPUT et FORWARD. Elle ne peut pas être spécifiée en combinaison avec l’option --limit-iface-out.

--limit-iface-out
    La vérification du type d’adresse peut être limitée à l’interface par laquelle sort le paquet. Cette option n’est valable que dans les chaînes POSTROUTING, OUTPUT et FORWARD. Elle ne peut pas être spécifiée en combinaison avec l’option --limit-iface-in.

  ah (spécifique à IPv6)
Ce module vérifie la correspondance des paramètres dans l’en-tête Authentication des paquets IPsec.

[!] --ahspi spi[:spi]
    Vérifier la correspondance des SPI (Security Parameters Index — Index des Paramètres de Sécurité).

[!] --ahlen taille
    Taille totale de cet en-tête en octets.

--ahres
    Correspondance si le champ réservé est rempli avec des zéros.

  ah (spécifique à IPv4)
Ce module vérifie la correspondance des SPI (Security Parameters Index — Index des Paramètres de Sécurité) dans l’en-tête Authentication des paquets IPsec.

[!] --ahspi spi[:spi]

  bpf
Vérifier les correspondances en utilisant un filtre de socket Linux. Prend comme paramètre le chemin d’un objet eBPF (Extended Berkeley Packet Filter) ou d’un programme cBPF (Classic Berkeley Packet Filter) au format décimal.

--object-pinned chemin
    Spécifier le chemin vers un objet eBPF épinglé.

Les applications chargent les programmes eBPF dans le noyau à l’aide de l’appel système bpf() et de la commande BPF_PROG_LOAD, et peuvent les épingler (référencer) dans un système de fichiers virtuel à l’aide de BPF_OBJ_PIN. Pour utiliser un objet épinglé dans iptables, montez le système de fichiers bpf en utilisant

    mount -t bpf bpf ${BPF_MOUNT}

puis insérez le filtre dans iptables avec son chemin :

    iptables -A OUTPUT -m bpf --object-pinned ${BPF_MOUNT}/{PINNED_PATH} -j ACCEPT

--bytecode code
    Passer le format de bytecode (code intermédiaire) BPF tel que généré par l’utilitaire nfbpf_compile.

Le format de code est similaire à la sortie de la commande « tcpdump -ddd » : une ligne qui indique le nombre d’instructions suivie d’une ligne pour chaque instruction. Les lignes d’instruction respectent le motif « u16 u8 u8 u32 » en notation décimale. Les champs codent l’opération, le décalage de saut si vrai, le décalage de saut si faux et le champ multi-usage générique « K ». Les commentaires ne sont pas pris en charge.

Par exemple, pour ne lire que les paquets correspondant à « ip proto 6 », insérez ce qui suit, sans commentaires, ni blancs à la fin :

    4 # nombre d’instructions
    48 0 0 9 # charger le bytecode ip->proto
    21 0 1 6 # saut égal à IPPROTO_TCP
    6 0 0 1 # renvoyer réussite (différent de zéro)
    6 0 0 0 # renvoyer échec (zéro)

Vous pouvez transmettre ce filtre à la vérification de correspondance bpf à l’aide de la commande suivante :

    iptables -A OUTPUT -m bpf --bytecode '4,48 0 0 9,21 0 1 6,6 0 0 1,6 0 0 0' -j ACCEPT

À la place, vous pouvez invoquer l’utilitaire nfbpf_compile.

    iptables -A OUTPUT -m bpf --bytecode "`nfbpf_compile RAW 'ip proto 6'`" -j ACCEPT

Ou alors, utilisez tcpdump -ddd. Dans ce cas, générez un BPF ciblant un dispositif avec le même type de liaison de données que la correspondance de xtables. iptables transmet les paquets de la couche réseau à la couche supérieure, sans couche MAC. Sélectionner un dispositif ayant pour type de liaison de données RAW, comme un dispositif « tun » :

    ip tuntap add tun0 mode tun
    ip link set tun0 up
    tcpdump -ddd -i tun0 ip proto 6

Utilisez la commande « tcpdump -L -i $dev » pour obtenir la liste des types de liaison de données connus pour un dispositif donné.

Pour en apprendre davantage à propos de BPF, lisez la page de manuel bpf(4) de FreeBSD.

  cgroup

[!] --path chemin
    Vérifier la correspondance de l’appartenance à cgroup2.

    Chaque socket est associé au cgroup version 2 des processus de création. Les paquets qui correspondent viennent de (ou vont vers) tous les sockets de la sous-hiérarchie du chemin spécifié. Le chemin doit être relatif à la racine de la hiérarchie cgroup2.

[!] --cgroup identifiant_classe
    Vérifier la correspondance à l’identifiant de classe net_cls de cgroup.

    L’identifiant de classe est le marqueur défini à l’aide du contrôleur net_cls de cgroup. Cette option ne peut pas être utilisée en combinaison avec l’option --path.

Exemple :

    iptables -A OUTPUT -p tcp --sport 80 -m cgroup ! --path service/serveur_HTTP -j DROP

    iptables -A OUTPUT -p tcp --sport 80 -m cgroup ! --cgroup 1 -j DROP

IMPORTANT : lorsqu’il est utilisé dans la chaîne INPUT, le vérificateur de correspondance cgroup n’est pas actuellement d’une grande utilité, car il ne vérifie que la correspondance des paquets qui sont traités pour les sockets locaux à l’aide d’un démultiplexage de socket précoce. C’est pourquoi son utilisation dans la chaîne INPUT n’est pas recommandée, sauf si ses implications sont bien comprises.

Disponible à partir de Linux 3.14.

  cluster
Ce module permet de déployer des grappes de passerelles et de dorsaux à partage de charge sans avoir besoin de répartiteurs de charge.

Cette recherche de correspondance nécessite que tous les nœuds voient les mêmes paquets. La correspondance « cluster » pourra alors décider si ce nœud doit gérer un paquet en fonction des options suivantes :

--cluster-total-nodes nombre
    Définir le nombre total de nœuds dans la grappe.

[!] --cluster-local-node numéro
    Définir l’identifiant du numéro de nœud local.

[!] --cluster-local-nodemask masque
    Définir le masque de l’identifiant du numéro de nœud local. Vous pouvez utiliser cette option à la place de --cluster-local-node.

--cluster-hash-seed valeur
    Définir la valeur de germe du hachage de Jenkins.

Exemple :

    iptables -A PREROUTING -t mangle -i eth1 -m cluster --cluster-total-nodes 2 --cluster-local-node 1 --cluster-hash-seed 0xdeadbeef -j MARK --set-mark 0xffff

    iptables -A PREROUTING -t mangle -i eth2 -m cluster --cluster-total-nodes 2 --cluster-local-node 1 --cluster-hash-seed 0xdeadbeef -j MARK --set-mark 0xffff

    iptables -A PREROUTING -t mangle -i eth1 -m mark ! --mark 0xffff -j DROP

    iptables -A PREROUTING -t mangle -i eth2 -m mark ! --mark 0xffff -j DROP

Et les commandes suivantes pour faire que tous les nœuds voient les mêmes paquets :

    ip maddr add 01:00:5e:00:01:01 dev eth1

    ip maddr add 01:00:5e:00:01:02 dev eth2

    arptables -A OUTPUT -o eth1 --h-length 6 -j mangle --mangle-mac-s 01:00:5e:00:01:01

    arptables -A INPUT -i eth1 --h-length 6 --destination-mac 01:00:5e:00:01:01 -j mangle --mangle-mac-d 00:zz:yy:xx:5a:27

    arptables -A OUTPUT -o eth2 --h-length 6 -j mangle --mangle-mac-s 01:00:5e:00:01:02

    arptables -A INPUT -i eth2 --h-length 6 --destination-mac 01:00:5e:00:01:02 -j mangle --mangle-mac-d 00:zz:yy:xx:5a:27

NOTE : les commandes arptables ci-avant utilisent la syntaxe courante. Si vous utilisez arptables-jf fournie avec certaines versions de RedHat, CentOS et Fedora, vous ferez face à des erreurs de syntaxe. Dans ce cas, vous devrez adapter ces exemples à la syntaxe d’arptables-jf pour qu’ils puissent fonctionner.

Dans le cas des connexions TCP, la fonctionnalité pickup doit être désactivée pour éviter de marquer les paquets TCP ACK entrant dans le sens de la réponse comme valables.

    echo 0 > /proc/sys/net/netfilter/nf_conntrack_tcp_loose

  comment
Cette extension permet d’ajouter des commentaires (jusqu’à 256 caractères) à toute règle.

--comment commentaire

Exemple :
    iptables -A INPUT -i eth1 -m comment --comment "mon réseau local"

  connbytes
Vérifier la correspondance en fonction du nombre d’octets ou de paquets qu’une connexion (ou un des deux flux constituant la connexion) a déjà transmis, ou en fonction du nombre moyen d’octets par paquet.

Les compteurs sont sur 64 bits et ne risquent donc pas de déborder ;)

La principale utilisation consiste à détecter les téléchargements de longue durée et à les marquer pour être programmés avec une priorité inférieure dans le contrôle de trafic.

Le nombre d’octets transférés par connexion peut être visualisé à l’aide de « conntrack -L » et accédé à l’aide de ctnetlink.

Notez que pour les connexions qui ne possèdent pas d’informations de comptage, la vérification de correspondance renverra toujours faux. Le drapeau de sysctl « net.netfilter.nf_conntrack_acct » définit si les nouvelles connexions feront l’objet d’un comptage d’octets et de paquets. Les flux des connexions existantes ne gagneront/perdront pas une/leur structure de comptage après une bascule du drapeau de sysctl.

[!] --connbytes mini[:maxi]
    Vérifier la correspondance des paquets issus d’une connexion dont le nombre de paquets ou d’octets transmis, ou la taille moyenne des paquets est supérieure à mini et inférieure à maxi octets. Si maxi est omis, seule la supériorité de la valeur à mini est vérifiée. « ! » permet de vérifier la correspondance des paquets qui ne correspondent pas à l’intervalle spécifié.

--connbytes-dir {original|reply|both}
    Paquets à prendre en compte

--connbytes-mode {packets|bytes|avgpkt}
    Cette option permet de définir s’il faut vérifier le nombre de paquets ou d’octets transmis, ou la taille moyenne (en octets) de tous les paquets déjà reçus. Notez que lorsque « both « est utilisé en combinaison avec « avgpkt », et si les données transitent principalement dans une seule direction (comme par exemple avec HTTP), la taille moyenne des paquets sera à peu près égale à la moitié de celle des paquets de données proprement dits.

Exemple :
    iptables .. -m connbytes --connbytes 10000:100000 --connbytes-dir both --connbytes-mode bytes ...

  connlabel
Ce module fait correspondre ou ajoute des connlabels (étiquettes de connexion) à une connexion. Les connlabels sont similaires aux connmarks, sauf que les étiquettes sont basées sur des bits ; c’est-à-dire que toutes les étiquettes peuvent être attachées à un flux en même temps. Ce module prend actuellement en charge jusqu’à 128 étiquettes uniques.

[!] --label nom
    Correspondance si l’étiquette nom à été définie pour la connexion. On peut utiliser un nombre à la place d’un nom (lequel sera converti en nombre, voir EXEMPLE ci-après). Utiliser un nombre outrepasse toujours le fichier connlabel.conf.

--set
    Définir une étiquette pour une connexion si elle ne l’est pas déjà. Noter que définir une étiquette peut échouer, car le noyau alloue la zone de stockage de l’étiquette conntrack à la création de la connexion, et il ne réserve que la quantité de mémoire requise par le jeu de règles existant à la création de la connexion. Dans ce cas, la correspondance échouera (ou réussira en cas de négation de l’option --label).

Cette vérification de correspondance requiert libnetfilter_conntrack version 1.0.4 ou ultérieure. La traduction d’étiquette est effectuée à l’aide du fichier de configuration /etc/xtables/connlabel.conf.

Exemple :

    0	eth0-in
    1	eth0-out
    2	ppp-in
    3	ppp-out
    4	bulk-traffic
    5	interactive

  connlimit
Ce module vous permet de limiter le nombre de connexions simultanées à un serveur par adresse IP client (ou bloc d’adresses client).

--connlimit-upto n
    Correspondance si le nombre de connexions existantes est inférieur ou égal à n.

--connlimit-above n
    Correspondance si le nombre de connexions existantes est strictement supérieur à n.

--connlimit-mask taille_préfixe
    Regrouper les hôtes en fonction de la taille du préfixe. Pour IPv4, cette taille doit être un nombre entre 0 et 32 inclus (ou entre 0 et 128 pour IPv6). Par défaut, c’est la taille maximale de préfixe pour le protocole applicable qui sera utilisée.

--connlimit-saddr
    Appliquer la limite au groupe source. Il s’agit du comportement par défaut si --connlimit-daddr n’est pas spécifiée.

--connlimit-daddr
    Appliquer la limite au groupe destination.

Exemples :

–   permettre 2 connexions telnet par hôte client :
    iptables -A INPUT -p tcp --syn --dport 23 -m connlimit --connlimit-above 2 -j REJECT

–   vous pouvez aussi utiliser l’option inverse :
    iptables -A INPUT -p tcp --syn --dport 23 -m connlimit --connlimit-upto 2 -j ACCEPT

–   limiter le nombre de requêtes HTTP simultanées à 16 par réseau source de classe C (masque réseau de 24 bits) :
    iptables -p tcp --syn --dport 80 -m connlimit --connlimit-above 16 --connlimit-mask 24 -j REJECT

–   limiter le nombre de requêtes HTTP simultanées à 16 pour le réseau de liaison locale (IPv6) :
    ip6tables -p tcp --syn --dport 80 -s fe80::/64 -m connlimit --connlimit-above 16 --connlimit-mask 64 -j REJECT

–   limiter le nombre de connexions vers un hôte particulier :
    ip6tables -p tcp --syn --dport 49152:65535 -d 2001:db8::1 -m connlimit --connlimit-above 100 -j REJECT

  connmark
Ce module recherche une correspondance du champ « mark » de netfilter associé à une connexion (et qui peut être défini à l’aide de l’action CONNMARK ci-après).

[!] --mark valeur[/masque]
    Vérifier la correspondance des paquets dans les connexions possédant la valeur de « mark » donnée (si un masque est spécifié, il est combiné à l’aide d’un ET logique avec la valeur de « mark » avant la comparaison).

  conntrack
Ce module, lorsque combiné avec le traçage de connexion, permet d’accéder à l’état du traçage de connexion pour ce paquet ou cette connexion.

[!] --ctstate liste_états
    liste_états est une liste, séparée par des virgules, des états de connexion à comparer. Les états possibles sont énumérés ci-après.

[!] --ctproto l4proto
    Protocol de la couche 4 à comparer (sous forme de numéro ou de nom).

[!] --ctorigsrc adresse[/masque]

[!] --ctorigdst adresse[/masque]

[!] --ctreplsrc adresse[/masque]

[!] --ctrepldst adresse[/masque]
    Comparaison avec l’adresse originelle/réponse source/destination.

[!] --ctorigsrcport port[:port]

[!] --ctorigdstport port[:port]

[!] --ctreplsrcport port[:port]

[!] --ctrepldstport port[:port]
    Comparaison avec le port originel/réponse source/destination (TCP/UDP/etc.) ou la clé GRE. La comparaison avec des plages de port n’est prise en charge que pour les versions du noyau supérieures à 2.6.38.

[!] --ctstatus liste_états
    statuslist est une liste, séparée par des virgules, des états de connexion à comparer. Les états possibles sont énumérés ci-après.

[!] --ctexpire durée[:durée]
    Comparaison entre la durée de vie restante en secondes et la valeur ou l’intervalle de valeurs (incluses) donné.

--ctdir {ORIGINAL|REPLY}
    Vérifier la correspondance des paquets qui cheminent dans la direction spécifiée. Si ce drapeau n’est pas spécifié, les paquets qui cheminent dans les deux directions correspondent.

États pour --ctstate :

INVALID
    Le paquet n’est associé à aucune connexion connue.

NEW Le paquet a initié une nouvelle connexion ou est associé à une connexion qui n’a pas vu de paquets dans les deux directions.

ESTABLISHED
    Le paquet est associé à une connexion qui a vu des paquets dans les deux directions.

RELATED
    Le paquet initie une nouvelle connexion mais est déjà associé à une connexion existante, telle qu’un transfert de données FTP ou une erreur ICMP.

UNTRACKED
    Le paquet n’est pas tracé, ce qui se produit si vous indiquez explicitement de ne pas le tracer en utilisant « -j CT --notrack » dans la table « raw ».

SNAT
    Un état virtuel qui correspond si l’adresse source originelle diffère de l’adresse destination de réponse.

DNAT
    Un état virtuel qui correspond si l’adresse destination originelle diffère de l’adresse source de réponse.

États pour --ctstatus :

NONE
    Aucun des états ci-après.

EXPECTED
    Il s’agit d’une connexion attendue (c’est-à-dire qu’un assistant de conntrack l’a établie).

SEEN_REPLY
    Conntrack a vu des paquets dans les deux directions.

ASSURED
    L’entrée de conntrack ne doit jamais être périmée prématurément.

CONFIRMED
    La connexion est confirmée : le paquet qui en est à l’origine a quitté la boîte.

  cpu

[!] --cpu numéro
    Vérifier le numéro de CPU (central processing unit — processeur) qui traite ce paquet. Les CPU sont numérotés de 0 à nombre_CPU - 1. Peut être utilisé en combinaison avec RPS (Remote Packet Steering — Pilotage de paquets à distance) ou les cartes réseau à files d’attente multiples (multiqueue NIC) pour répartir le trafic réseau sur différentes files d’attente.

Exemple :

iptables -t nat -A PREROUTING -p tcp --dport 80 -m cpu --cpu 0 -j REDIRECT --to-ports 8080

iptables -t nat -A PREROUTING -p tcp --dport 80 -m cpu --cpu 1 -j REDIRECT --to-ports 8081

Disponible depuis Linux 2.6.36.

  dccp

[!] --source-port,--sport port[:port]

[!] --destination-port,--dport port[:port]

[!] --dccp-types masque
    Correspondance si le type de paquet DCCP (Datagram Congestion Control Protocol — Protocole de Contrôle de Congestion des Datagrammes) fait partie de masque. masque est une liste de types de paquet séparés par des virgules. Les types de paquets sont : REQUEST, RESPONSE, DATA, ACK, DATAACK, CLOSEREQ, CLOSE, RESET, SYNC, SYNCACK et INVALID.

[!] --dccp-option nombre
    Correspondance si l’option DCCP est définie.

  devgroup
Vérifier la correspondance du groupe de dispositifs de l’interface d’un paquet entrant/sortant.

[!] --src-group nom
    Vérifier la correspondance du groupe de dispositifs du dispositif entrant.

[!] --dst-group nom
    Vérifier la correspondance du groupe de dispositifs du dispositif sortant.

  dscp
Ce module vérifie la correspondance du champ DSCP (Differentiated Services Code Point — champ permettant de différencier les services) sur 6 bits à l’intérieur du champ TOS (Type Of Service) de l’en-tête IP. DSCP a supplanté TOS au sein de l’IETF (Internet Engineering Task Force).

[!] --dscp valeur
    Correspondance avec une valeur décimale ou hexadécimale comprise dans la plage 0–63.

[!] --dscp-class classe
    Vérifier la correspondance avec la classe DiffServ (Differentiated Services — Services Différenciés). Les classes valables sont BE, EF, AFxx ou CSx. Elles sont ensuite converties vers leurs valeurs numériques respectives.

  dst (spécifique à IPv6)
Ce module vérifie la correspondance des paramètres de l’en-tête « Destination Options ».

[!] --dst-len taille
    Taille totale de cet en-tête en octets.

--dst-opts type[:taille][,type[:taille]...]
    Type numérique de l’option et taille des données de l’option en octets.

  ecn
Ce module permet de vérifier la correspondance des bits ECN de l’en-tête IPv4/IPv6 et TCP. ECN (Explicit Congestion Notification) est le mécanisme de notification explicite de congestion décrit dans la RFC 3168.

[!] --ecn-tcp-cwr
    Correspond si le bit TCP ECN CWR (Congestion Window Received — fenêtre de congestion reçue) est positionné.

[!] --ecn-tcp-ece
    Correspond si le bit TCP ECN ECE (ECN Echo — paquet reçu avec le bit CE positionné) est positionné.

[!] --ecn-ip-ect nombre
    Vérifie la correspondance d’un point de code IPv4/IPv6 ECT (ECN-Capable Transport) particulier. Vous devez spécifier un nombre entre 0 et 3.

  esp
Ce module vérifie la correspondance des SPI (Security Parameters Index — index des paramètres de sécurité) de l’en-tête ESP (Encapsulation Security Payload — encapsulation sécurisée de charge utile) des paquets IPsec.

[!] --espspi spi[:spi]

  eui64 (Extended Unique Identifier — identifiant unique étendu) ; spécifique à IPv6.
Ce module vérifie la correspondance de la partie EUI-64 d’une adresse IPv6 autoconfigurée sans conservation d’état (stateless). Il compare cette partie EUI-64 dérivée de l’adresse MAC source dans la trame Ethernet avec les 64 bits les moins significatifs de l’adresse IPv6 source. Le bit « Universal/Local » n’est cependant pas comparé. Ce module ne vérifie pas la correspondance d’autres trames de la couche liaison et n’est valable que dans les chaînes PREROUTING, INPUT et FORWARD.

  frag (spécifique à IPv6)
Ce module vérifie la correspondance des paramètres de l’en-tête Fragment.

[!] --fragid id[:id]
    Vérifie la correspondance de l’identifiant ou de la plage d’identifiant donné.

[!] --fraglen taille
    Cette option ne peut pas être utilisée avec un noyau de version 2.6.10 ou ultérieure. La taille de l’en-tête Fragment est statique et cette option n’est donc pas pertinente.

--fragres
    Correspond si les champs réservés sont remplis de zéros.

--fragfirst
    Vérifier s’il s’agit du premier fragment.

--fragmore
    Correspond s’il y a encore des fragments.

--fraglast
    Correspond s’il s’agit du dernier fragment.

  hashlimit
hashlimit utilise des compartiments de hachage (hash buckets) pour exprimer une correspondance de limitation de débit (comme la correspondance de limit) pour un groupe de connexions utilisant une seule règle iptables. Le groupement peut s’effectuer par groupe d’hôtes (adresse source et/ou destination) et/ou par port. Ce module permet d’exprimer « N paquets par unité de temps et par groupe » ou « N octets par seconde » (voir les exemples ci-après).

Les options de limite de hachage (--hashlimit-upto, --hashlimit-above) et --hashlimit-name sont obligatoires.

--hashlimit-upto quantité[/second|/minute|/hour|/day]
    Correspond si le débit est inférieur ou égal à quantité/unité de temps. Ce débit est spécifié sous la forme d’un nombre avec un suffixe d’unité de temps facultatif (la valeur par défaut est 3/hour), ou sous la forme quantitéb/second (nombre d’octets par seconde).

--hashlimit-above quantité[/second|/minute|/hour|/day]
    Correspond si le débit est supérieur à quantité/unité de temps.

--hashlimit-burst quantité
    Nombre initial maximal de paquets à comparer : ce nombre est incrémenté de 1 tant que la limite spécifiée ci-avant n’est pas atteinte, et ce jusqu’à ce que cette limite soit atteinte ; la valeur par défaut est 5. Lorsqu’une vérification de correspondance de débit en octets est demandée, cette option spécifie la quantité d’octets pouvant excéder le débit donné. Cette option doit être utilisée avec précautions — si l’entrée arrive à expiration, cette valeur est aussi réinitialisée.

--hashlimit-mode {srcip|srcport|dstip|dstport},...
    Une liste, séparée par des virgules, d’objets à prendre en considération. Si aucune option --hashlimit-mode n’est spécifiée, hashlimit agit comme limit, au prix de devoir faire le ménage du hachage.

--hashlimit-srcmask préfixe
    Lorsque « --hashlimit-mode srcip » est spécifié, toutes les adresses source rencontrées seront regroupées en fonction de la taille du préfixe donné, et le sous-réseau ainsi créé sera soumis à hashlimit. préfixe doit être entre 0 et 32 inclus. Notez que « --hashlimit-srcmask 0 » produit le même effet que ne pas spécifier srcip pour --hashlimit-mode, mais consomme plus de ressources.

--hashlimit-dstmask préfixe
    Comme --hashlimit-srcmask, mais pour les adresses destination.

--hashlimit-name nom_limite
    Le nom pour l’entrée /proc/net/ipt_hashlimit/nom_limite

--hashlimit-htable-size compartiments
    Le nombre de compartiments dans la table de hachages.

--hashlimit-htable-max entrées
    Le nombre maximal d’entrées dans le hachage.

--hashlimit-htable-expire msec
    Délai d’expiration des entrées du hachage en millisecondes.

--hashlimit-htable-gcinterval msec
    Nombre de millisecondes entre chaque ramassage des déchets.

--hashlimit-rate-match
    Catégoriser le flux au lieu de limiter son débit. L’action de cette option consiste à évaluer à vrai ou faux le fait que le débit est au-dessus ou en-dessous d’une certaine valeur.

--hashlimit-rate-interval sec
    Combinée avec --hashlimit-rate-match, cette option permet de spécifier le pas selon lequel le débit doit être échantillonné.

Exemples :

correspondance au niveau de l’hôte source
    « 1000 paquets par seconde pour chaque hôte de 192.168.0.0/16 » => -s 192.168.0.0/16 --hashlimit-mode srcip --hashlimit-upto 1000/sec

correspondance au niveau du port
    « 100 paquets par seconde pour chaque service de 192.168.1.1 » => -s 192.168.1.1 --hashlimit-mode srcport --hashlimit-upto 100/sec

correspondance au niveau du sous-réseau
    « 10000 paquets par minute pour chaque sous-réseau /28 (groupes de 8 adresses) de 10.0.0.0/8 » => -s 10.0.0.0/8 --hashlimit-mask 28 --hashlimit-upto 10000/min

correspondance au niveau du débit en octets par seconde
    « débits excédant 512 ko/s » => --hashlimit-mode srcip,dstip,srcport,dstport --hashlimit-above 512kb/s

correspondance au niveau du débit en octets par seconde
    « débits excédant512 ko/s, mais permission d’aller jusqu’à 1 Mo sans recherche de correspondance » => --hashlimit-mode dstip --hashlimit-above 512kb/s --hashlimit-burst 1mb

  hbh (spécifique à IPv6)
Ce module vérifie la correspondance des paramètres de l’en-tête des options Hop-by-Hop.

[!] --hbh-len taille
    Taille totale de cet en-tête en octets.

--hbh-opts type[:taille][,type[:taille]...]
    Type numérique de l’option et taille des données de l’option en octets.

  helper
Ce module vérifie la correspondance des paquets en relation avec un assistant de conntrack (conntrack helper) spécifique.

[!] --helper chaîne
    Correspond aux paquets en relation avec l’assistant de conntrack spécifié.

    chaîne peut contenir « ftp » pour les paquets en relation avec une session FTP sur le port par défaut. Pour un port différent, ajoutez « --num_port » à la chaîne (par exemple, « ftp-2121 »).

    Les mêmes règles s’appliquent pour les autres assistants de conntrack.

  hl (spécifique à IPv6)
Ce module vérifie la correspondance du champ Hop Limit de l’en-tête IPv6.

[!] --hl-eq valeur
    Correspond si le champ Hop Limit contient la valeur spécifiée.

--hl-lt valeur
    Correspond si la valeur contenue dans le champ Hop Limit est inférieure à valeur.

--hl-gt valeur
    Correspond si la valeur contenue dans le champ Hop Limit est supérieure à valeur.

  icmp (spécifique à IPv4)
Cette extension peut être utilisée si « --protocol icmp » est spécifié. Elle fournit l’option suivante :

[!] --icmp-type {type[/code]|nom_type}
    Cette option permet de spécifier le type ICMP sous la forme d’un type ICMP numérique, d’une paire type/code ou d’un des noms de type ICMP nom_type affichés par la commande
     iptables -p icmp -h

  icmp6 (spécifique à IPv6)
Cette extension peut être utilisée si « --protocol ipv6-icmp » ou « --protocol icmpv6 » est spécifié. Elle fournit l’option suivante :

[!] --icmpv6-type type[/code]|nom_type
    Cette option permet de spécifier le type ICMPv6 sous la forme d’un type ICMPv6 numérique, d’une paire type/code ou d’un des noms de type ICMPv6 nom_type affichés par la commande
     ip6tables -p ipv6-icmp -h

  iprange
Ce module vérifie la correspondance de la plage d’adresses IP arbitraire donné.

[!] --src-range de[-à]
    Correspond si l’adresse IP source appartient à la plage spécifié.

[!] --dst-range de[-à]
    Correspond si l’adresse IP destination appartient à la plage spécifié.

  ipv6header (spécifique à IPv6)
Ce module vérifie la correspondance des en-têtes d’extension IPv6 et/ou l’en-tête de la couche supérieure.

--soft
    Correspond si le paquet contient au moins un des en-têtes spécifiés à l’aide de l’option --header.

[!] --header en-tête[,en-tête...]
    Correspond aux paquets qui contiennent EXACTEMENT tous les en-têtes spécifiés. Les en-têtes encapsulés avec l’en-tête ESP ne sont pas concernés. Les valeurs possibles d’en-tête sont :

hop|hop-by-hop
    En-tête des options Hop-by-Hop

dst En-tête des options de destination

route
    En-tête de routage

frag
    En-tête de fragment

auth
    En-tête d’authentification

esp En-tête d’encapsulation sécurisée de la charge utile

none
    Pas d’en-tête Next, ce qui correspond à la valeur 59 dans le « champ Next Header » de l’en-tête IPv6 ou de tout en-tête d’extension IPv6.

prot
    Correspondance à n'importe quel en-tête de protocole de la couche supérieure. Un nom de protocole issu du fichier /etc/protocols ou une valeur numérique sont aussi autorisés. Le nombre 255 est équivalent à prot.

  ipvs
Ce module vérifie la correspondance des propriétés de la connexion IPVS.

[!] --ipvs
    le paquet appartient à une connexion IPVS (IP Virtual Server — serveur IP virtuel)

Toutes les options suivantes impliquent --ipvs (même si elles sont précédées d’une négation)

[!] --vproto protocole
    protocole VIP (Virtual IP) à comparer ; par numéro ou par nom, par exemple « tcp »

[!] --vaddr adresse[/masque]
    adresse VIP à comparer

[!] --vport port
    port VIP à comparer ; par numéro ou par nom, par exemple « http »

--vdir {ORIGINAL|REPLY}
    sens de déplacement du paquet

[!] --vmethod {GATE|IPIP|MASQ}
    méthode de redirection IPVS utilisée

[!] --vportctl port
    port VIP de la connexion de contrôle à comparer, par exemple 21 pour FTP

  length
Ce module permet de comparer la taille de la charge utile de la couche 3 d’un paquet (par exemple, un paquet de niveau 4) avec une valeur ou un intervalle de valeurs donnés.

[!] --length taille[:taille]

  limit
Ce module vérifie la correspondance d’un débit limité en utilisant un filtre de type « seau à jetons » (token bucket). Une règle utilisant cette extension correspondra jusqu’à ce que cette limite soit atteinte. Ce module peut être utilisé en combinaison avec l’action LOG pour fournir une journalisation limitée, par exemple.

xt_limit ne prend pas en charge la négation — pour appliquer cette dernière, vous devrez utiliser « -m hashlimit ! --hashlimit débit » tout en omettant --hashlimit-mode.

--limit débit[/second|/minute|/hour|/day]
    Débit moyen maximal de comparaison : spécifié sous forme de nombre avec un suffixe facultatif « /second », « /minute », « /hour » ou « /day », la valeur par défaut étant 3/hour.

--limit-burst nombre
    Nombre initial maximal de paquets à comparer : ce nombre est incrémenté de 1 tant que la limite spécifiée ci-avant n’est pas atteinte, et ce jusqu’à ce que cette limite soit atteinte ; la valeur par défaut est 5.

  mac

[!] --mac-source adresse
    Cette option permet de vérifier la correspondance de l’adresse MAC source (Media Access Control). Cette dernière doit être de la forme XX:XX:XX:XX:XX:XX. Notez que cette option n’est pertinente que pour les paquets provenant d’un dispositif Ethernet et entrant dans les chaînes PREROUTING, FORWARD ou INPUT.

  mark
Ce module vérifie la correspondance du champ de netfilter « mark » associé à un paquet (et qui peut être défini à l’aide de l’action MARK ci-après).

[!] --mark valeur[/masque]
    Correspond aux paquets possédant la valeur de « mark » non signée donnée (si un masque est spécifié, il est combiné à l’aide d’un ET logique avec le masque avant la comparaison).

  mh (spécifique à IPv6)
Cette extension est chargée si « --protocol ipv6-mh » ou « --protocol mh » est spécifiée. Elle fournit l’option suivante :

[!] --mh-type type[:type]
    Cette option permet de spécifier le type d’en-tête de mobilité (Mobility Header — MH) sous forme d’un type de MH numérique ou d’un des noms de type de MH indiqués par la commande
     ip6tables -p mh -h

  multiport
Ce module vérifie la correspondance d’un ensemble de ports source ou destination. Il est possible de spécifier jusqu’à15 ports. Une plage de ports (port:port) compte pour deux ports. Ce module ne peut être utilisé qu’avec les protocoles suivants : tcp, udp, udplite, dccp et sctp.

[!] --source-ports,--sports port[,port|,port:port]...
    Correspond si le port source fait partie des ports donnés. Le drapeau --sports est un alias de commodité pour cette option. Plusieurs ports ou plages de ports sont séparés par des virgules et une plage de port est spécifié en utilisant un deux-points « : ». Par exemple, 53,1024:65535 correspondra au port 53 et à tous les ports de 1024 à 65535.

[!] --destination-ports,--dports port[,port|,port:port]...
    Correspond si le port destination fait partie des ports donnés. Le drapeau --dports est un alias de commodité pour cette option.

[!] --ports port[,port|,port:port]...
    Correspond si un des ports source ou destination est égal à un des ports donnés.

  nfacct
Ce module fournit l'infrastructure de statistiques étendue pour iptables. Vous devez utiliser cette vérification de correspondance avec l'utilitaire d'espace utilisateur autonome nfacct(8).

La seule option valable pour cette vérification de correspondance est la suivante :

--nfacct-name nom
    Cette option permet de spécifier le nom d’objet existant qui sera utilisé pour effectuer des statistiques sur le trafic auquel ce jeu de règles correspond.

Pour utiliser cette extension, vous devez créer un objet de statistiques :

    nfacct add http-traffic

Ensuite, vous devez attacher l’extension à l’objet de statistiques à l’aide d’iptables :

    iptables -I INPUT -p tcp --sport 80 -m nfacct --nfacct-name http-traffic

    iptables -I OUTPUT -p tcp --dport 80 -m nfacct --nfacct-name http-traffic

Enfin, vous pouvez consulter l’intensité du trafic auquel la règle correspond :

    nfacct get http-traffic

    { pkts = 00000000000000000156, bytes = 00000000000000151786 } = http-traffic;

Vous pouvez télécharger nfacct(8) depuis https://www.netfilter.org ou depuis le dépôt git.netfilter.org.

  osf
Le module osf effectue une prise d’empreinte passive du système d’exploitation. Il compare certaines données (taille de fenêtre, MSS (Maximum Segment Size — taille maximale de segment), les options et leur ordre, TTL (Time To Live — durée de vie), le drapeau DF (Don’t Fragment — ne pas fragmenter), etc.) des paquets ayant le bit SYN positionné.

[!] --genre chaîne
    Cette option permet de vérifier la correspondance d’un genre de système d’exploitation en utilisant une prise d’empreinte passive.

--ttl niveau
    Effectuer des vérifications additionnelles de durée de vie sur le paquet pour déterminer le système d’exploitation. niveau peut prendre les valeurs suivantes :

    0   Véritable comparaison des durées de vie de l’adresse IP et de l’empreinte (fonctionne en général pour les réseaux locaux).

    1   Vérifier si la durée de vie de l’en-tête IP est inférieure à celle de l’empreinte (fonctionne avec des adresses routables globalement).

    2   Ne pas comparer les durées de vie.

--log niveau
    Journaliser les genres déterminés dans dmesg même s’ils ne correspondent pas au genre souhaité. niveau peut prendre une des valeurs suivantes :

    0   Journaliser toutes les signatures correspondantes ou inconnues.

    1   Journaliser seulement la première.

    2   Journaliser toutes les signatures connues correspondantes.

Vous pouvez voir apparaître quelque chose de ce genre dans syslog :

Windows [2000:SP3:Windows XP Pro SP1, 2000 SP3]: 11.22.33.55:4024 -> 11.22.33.44:139 hops=3 Linux [2.5-2.6:] : 1.2.3.4:42624 -> 1.2.3.5:22 hops=4

Les empreintes d’OS peuvent être chargées à l’aide du programme nfnl_osf. Pour charger une empreinte à partir d’un fichier, utilisez :

nfnl_osf -f /usr/share/xtables/pf.os

et pour la supprimer à nouveau,

nfnl_osf -f /usr/share/xtables/pf.os -d

La base de données des empreintes peut être téléchargée depuis http://www.openbsd.org/cgi-bin/cvsweb/src/etc/pf.os.

  owner
Ce module tente de vérifier la correspondance de différentes caractéristiques du créateur du paquet, pour les paquets générés localement. Cette recherche de correspondance n’est valable que dans les chaînes OUTPUT et POSTROUTING. Les paquets redirigés n’ont pas de socket associé, à la différence des paquets en provenance des threads du noyau qui ont un socket, mais généralement pas de propriétaire.

[!] --uid-owner nom_utilisateur

[!] --uid-owner identifiant_utilisateur[-identifiant_utilisateur]
    Correspond si la structure du fichier de socket du paquet (si elle existe) est la propriété de l’utilisateur donné. Vous pouvez aussi spécifier un UID numérique ou un intervalle d’UID.

[!] --gid-owner nom_groupe

[!] --gid-owner identifiant_groupe[-identifiant_groupe]
    Correspond si la structure du fichier de socket du paquet est la propriété du groupe donné. Vous pouvez aussi spécifier un GID numérique ou un intervalle de GID.

--suppl-groups
    Avec cette option, le(s) groupe(s) spécifié(s) à l’aide de --gid-owner sont aussi comparés avec les groupes supplémentaires d’un processus.

[!] --socket-exists
    Correspond si le paquet est associé à un socket.

  physdev
Ce module vérifie la correspondance des dispositifs d'entrée et de sortie d’un port de pont asservis à un dispositif de pont. Ce module fait partie de l'infrastructure qui active un pare-feu IP de pontage transparent et n’est disponible que pour les versions 2.5.44 et ultérieures du noyau.

[!] --physdev-in nom
    Le nom d’un port de pont par lequel un paquet est reçu (seulement pour les paquets entrant dans les chaînes INPUT, FORWARD ou PREROUTING). Si le nom de l’interface de termine par un « + », toute interface dont le nom commence par ce nom correspondra. Si le paquet n’est pas arrivé par un dispositif de pont, il ne correspondra pas aux critères de cette option, à moins que « ! » ne soit spécifié.

[!] --physdev-out nom
    Le nom d’un port de pont par lequel un paquet est sur le point d’être envoyé (seulement pour les paquets ayant subi un pontage et entrant dans les chaînes FORWARD et POSTROUTING). Si le nom de l’interface de termine par un « + », toute interface dont le nom commence par ce nom correspondra.

[!] --physdev-is-in
    Correspond si le paquet est entré par une interface de pont.

[!] --physdev-is-out
    Correspond si le paquet est sur le point de sortir par une interface de pont.

[!] --physdev-is-bridged
    Correspond si le paquet subit un pontage et n’est donc pas routé. Utile seulement dans les chaînes FORWARD et POSTROUTING.

  pkttype
Ce module vérifie la correspondance du type du paquet au niveau de la couche liaison.

[!] --pkt-type {unicast|broadcast|multicast}

  policy
Ce module vérifie la correspondance de la politique utilisée par IPsec pour gérer un paquet.

--dir {in|out}
    Cette option permet de choisir si l’on doit vérifier la correspondance de la politique utilisée pour la désencapsulation ou la politique qui sera utilisée pour l’encapsulation. in est valable dans les chaînes PREROUTING, INPUT et FORWARD, alors que out l’est dans les chaînes POSTROUTING, OUTPUT et FORWARD.

--pol {none|ipsec}
    Correspond si le paquet est traité par IPsec. --pol none ne peut pas être combiné à --strict.

--strict
    Cette option permet de choisir si l’intégralité de la politique doit correspondre ou si au moins une des règles de la politique doit correspondre à la politique donnée.

Pour chaque élément de politique à décrire, il est possible d’utiliser une ou plusieurs des options suivantes. Lorsque --strict a été spécifiée, au moins une option doit être utilisée pour chaque élément.

[!] --reqid identifiant
    Cette option permet de vérifier la correspondance du « reqid » de la règle de la politique. Le reqid peut être spécifié à l’aide de setkey(8) en utilisant unique:id comme niveau.

[!] --spi spi
    Cette option permet de vérifier la correspondance du SPI (Security Parameters Index — index des paramètres de sécurité) des SA (Security Associations — associations de sécurités).

[!] --proto {ah|esp|ipcomp}
    Cette option permet de vérifier la correspondance du protocole d’encapsulation.

[!] --mode {tunnel|transport}
    Cette option permet de vérifier la correspondance du mode d’encapsulation.

[!] --tunnel-src adresse[/masque]
    Cette option permet de vérifier la correspondance de l’adresse de l’extrémité source d’une SA en mode tunnel. Valable seulement avec --mode tunnel.

[!] --tunnel-dst adresse[/masque]
    Cette option permet de vérifier la correspondance de l’adresse de l’extrémité destination d’une SA en mode tunnel. Valable seulement avec --mode tunnel.

--next
    Démarrer l’élément suivant dans la spécification de la politique. Ne peut être utilisé qu’avec --strict.

  quota
Ce module implémente les quotas réseau en décrémentant un compteur d’octets avec chaque paquet. La condition est vérifiée jusqu’à ce que le compteur d’octets atteigne zéro. Ce comportement peut être inversé par une négation (la condition ne sera alors vérifiée que lorsque le compteur d’octets atteindra zéro).

[!] --quota octets
    Le quota en octets.

  rateest
L’estimateur de débit peut vérifier la correspondance des débits estimés comme ceux collectés à l’aide de l’action RATEEST. Il prend en charge la correspondance basée sur des valeurs de bps/pps absolues, la comparaison de deux estimateurs de débit et la correspondance basée sur la différence entre deux estimateurs de débit.

Pour une meilleure compréhension des options valables, voici toutes les combinaisons possibles :

Mode absolu :

–   rateest opérateur rateest-bps

–   rateest opérateur rateest-pps

Mode absolu + Delta :

–   (rateest moins rateest-bps1) opérateur rateest-bps2

–   (rateest moins rateest-pps1) opérateur rateest-pps2

Mode relatif :

–   rateest1 opérateur rateest2 rateest-bps(sans débit !)

–   rateest1 opérateur rateest2 rateest-pps(sans débit !)

Mode relatif + Delta :

–   (rateest1 moins rateest-bps1) opérateur (rateest2 moins rateest-bps2)

–   (rateest1 moins rateest-pps1) opérateur (rateest2 moins rateest-pps2)

--rateest-delta
    Pour chaque estimateur (en mode relatif ou absolu), calculer la différence entre le débit du flux déterminé par l’estimateur et la valeur statique spécifiée à l’aide des options BPS/PPS. Si le débit du flux est plus élevé que la valeur spécifiée en BPS/PPS,0 sera utilisé à la place d’une valeur négative. Autrement dit, la valeur utilisée sera le résultat de « max(0, rateest#_rate - rateest#_bps) ».

[!] --rateest-lt
    Correspond si le débit est inférieur au débit par estimateur donné.

[!] --rateest-gt
    Correspond si le débit est supérieur au débit par estimateur donné.

[!] --rateest-eq
    Correspond si le débit est égal au débit par estimateur donné.

Dans le mode dit « mode absolu », un seul estimateur est utilisé et comparé avec une valeur statique, tandis qu’en « mode relatif », deux estimateurs de débit sont comparés avec un autre.

--rateest nom
    Nom de l’unique estimateur de débit pour le mode absolu.

--rateest1 nom

--rateest2 nom
    Les noms des deux estimateurs de débit pour le mode relatif.

--rateest-bps [valeur]

--rateest-pps [valeur]

--rateest-bps1 [valeur]

--rateest-bps2 [valeur]

--rateest-pps1 [valeur]

--rateest-pps2 [valeur]
    Comparer avec la valeur spécifiée les valeurs fournies par le(s) estimateur(s) en octets ou paquets par seconde. Voir la liste ci-avant pour connaître les options à utiliser dans chaque cas. Il est possible d’ajouter un suffixe d’unité — les suffixes disponibles sont : bit, [kmgt]bit, [KMGT]ibit, Bps, [KMGT]Bps et [KMGT]iBps.

Exemple : voici la commande qui peut être utilisée pour router les connexions de données sortantes d’un serveur FTP sur deux lignes en fonction de la bande passante disponible au moment où la connexion a été établie :

# Estimer les débits sortants :

iptables -t mangle -A POSTROUTING -o eth0 -j RATEEST --rateest-name eth0 --rateest-interval 250ms --rateest-ewma 0.5s

iptables -t mangle -A POSTROUTING -o ppp0 -j RATEEST --rateest-name ppp0 --rateest-interval 250ms --rateest-ewma 0.5s

# Marquer en fonction de la bande passante disponible :

iptables -t mangle -A balance -m conntrack --ctstate NEW -m helper --helper ftp -m rateest --rateest-delta --rateest1 eth0 --rateest-bps1 2.5mbit --rateest-gt --rateest2 ppp0 --rateest-bps2 2mbit -j CONNMARK --set-mark 1

iptables -t mangle -A balance -m conntrack --ctstate NEW -m helper --helper ftp -m rateest --rateest-delta --rateest1 ppp0 --rateest-bps1 2mbit --rateest-gt --rateest2 eth0 --rateest-bps2 2.5mbit -j CONNMARK --set-mark 2

iptables -t mangle -A balance -j CONNMARK --restore-mark

  realm (spécifique à IPv4)
Ce module permet de vérifier la correspondance du domaine (realm) de routage. Les domaines de routage sont utilisés dans les configurations de routage complexes mettant en jeu des protocoles de routage dynamique comme BGP.

[!] --realm valeur[/masque]
    Vérifier la correspondance d’un numéro de domaine donné (accompagné éventuellement d’un masque). Au lieu d’un numéro, valeur peut être un domaine nommé issu de /etc/iproute2/rt_realms (dans ce cas, le masque n’est pas autorisé). valeur et masque sont des entiers non signés de 4 octets et peuvent être spécifiés en décimal, hexadécimal (en ajoutant le préfixe « 0x ») ou octal (en préfixant la valeur d’un zéro).

  recent
Ce module permet de créer dynamiquement une liste d’adresses IP et de vérifier la correspondance de cette liste de différentes manières.

Par exemple, vous pouvez créer une liste « méchants » des gens qui tentent de se connecter au port 139 sur votre pare-feu, et supprimer ensuite tous les paquets qui proviennent de ces derniers sans les examiner.

--set, --rcheck, --update et --remove sont mutuellement exclusifs.

--name nom
    Spécifier la liste à utiliser pour les commandes. Si aucun nom n’est donné, DEFAULT sera utilisé.

[!] --set
    Cette option permet d’ajouter l’adresse source du paquet à la liste. Si l’adresse source est déjà présente dans la liste, l’entrée concernée sera mise à jour. Cette option renvoie toujours « succès » (ou « échec » si ! est spécifié).

--rsource
    Vérifier la correspondance de/sauvegarder l’adresse source de chaque paquet de la liste « recent ». Il s’agit du comportement par défaut.

--rdest
    Vérifier la correspondance de/sauvegarder l’adresse destination de chaque paquet de la liste « recent ».

--mask masque_sous_réseau
    Cette option permet de spécifier le masque_sous_réseau qui sera appliqué à cette liste « recent ».

[!] --rcheck
    Cette option permet de vérifier si l’adresse source du paquet est actuellement dans la liste.

[!] --update
    Identique à --rcheck, excepté que si la correspondance est vérifiée, l’horodatage « vu la dernière fois » sera mis à jour.

[!] --remove
    Cette option permet de vérifier si l’adresse source du paquet est actuellement dans la liste et si c’est le cas, supprimer cette adresse de la liste et la règle renverra « vrai ». Si l’adresse n’est pas trouvée, la règle renverra « faux ».

--seconds secondes
    Cette option doit être utilisée en combinaison avec une des options --rcheck ou --update. Lorsqu’elle est utilisée, la correspondance ne sera vérifiée que si l’adresse est dans la liste et si elle a été vue au cours du dernier nombre de secondes donné.

--reap
    Cette option ne peut être utilisée qu’en combinaison avec l’option --seconds. Lorsqu’elle est utilisée, les entrées plus anciennes que le nombre de secondes donné seront vidées.

--hitcount correspondances
    Cette option ne peut être utilisée qu’en combinaison avec les options --rcheck ou --update. Lorsqu’elle est utilisée, la correspondance ne sera vérifiée que si l’adresse est dans la liste et si les paquets ont été interceptés un nombre de fois supérieur ou égal à la valeur donnée. Elle peut être utilisée en combinaison avec l’option --seconds pour créer une condition de correspondance encore plus restrictive nécessitant un certain nombre d’interceptions dans un certain intervalle de temps.

--rttl
    Cette option ne peut être utilisée qu’en combinaison avec une des options --rcheck ou --update. Lorsqu’elle est utilisée, la correspondance ne sera vérifiée que si l’adresse est dans la liste et si la durée de vie du paquet actuel correspond à celle du paquet qui correspondait à la règle --set. Elle peut s’avérer utile si vous rencontrer des problèmes avec des gens qui contrefont leur adresse source pour effectuer une attaque de type DoS à l’aide de ce module dans le but d’empêcher les autres utilisateurs d’accéder à votre site en vous envoyant des paquets bogués.

Exemples :

    iptables -A FORWARD -m recent --name méchant --rcheck --seconds 60 -j DROP

    iptables -A FORWARD -p tcp -i eth0 --dport 139 -m recent --name méchant --set -j DROP

/proc/net/xt_recent/* correspond aux listes actuelles d’adresses et d’informations à propos de chaque entrée de chaque liste.

Chaque fichier dans /proc/net/xt_recent/ peut être consulté pour déterminer la liste actuelle ou écrit en utilisant les commandes suivantes pour modifier la liste :

echo +adresse >/proc/net/xt_recent/DEFAULT
    pour ajouter adresse à la liste DEFAULT

echo -adresse >/proc/net/xt_recent/DEFAULT
    pour supprimer adresse de la liste DEFAULT

echo / >/proc/net/xt_recent/DEFAULT
    pour vider la liste DEFAULT (en supprimer toutes les entrées).

Le module lui-même accepte les paramètres suivants (avec leur valeur par défaut) :

ip_list_tot=100
    Nombre d’adresses mémorisées par table.

ip_pkt_list_tot=0
    Le nombre de paquets par adresse mémorisée. Ce paramètre est obsolète depuis la version 3.19 du noyau à partir de laquelle la taille de la table est calculée en fonction de la valeur de l’option --hitcount spécifiée.

ip_list_hash_size=0
    Taille de la table de hachage. 0 signifie que cette taille doit être calculée en fonction de ip_list_tot en arrondissant ce dernier à la puissance de deux immédiatement supérieure (si ip_list_tot possède sa valeur par défaut 100, ip_list_hash_size prendra la valeur 128 par défaut).

ip_list_perms=0644
    Permissions des fichiers /proc/net/xt_recent/*.

ip_list_uid=0
    UID numérique du propriétaire des fichiers /proc/net/xt_recent/*.

ip_list_gid=0
    GID numérique du propriétaire des fichiers /proc/net/xt_recent/*.

  rpfilter
Ce module effectue un test par filtrage par chemin inverse sur un paquet. Si la réponse à un paquet devrait être envoyée par la même interface que celle par laquelle il est arrivé, le paquet correspondra. Notez qu’à la différence du filtrage par chemin inverse (rp_filter) intégré au noyau, les paquets protégés par IPSec ne font pas l’objet d’un traitement particulier. Si tel est votre souhait, combinez cette vérification de correspondance avec celle du module « policy ». De même, les paquets arrivant par l’interface loopback sont toujours autorisés. Cette vérification de correspondance ne peut être utilisée que dans la chaîne PREROUTING des tables raw ou mangle.

--loose
    Cette option permet de spécifier que le test de filtrage par chemin inverse doit réussir même si le dispositif de sortie sélectionné n’est pas celui attendu.

--validmark
    Utiliser aussi la valeur de « nfmark » du paquet lors de la détermination de la route du chemin inverse.

--accept-local
    Cette option permet d’accepter les paquets arrivant du réseau avec une adresse source qui est aussi assignée à la machine locale.

--invert
    Cette option permet d’inverser le résultat de la vérification de correspondance. Cette dernière sera positive pour les paquets qui ont échoué au test de filtrage par chemin inverse au lieu de l’être pour ceux qui ont réussi le test.

L’exemple suivant montre comment journaliser et supprimer les paquets qui échouent au test de filtrage par chemin inverse :

iptables -t raw -N RPFILTER

iptables -t raw -A RPFILTER -m rpfilter -j RETURN

iptables -t raw -A RPFILTER -m limit --limit 10/minute -j NFLOG --nflog-prefix "rpfilter drop"

iptables -t raw -A RPFILTER -j DROP

iptables -t raw -A PREROUTING -j RPFILTER

L’exemple suivant montre comment supprimer les paquets qui ont échoué, sans journalisation :

iptables -t raw -A RPFILTER -m rpfilter --invert -j DROP

  rt (spécifique à IPv6)
Ce module permet de vérifier la correspondance de l’en-tête de routage IPv6.

[!] --rt-type type
    Cette option permet de vérifier la correspondance du type (numérique).

[!] --rt-segsleft numéro[:numéro]
    Cette option permet de vérifier la correspondance du champ « segments restants » (intervalle).

[!] --rt-len taille
    Cette option permet de vérifier la correspondance de la taille de cet en-tête.

--rt-0-res
    Vérifier aussi la correspondance du champ réservé (type=0).

--rt-0-addrs adresse[,adresse...]
    Cette option permet de vérifier la correspondance des adresses type=0 (liste).

--rt-0-not-strict
    Cette option permet d’indiquer que la liste d’adresses type=0 n’est pas une liste stricte.

  sctp
Ce module permet de vérifier la correspondance des en-têtes du SCTP (Stream Control Transmission Protocol — protocole de transmission avec contrôle de flux).

[!] --source-port,--sport port[:port]

[!] --destination-port,--dport port[:port]

[!] --chunk-types {all|any|only} type_fragment[:drapeaux] [...]
    Si la lettre de drapeau est en capitale, le drapeau doit être comparé s’il est défini, sinon le drapeau doit être comparé s’il n’est pas défini.

    Types de vérification de correspondance :

all Correspondance si tous les types de fragment donnés sont présents et si les drapeaux correspondent.

any Correspondance si au moins un des types de fragment donnés est présent avec les drapeaux donnés.

only
    Correspondance si seuls les types de fragment donnés sont présents avec les drapeaux donnés et si aucun ne manque.

    Types de fragment : DATA, INIT, INIT_ACK, SACK, HEARTBEAT, HEARTBEAT_ACK, ABORT, SHUTDOWN, SHUTDOWN_ACK, ERROR, COOKIE_ECHO, COOKIE_ACK, ECN_ECNE, ECN_CWR, SHUTDOWN_COMPLETE, I_DATA, RE_CONFIG, PAD, ASCONF, ASCONF_ACK FORWARD_TSN et I_FORWARD_TSN.

    drapeaux de type de fragment disponibles
    DATA I U B E i u b e
    I_DATA I U B E i u b e
    ABORT T t
    SHUTDOWN_COMPLETE T t

    Les minuscules signifient que le drapeau doit être à « off », les capitales que le drapeau doit être à « on ».

Exemples :

iptables -A INPUT -p sctp --dport 80 -j DROP

iptables -A INPUT -p sctp --chunk-types any DATA,INIT -j DROP

iptables -A INPUT -p sctp --chunk-types any DATA:Be -j ACCEPT

  set
Ce module permet de vérifier la correspondance d’ensembles d’adresses IP qui peuvent être définis à l’aide de ipset(8).

[!] --match-set nom_ensemble drapeau[,drapeau]...
    où drapeau[,drapeau]... est une liste de spécifications src et/ou dst séparées par des virgules et dont le nombre est limité à 6. Ainsi la règle

     iptables -A FORWARD -m set --match-set test src,dst

    correspondra aux paquets pour lesquels (si le type d’ensemble est ipportmap) la paire adresse source/port destination existe dans l’ensemble spécifié. Si le type d’ensemble de l’ensemble spécifié est unidimensionnel (par exemple ipmap), la règle correspondra aux paquets pour lesquels l’adresse source existe dans l’ensemble spécifié.

--return-nomatch
    Si l’option --return-nomatch est spécifiée et si le type d’ensemble prend en charge le drapeau nomatch, la vérification de correspondance est inversée ; une correspondance vérifiée avec un élément ayant le drapeau nomatch activé renverra true, alors qu’une correspondance vérifiée avec un élément simple reverra false.

! --update-counters
    Si le drapeau --update-counters est inversé par négation, les compteurs d’octets et de paquets de l’élément qui correspond dans l’ensemble ne seront pas mis à jour. Par défaut, compteurs d’octets et de paquets sont mis à jour.

! --update-subcounters
    Si le drapeau --update-subcounters est inversé par négation, les compteurs d’octets et de paquets de l’élément qui correspond dans l'ensemble des membres d'un type de liste d'ensemble ne seront pas mis à jour. Par défaut, compteurs d’octets et de paquets sont mis à jour.

[!] --packets-eq valeur
    Si le paquet correspond à un élément de l’ensemble, la correspondance ne sera vérifiée que si en plus la valeur du compteur de paquets de l’élément est égale à la valeur donnée.

--packets-lt valeur
    Si le paquet correspond à un élément de l’ensemble, la correspondance ne sera vérifiée que si en plus la valeur du compteur de paquets de l’élément est inférieure à la valeur donnée.

--packets-gt valeur
    Si le paquet correspond à un élément de l’ensemble, la correspondance ne sera vérifiée que si en plus la valeur du compteur de paquets de l’élément est supérieure à la valeur donnée.

[!] --bytes-eq valeur
    Si le paquet correspond à un élément de l’ensemble, la correspondance ne sera vérifiée que si en plus la valeur du compteur d’octets est égale à la valeur donnée.

--bytes-lt valeur
    Si le paquet correspond à un élément de l’ensemble, la correspondance ne sera vérifiée que si en plus la valeur du compteur d’octets de l’élément est inférieure à la valeur donnée.

--bytes-gt valeur
    Si le paquet correspond à un élément de l’ensemble, la correspondance ne sera vérifiée que si en plus la valeur du compteur d’octets de l’élément est supérieure à la valeur donnée.

Les drapeaux et options en rapport avec les compteurs de paquets et d’octets sont ignorés lorsque l’ensemble a été défini sans prise en charge du comptage.

L’option --match-set peut être remplacée par --set si cela n’interfère pas avec une option d’une autre extension.

L’utilisation de « -m set » nécessite que le noyau prenne en charge le module ipset, ce qui est le cas, pour les noyaux standards, depuis Linux 2.6.39.

  socket
Ce module permet de vérifier la correspondance d’un paquet s’il est possible de trouver un socket TCP/UDP ouvert en effectuant une recherche de socket sur ce paquet. La correspondance est vérifiée s’il existe un socket en écoute établi ou à lien non nul (éventuellement avec une adresse non locale). La recherche est effectuée en utilisant le tuple packet des paquets TCP/UDP ou l’en-tête TCP/UDP original embedded dans un paquet d’erreur ICMP/ICPMv6.

--transparent
    Ignorer les sockets non transparents.

--nowildcard
    Ne pas ignorer les sockets liés à « n'importe quelle » adresse. Par défaut, la correspondance de socket n’acceptera pas de socket en écoute non lié, car dans ce cas, des services locaux pourraient intercepter le trafic qui autrement aurait été redirigé. Cette option présente donc des implications de sécurité lorsqu’elle est utilisée pour vérifier la correspondance d’un trafic redirigé pour renvoyer de tels paquets à la machine locale avec routage de politique. Lorsqu’on utilise la correspondance de socket pour implémenter des mandataires complètement transparents liés à des adresses non locales, il est recommandé d’utiliser plutôt l’option --transparent.

Exemple (en supposant que les paquets marqués 1 sont délivrés localement) :

    -t mangle -A PREROUTING -m socket --transparent -j MARK --set-mark 1

--restore-skmark
    Cette option permet de définir la marque du paquet avec la marque du socket correspondant. Elle peut être utilisée en combinaison avec les options --transparent et --nowildcard pour restreindre la correspondance des sockets au cas où la marque du paquet est restaurée.

Exemple : une application ouvre 2 sockets transparents (IP_TRANSPARENT) et leur définit une marque à l’aide de l’option de socket SO_MARK. Nous pouvons filtrer les paquets correspondants :

    -t mangle -I PREROUTING -m socket --transparent --restore-skmark -j action

    -t mangle -A action -m mark --mark 10 -j action2

    -t mangle -A action -m mark --mark 11 -j action3

  state
L’extension « state » est un sous-ensemble du module « conntrack ». Elle permet d’accéder à l’état du traçage de connexion pour le paquet concerné.

[!] --state état
    état est une liste des états de connexion à comparer séparés par des virgules. Seulement ce sous-ensemble des états pris en charge par « conntrack » est reconnu : INVALID, ESTABLISHED, NEW, RELATED ou UNTRACKED. Pour leur description, voir la section « conntrack » plus avant dans cette page de manuel.

  statistic
Ce module vérifie la correspondance des paquets en fonction de certaines conditions statistiques. Il prend en charge deux modes distincts qui peuvent être définis à l’aide de l’option --mode.

Options prises en charge :

--mode mode
    Cette option permet de définir le mode de vérification de correspondance de la règle ; les modes pris en charge sont random et nth.

[!] --probability p
    Cette option permet de définir la probabilité pour qu’un paquet corresponde de manière aléatoire. Elle ne peut être utilisée que dans le mode random. p doit être comprise entre 0.0 et 1.0. La granularité prise en charge possède un incrément de 1/2147483648.

[!] --every n
    Vérifier la correspondance d’un paquet sur n. Cette option ne peut être utilisée que dans le mode nth (voir aussi l’option --packet).

--packet p
    Cette option permet de définir la valeur initiale du compteur pour le mode nth (0 <= p <= n-1, par défaut 0).

  string
Ce module vérifie la correspondance de la chaîne donnée en utilisant une stratégie de comparaison de motifs. Il nécessite un noyau Linux de version supérieure ou égale à 2.6.14.

--algo {bm|kmp}
    Cette option permet de sélectionner une stratégie de comparaison de motifs (bm = Boyer-Moore, kmp = Knuth-Pratt-Morris).

--from décalage
    Cette option permet de définir le décalage à partir duquel la comparaison sera effectuée. La valeur par défaut est 0.

--to décalage
    Cette option permet de définir le nombre d’octets, à partir de l’octet 0 qui seront comparés. Autrement dit, décalage (compté à partir de 0) sera le numéro du dernier octet à être comparé et la position maximale du dernier caractère du motif. La valeur par défaut est la taille du paquet.

[!] --string motif
    Cette option permet de spécifier le motif à comparer.

[!] --hex-string motif
    Cette option permet de spécifier le motif à comparer en notation hexadécimale.

--icase
    Ignorer la casse lors de la comparaison.

Exemples :

    # Le motif peut contenir du texte simple.
    iptables -A INPUT -p tcp --dport 80 -m string --algo bm --string 'GET /index.html' -j LOG

    # Le motif en notation hexadécimale peut contenir des caractères non imprimables comme |0D 0A| ou |0D0A|.
    iptables -p udp --dport 53 -m string --algo bm --from 40 --to 57 --hex-string '|03|www|09|netfilter|03|org|00|'

Nota : étant donné que l’algorithme Boyer-Moore (BM) effectue sa comparaison de la droite vers la gauche, et que le noyau peut stocker un paquet sous forme de plusieurs blocs non contigus, il est possible qu’une comparaison soit répartie sur plusieurs blocs, auquel cas cet algorithme ne le trouvera pas.

Pour vous assurer qu’une telle situation ne se présente jamais, utilisez plutôt l’algorithme Knuth-Pratt-Morris (KMP). Pour résumer, choisissez l’algorithme de recherche de chaîne approprié à votre cas concret.

Par exemple, si vous utilisez le module pour le filtrage, NIDS ou tout filtrage similaire axé sur la sécurité, choisissez KMP. Par contre, si vous recherchez la performance — par exemple, si vous classez les paquets pour appliquer des politiques de qualité de service (QoS) — et si vous ne vous préoccupez pas de la perte éventuelle de paquets correspondants divisés en plusieurs fragments, choisissez BM.

  tcp
Ce module ne peut être utilisé que si « --protocol tcp » a été spécifié. Il prend en charge les options suivantes :

[!] --source-port,--sport port[:port]
    Cette option permet de spécifier le port ou une plage de ports source. port peut être un nom de service ou un numéro de port. Il est aussi possible de spécifier une plage fermée de ports sous la forme premier:dernier. Si premier est omis, la plage débutera à « 0 » ; si dernier est omis, la plage finira à « 65535 ». --sport est un alias pratique de cette option.

[!] --destination-port,--dport port[:port]
    Cette option permet de spécifier le port ou une plage de ports destination. --dport est un alias pratique de cette option.

[!] --tcp-flags masque comp
    Correspondance lorsque les drapeaux TCP sont tels que spécifiés. Le premier argument masque contient les drapeaux qui doivent être examinés, sous forme d’une liste séparée par des virgules ; le second argument comp est une liste des drapeaux séparés par des virgules qui doit être définie. Les drapeaux valables sont : SYN ACK FIN RST URG PSH ALL NONE. Ainsi la commande
     iptables -A FORWARD -p tcp --tcp-flags SYN,ACK,FIN,RST SYN
    ne concernera que les paquets dont le drapeau SYN est défini et dont les drapeaux ACK, FIN et RST ne le sont pas.

[!] --syn
    Correspondance uniquement aux paquets dont le bit SYN est positionné et dont les bits ACK, RST et FIN ne le sont pas. De tels paquets sont utilisés pour demander l’ouverture d’une connexion TCP ; par exemple, bloquer de tels paquets entrant par une interface empêchera les connexions TCP entrantes, alors que les connexions TCP sortantes ne seront pas affectées. Cette option est équivalente à --tcp-flags SYN,RST,ACK,FIN SYN.

[!] --tcp-option numéro
    Correspondance si l’option TCP est définie.

  tcpmss
Ce module permet de vérifier la correspondance du champ TCP MSS (Maximum Segment Size — taille maximale de segment) de l’en-tête TCP. Il ne peut être utilisé qu’avec les paquets TCP SYN ou SYN/ACK, car la MSS n’est négociée que durant la « poignée de main » TCP au moment du lancement de la connexion.

[!] --mss valeur[:valeur]
    Cette option permet de vérifier la correspondance d’une valeur ou d’un intervalle de valeurs de TCP MSS. Si un intervalle est spécifié, la seconde valeur doit être supérieure ou égale à la première.

  time
Ce module permet de vérifier la correspondance du moment d’arrivée d’un paquet avec un intervalle de temps donné. Toutes les options sont facultatives, mais elles sont combinées avec un ET logique si elles sont présentes. Tous les temps sont interprétés en UTC par défaut.

--datestart AAAA[-MM[-JJ[Thh[:mm[:ss]]]]]

--datestop AAAA[-MM[-JJ[Thh[:mm[:ss]]]]]
    Ces options permettent de spécifier un intervalle de temps, exprimé en notation « T » de la norme ISO 8601, pendant lequel la correspondance d’un paquet sera vérifiée. L’intervalle de temps maximal est 1970-01-01T00:00:00 à 2038-01-19T04:17:07.

    Si --datestart ou --datestop ne sont pas spécifiés, leur valeur par défaut sera 1970-01-01 et 2038-01-19, respectivement.

--timestart hh:mm[:ss]

--timestop hh:mm[:ss]
    Ces options permettent de spécifier un intervalle de temps journalier pendant lequel la correspondance d’un paquet sera vérifiée. L’intervalle de temps maximal est 00:00:00 à 23:59:59. Les valeurs commençant par zéro sont autorisées (comme « 06:03 ») et correctement interprétées en base 10.

[!] --monthdays jour[,jour...]
    Cette option permet de spécifier les jours du mois au cours desquels la correspondance d’un paquet sera vérifiée. Les valeurs possibles vont de 1 à 31. Notez que spécifier 31 ne correspondra pas pour les mois qui n’ont pas de 31ème jour ; même remarque pour les mois de février à 28 ou 29 jours.

[!] --weekdays jour[,jour...]
    Cette option permet de spécifier les jours de la semaine au cours desquels la correspondance d’un paquet sera vérifiée. Les valeurs possibles sont Mon, Tue, Wed, Thu, Fri, Sat et Sun ou des nombres de 1 à 7, respectivement. Vous pouvez aussi utiliser des variantes à deux caractères (Mo, Tu, etc.).

--contiguous
    Lorsque --timestop est inférieur à --timestart, considérer cela comme un simple intervalle et non comme des intervalles distincts pour la comparaison. Voir EXEMPLES.

--kerneltz
    Utiliser la zone horaire du noyau au lieu d’UTC pour déterminer si un paquet correspond aux contraintes de temps.

À propos des zone horaires du noyau : Linux conserve systématiquement l’heure système en UTC. Au démarrage, l’heure système est initialisée à partir d’une source de temps de référence. Lorsque cette source de temps n’a pas d’informations à propos de la zone horaire, comme l’horloge CMOS RTC d’x86, la zone UTC sera présumée. Si la source de temps n’est pas en UTC, l’espace utilisateur devra fournir l’heure système et la zone horaire correctes au noyau lorsqu’il aura obtenu cette information.

L’heure locale est une fonctionnalité qui s’ajoute à l’heure système (indépendante de la zone horaire). Chaque processus possède sa propre idée du temps local défini à l’aide de la variable d’environnement TZ. Le noyau possède aussi sa propre variable exprimant le décalage de la zone horaire. La variable d’environnement en espace utilisateur TZ spécifie comment l’heure système basée sur UTC est affichée, par exemple lorsque vous exécutez date(1) ou ce qu’affiche votre horloge de bureau. La chaîne TZ peut présenter des décalages différents en fonction de la date, ce qui provoque un saut de temps automatique dans l’espace utilisateur lorsque le DST (Daylight Saving Time — heure d’été) change. La variable du noyau exprimant le décalage de la zone horaire lui permet de convertir des temps en provenance de sources non UTC, comme les systèmes de fichiers FAT, vers des temps UTC (car c’est ces derniers qu’utilise le reste du système).

Le problème avec la zone horaire du noyau réside dans le fait que les distributions Linux peuvent ignorer la définition de la zone horaire du noyau et ne définir que l’heure système. Même si une distribution particulière définit la zone horaire au démarrage, elle ne maintient en général pas à jour le décalage de la zone horaire du noyau qui change avec l’heure d’été. ntpd(8) n’affectant pas la zone horaire du noyau, il est inutile de l’exécuter pour résoudre ce problème. Ainsi, il est possible d’avoir une zone horaire toujours égale à +0000 ou fausse pendant la moitié de l’année ; c’est pourquoi l’utilisation de --kerneltz est fortement déconseillée.

EXEMPLES. Pour que les paquets correspondent pendant les weekends, utilisez :

    -m time --weekdays Sa,Su

Ou, pour que les paquets correspondent (une seule fois) pendant une période de vacances nationales :

    -m time --datestart 2007-12-24 --datestop 2007-12-27

Comme l’heure de fin est exactement inclusive, vous devez utiliser le moment de fin suivant pour exclure de la correspondance la première seconde du jour suivant :

    -m time --datestart 2007-01-01T17:00 --datestop 2007-01-01T23:59:59

Pendant la pause déjeuner :

    -m time --timestart 12:30 --timestop 13:30

Le quatrième vendredi du mois :

    -m time --weekdays Fr --monthdays 22,23,24,25,26,27,28

Notez que cet exemple exploite une certaine propriété mathématique. Il n’est pas possible d’exprimer « quatrième jeudi OU quatrième vendredi » à l’aide d’une seule règle ; il est cependant possible de le faire à l’aide de plusieurs règles.

Vérifier une correspondance à cheval sur deux jours peut donner des résultats inattendus. Par exemple,

    « -m time --weekdays Mo --timestart 23:00 --timestop 01:00 » correspondra à la période du lundi pendant une heure de minuit à 1 heure du matin et pendant une autre heure à partir de 23 heures. Si ce n’est pas ce que vous souhaitez, par exemple si vous voulez « vérifier la correspondance pendant deux heures à partir du lundi à 23 heures », vous devez ajouter l’option --contiguous dans cet exemple.

  tos
Ce module vérifie la correspondance du champ sur 8 bits « Type of Service » de l’en-tête IPv4 (bits « Precedence » inclus) ou du champ « Priority » (aussi sur 8 bits) de l’en-tête IPv6.

[!] --tos valeur[/masque]
    Cette option permet de vérifier la correspondance des paquets avec la valeur de marque TOS donnée. Si un masque est spécifié, il est combiné à l’aide d’un ET logique avec la marque TOS avant la comparaison.

[!] --tos symbole
    Vous pouvez aussi spécifier un nom symbolique lors de la recherche de correspondance à l’aide du module tos pour IPv4. La liste des noms TOS reconnus peut être obtenue en appelant iptables suivi de -m tos -h. Notez que cela implique un masque de 0x3F, c’est-à-dire tous les bits sauf les bits ECN (Explicit Congestion Notification — notification explicite de congestion).

  ttl (spécifique à IPv4)
Ce module vérifie la correspondance du champ durée de vie de l’en-tête IP.

[!] --ttl-eq ttl
    Correspondance de la valeur de TTL donnée.

--ttl-gt ttl
    Correspondance si la durée de vie du paquet est supérieure à la valeur de TTL donnée.

--ttl-lt ttl
    Correspondance si la durée de vie du paquet est inférieure à la valeur de TTL donnée.

  u32
Ce module teste si des quantités de4 octets maximum extraites d’un paquet possèdent les valeurs spécifiées. Spécifier ce qu’il faut extraire suffit en général pour trouver des données à des décalages donnés dans les en-têtes tcp ou les charges utiles.

[!] --u32 tests
    L’argument consiste en un programme dans un langage simple décrit ci-après.

    tests := emplacement "=" valeur | tests "&&" emplacement "=" valeur

    valeur := intervalle | valeur "," intervalle

    intervalle := nombre | nombre ":" nombre

un nombre seul, n, est interprété comme n:n. n:m est interprété comme l’intervalle des nombres >=n et <=m.

    emplacement := nombre | emplacement opérateur nombre

    opérateur := "&" | "<<" | ">>" | "@"

Les opérateurs &, <<, >> et && ont la même signification qu’en C. L’opérateur = est réellement un opérateur d'appartenance à un ensemble et la syntaxe des valeurs décrit un ensemble. L’opérateur @ permet de se déplacer vers l’en-tête suivant et est décrit plus loin.

Il existe actuellement des limites d’implémentation artificielles sur la taille des tests :

–   pas plus de 10 « = » (et 9 « && ») dans l’argument d’u32

–   pas plus de 10 intervalles (et 9 virgules) par valeur

–   pas plus de 10 nombres (et 9 opérateurs) par emplacement

Pour expliquer la signification d’un emplacement, imaginez la machine suivante qui l’interprète. Il y a trois registres :

    A est de type char *, initialement l’adresse de l’en-tête IP

    B et C sont des entiers non signés sur 32 bits, initialement égaux à 0.

Les instructions sont :

nombre
    B = nombre;

    C = (*(A+B)<<24) + (*(A+B+1)<<16) + (*(A+B+2)<<8) + *(A+B+3)

&nombre
    C = C & nombre

<< nombre
    C = C << nombre

>> nombre
    C = C >> nombre

@nombre
    A = A + C ; puis exécutez l’instruction nombre

Tout accès à la mémoire en dehors de [skb->data,skb->end] fera échouer la recherche de correspondance. Sinon, le résultat du calcul est la valeur finale de C.

Les blancs sont autorisés mais non obligatoires dans les tests. Cependant, les caractères présents dans ces derniers sont susceptibles de nécessiter une protection vis-à-vis de l’interpréteur de commande, et il est donc recommandé d’entourer les arguments de guillemets.

Exemple :

    rechercher les paquets IP d’une taille totale supérieure ou égale à 256 octets.

    L’en-tête IP contient un champ longueur totale dans les octets 2 et 3.

    --u32 "0 & 0xFFFF = 0x100:0xFFFF"

    lire les octets 0 à 3

    les combiner à l’aide d’un ET logique avec 0xFFFF (ce qui donne les octets 2 et 3) et vérifie si le résultat est dans la plage [0x100:0xFFFF].

Exemple plus réaliste, donc plus compliqué :

    rechercher les paquets avec un icmp de type 0

    Tout d’abord, vérifier s’il s’agit d’un paquet ICMP ; c’est le cas si l’octet 9 (protocole) est égal à 1.

    --u32 "6 & 0xFF = 1 && ...

    lire les octets 6 à 9, utiliser l’opérateur & pour supprimer les octets 6 à 8 et comparer le résultat avec 1. Vérifier ensuite qu’il ne s’agit pas d’un fragment (si c’est le cas, il pourra appartenir à un tel paquet, mais ce n’est pas systématique). Notez que ce test est en général nécessaire si vous voulez vérifier la correspondance de toute donnée au delà de l’en-tête IP. S’il s’agit d’un paquet complet (et non d’un fragment), les 6 derniers bits de l’octet 6 et tous ceux de l’octet 7 seront à 0. Autrement, vous pouvez autoriser les premiers fragments en ne testant que les 5 derniers bits de l’octet 6.

    ... 4 & 0x3FFF = 0 && ...

    Dernier test : le premier octet après l’en-tête IP (le type) est à 0. C’est ici que nous devons utiliser l’opérateur « @ ». La taille de l’en-tête IP (IHL) en mots de 32 bits est stockée dans la moitié droite de l’octet 0 de l’en-tête IP lui-même.

    ... 0 >> 22 & 0x3C @ 0 >> 24 = 0"

    Le premier 0 signifie « lire les octets 0 à 3 », et >>22 « décaler le résultat de 22 bits vers la droite. Un décalage de 24 bits donnerait le premier octet ; donc un décalage de seulement 22 bits correspond à quatre fois cela plus quelques octets supplémentaires. Ensuite, &3C élimine les deux bits supplémentaires à droite et les quatre premiers bits du premier octet. Par exemple, si IHL=5, la taille de l’en-tête IP est de 20 (4 x 5) octets. Dans notre cas, les octets 0 et 1 contiennent (en binaire) xxxx0101 yyzzzzzz, >>22 donne la valeur sur 10 bits xxxx0101yy et &3C donne 010100. @ indique qu’il faut utiliser ce nombre comme nouveau décalage dans le paquet et lire quatre octets à partir de cette nouvelle position. Ce sont les 4 premiers octets de la charge utile ICMP dont l’octet 0 correspond au type ICMP. Il ne nous reste donc qu’à décaler la valeur de 24 vers la droite pour tout éliminer, sauf le premier octet, et à comparer le résultat à 0.

Exemple :

    Les octets 8 à 12 de la charge utile TCP ont pour valeur 1, 2, 5 ou 8.

    Tout d’abord, vérifier qu’il s’agit d’un paquet TCP (similaire à ICMP).

    --u32 "6 & 0xFF = 6 && ...

    Ensuite, vérifier qu’il ne s’agit pas d’un fragment (comme ci-avant).

    ... 0 >> 22 & 0x3C @ 12 >> 26 & 0x3C @ 8 = 1,2,5,8"

    Comme ci-avant, 0>>22&3C calcule le nombre d’octets contenus dans l’en-tête IP. L’opérateur @ fait du résultat le nouveau décalage dans le paquet qui correspond au début de l’en-tête TCP. La taille de l’en-tête TCP (toujours en mots de 32 bits) est stockée dans la moitié gauche de l’octet 12 de l’en-tête TCP. 12>>26&3C convertit cette longueur en octets (comme précédemment pour l’en-tête IP). « @ » fait du résultat le nouveau décalage qui correspond au début de la charge utile TCP. Enfin, « 8 » lit les octets 8 à 12 de la charge utile et = vérifie si le résultat est égal à 1, 2, 5 ou 8.

  udp
Ce module ne peut être utilisé que si l’option « --protocol udp » est spécifiée. Il prend en charge les options suivantes :

[!] --source-port,--sport port[:port]
    Cette option permet de spécifier le port ou la plage de ports source. Voir la description de l’option --source-port de l’extension TCP pour les détails.

[!] --destination-port,--dport port[:port]
    Cette option permet de spécifier le port ou la plage de ports destination. Voir la description de l’option --destination-port de l’extension TCP pour les détails.

ACTIONS ÉTENDUES
iptables peut utiliser des modules d’action étendue ; les actions suivantes sont incluses dans la distribution standard :

  AUDIT
Cette action crée des enregistrements d’audit pour les paquets qui l’atteignent. Elle permet d’enregistrer les paquets acceptés, éliminés et rejetés. Voir auditd(8) pour plus de détails.

--type {accept|drop|reject}
    Cette option permet de définir le type d’enregistrement d’audit. À partir de Linux 4.12, cette option n’a plus d’effet sur les messages d’audit générés. Elle est encore acceptée par iptables pour des raisons de compatibilité, mais ignorée.

Exemple :

    iptables -N AUDIT_DROP

    iptables -A AUDIT_DROP -j AUDIT

    iptables -A AUDIT_DROP -j DROP

  CHECKSUM
Cette action contourne sélectivement les applications défectueuses ou obsolètes. Elle ne peut être utilisée que dans la table mangle.

--checksum-fill
    Cette option permet de calculer et inscrire la somme de contrôle dans un paquet qui en est dépourvu. Elle s’avère particulièrement utile si vous devez contourner des applications anciennes comme les clients dhcp qui ne gèrent pas bien les déchargements de somme de contrôle, et ne souhaitez pas désactiver le déchargement de somme de contrôle dans votre dispositif.

  CLASSIFY
Cette action permet de définir la valeur de skb->priority, et ainsi ranger le paquet dans une classe CBQ (Class-Based Queuing — mise en file d’attente en fonction de la classe) spécifique.

--set-class majeur:mineur
    Cette option permet de définir les valeurs majeure et mineure de la classe. Les valeurs sont toujours interprétées en hexadécimal, même si le préfixe 0x n’est pas spécifié.

  CLUSTERIP (spécifique à IPv4)
Cette action permet de configurer une grappe simple de nœuds qui partagent une adresse IP et MAC sans répartiteur de charge explicite en frontal. Les connexions sont réparties statistiquement entre les nœuds de cette grappe.

Notez que l’action CLUSTERIP est considérée comme obsolète par rapport au module de correspondance cluster qui est plus souple et non limité à IPv4.

--new
    Cette option permet de créer un nouveau ClusterIP. Vous devez toujours la définir dans la première règle concernant un ClusterIP donné.

--hashmode mode
    Cette option permet de spécifier le mode de hachage. Les valeurs possibles sont sourceip, sourceip-sourceport ou sourceip-sourceport-destport.

--clustermac mac
    Cette option permet de spécifier l’adresse MAC du ClusterIP. Ce doit être une adresse multicast de la couche liaison.

--total-nodes nombre
    Cette option permet de spécifier le nombre total de nœuds que comporte cette grappe.

--local-node numéro
    Cette option permet de spécifier le numéro de nœud de la machine locale au sein de cette grappe.

--hash-init aléa
    Cette option permet de spécifier la graine aléatoire utilisée pour l'initialisation du hachage.

  CONNMARK
Cette action définit la valeur (sur 32 bits) de la marque netfilter associée à une connexion.

--set-xmark valeur[/masque]
    Cette option met à zéro les bits donnés par masque et effectue un XOR entre la ctmark (marque de connexion) et la valeur.

--save-mark [--nfmask masque_nf] [--ctmask masque_ct]
    Cette option copie la marque de paquet (nfmark) vers la marque de connexion (ctmark) en utilisant les masques donnés. La nouvelle valeur de la marque de paquet nfmark est déterminée comme suit :

    ctmark = (ctmark & ~ctmask) ^ (nfmark & nfmask)

    Autrement dit, masque_ct détermine les bits à mettre à zéro et masque_nf les bits de nfmark à combiner à l’aide d’un XOR avec la ctmark. La valeur par défaut de masque_ct et masque_nf est 0xFFFFFFFF.

--restore-mark [--nfmask masque_nf] [--ctmask masque_ct]
    Cette option copie la marque de connexion (ctmark) vers la marque de paquet (nfmark) en utilisant les masques donnés. La nouvelle valeur de ctmark est déterminée comme suit :

    nfmark = (nfmark & ~nfmask) ^ (ctmark & ctmask);

    Autrement dit, masque_nf détermine les bits à mettre à zéro et masque_ct les bits de ctmark à combiner à l’aide d’un XOR avec la nfmark. La valeur par défaut de masque_ct et masque_nf est 0xFFFFFFFF.

    --restore-mark ne peut être utilisée que dans la table mangle.

Les mnémoniques valables pour --set-xmark sont les suivants :

--and-mark bits
    Effectuer un ET logique entre la ctmark et bits (le mnémonique pour --set-xmark 0/invbits où invbits est la négation binaire de bits).

--or-mark bits
    Effectuer un OU logique entre la ctmark et bits (le mnémonique pour --set-xmark bits/bits).

--xor-mark bits
    Effectuer un XOR logique entre la ctmark et bits (le mnémonique pour --set-xmark bits/0).

--set-mark valeur[/masque]
    Cette option permet de définir la marque de connexion. Si un masque est spécifié, seuls les bits correspondant aux bits positionnés du masque seront modifiés.

--save-mark [--mask masque]
    Cette option permet de copier la marque de paquet nfmark vers la marque de connexion ctmark. Si un masque est spécifié, seuls les bits correspondant aux bits positionnés du masque seront copiés.

--restore-mark [--mask masque]
    Cette option permet de copier la marque de connexion ctmark vers la marque de paquet nfmark. Si un masque est spécifié, seuls les bits correspondant aux bits positionnés du masque seront copiés. Cette option ne peut être utilisée que dans la table mangle.

  CONNSECMARK
Cette action permet de copier les marquages de sécurité depuis les paquets vers les connexions (si non étiquetées), et depuis les connexions vers les paquets (là encore, si non étiquetés). Utilisée en général en combinaison avec l’action SECMARK, elle peut être utilisée dans la table security (à des fins de rétrocompatibilité avec les noyaux plus anciens, elle peut aussi être utilisée dans la table mangle).

--save
    Si le paquet possède un marquage de sécurité, copier ce dernier vers la connexion si elle n’est pas marquée.

--restore
    Si la connexion possède un marquage de sécurité, copier ce dernier vers le paquet s’il n’en possède pas déjà un.

  CT
L’action CT permet de définir les paramètres d’un paquet ou de la connexion qui lui est associée. Elle attache un « modèle » d’entrée de traçage de connexion au paquet, ce modèle étant ensuite utilisé par le cœur de conntrack lors de l’initialisation d’une nouvelle entrée ct. Cette action ne peut donc être utilisée que dans la table raw.

--notrack
    Désactiver le traçage de connexion pour ce paquet.

--helper nom
    Utiliser l’assistant identifié à l’aide de nom pour la connexion. Utiliser cette option est plus souple que charger les modules d’assistant de conntrack avec des ports prédéfinis.

--ctevents evènement[,...]
    Ne générer que les évènements de conntrack spécifiés pour cette connexion. Les types d’évènement valables sont : new, related, destroy, reply, assured, protoinfo, helper, mark (ce type d’évènement fait référence à la ctmark, pas à la nfmark), natseqinfo et secmark (ctsecmark).

--expevents évènement[,...]
    Ne générer que les événements d'attente spécifiés pour cette connexion. Le type d’évènement valable est : new.

--zone-orig {id|mark}
    Assigner ce paquet à la zone id pour le trafic venant de la direction ORIGINAL et n’effectuer des recherches que dans cette zone. Si mark est spécifié à la place de id, la zone est dérivée de la marque de paquet nfmark.

--zone-reply {id|mark}
    Assigner ce paquet à la zone id pour le trafic venant de la direction REPLY et n’effectuer des recherches que dans cette zone. Si mark est spécifié à la place de id, la zone est dérivée de la marque de paquet nfmark.

--zone {id|mark}
    Assigner ce paquet à la zone id et n’effectuer des recherches que dans cette zone. Si mark est spécifié à la place de id, la zone est dérivée de la marque de paquet nfmark. Par défaut les paquets ont pour zone 0. Cette option s’applique aux deux directions.

--timeout nom
    Utiliser la politique de délai d’expiration identifiée par nom pour la connexion. Cette option permet une définition plus souple de la politique de délai d’expiration que les valeurs de délai d’expiration global disponibles dans /proc/sys/net/netfilter/nf_conntrack_*_timeout_*.

  DNAT
Cette action ne peut être utilisée que dans la table nat, dans les chaînes PREROUTING et OUTPUT, et dans les chaînes définies par l’utilisateur qui sont appelées depuis ces chaînes. Elle indique que l’adresse de destination du paquet doit être modifiée (et que tous les paquets ultérieurs de cette connexion seront aussi modifiés), et que l’examen des règles doit cesser. Elle accepte les options suivantes :

--to-destination [adr_ip[-adr_ip]][:port[-port[/port_de_base]]]
    which can specify a single new destination IP address, an inclusive range of IP addresses. Optionally a port range, if the rule also specifies one of the following protocols: tcp, udp, dccp or sctp. If no port range is specified, then the destination port will never be modified. If no IP address is specified then only the destination port will be modified. If baseport is given, the difference of the original destination port and its value is used as offset into the mapping port range. This allows one to create shifted portmap ranges and is available since kernel version 4.18. For a single port or baseport, a service name as listed in /etc/services may be used. If ipaddr is an IPv4 loopback address (i.e. 127.0.0.0/8) the "net.ipv4.conf.*.route_localnet" sysctl for the input interface needs to be set to 1. Otherwise packets will be dropped by the routing code as "martians".

--random
    Rendre aléatoire la redirection du port source (noyaux >= 2.6.22).

--persistent
    Attribuer à un client les mêmes adresses source et destination pour chaque connexion. Cette option l’emporte sur l’action SAME. La redirection persistante est prise en charge depuis la version 2.6.29-rc2.

IPv6 est pris en charge depuis la version 3.7 du noyau Linux.

  DNPT (spécifique à IPv6)
Cette action permet d’effectuer une translation IPv6 à IPv6 sans conservation d’état (stateless) du préfixe réseau de destination (comme décrit dans la RFC 6296).

Vous devez utiliser cette action dans la table mangle, pas dans la table nat. Elle accepte les options suivantes :

--src-pfx [préfixe/taille]
    Définir le préfixe source que vous voulez traduire, ainsi que sa taille.

--dst-pfx [préfixe/taille]
    Définir le préfixe de destination que vous voulez utiliser dans la traduction, ainsi que sa taille.

Pour annuler la traduction, vous devez utiliser l’action SNPT. Exemple :

    ip6tables -t mangle -I POSTROUTING -s fd00::/64 ! -o vboxnet0 -j SNPT --src-pfx fd00::/64 --dst-pfx 2001:e20:2000:40f::/64

    ip6tables -t mangle -I PREROUTING -i wlan0 -d 2001:e20:2000:40f::/64 -j DNPT --src-pfx 2001:e20:2000:40f::/64 --dst-pfx fd00::/64

Vous devrez peut-être activer le mandataire d’hôtes voisins IPv6 :

    sysctl -w net.ipv6.conf.all.proxy_ndp=1

Vous devez aussi utiliser l’action NOTRACK pour désactiver le traçage de connexion pour les flux traduits.

  DSCP
Cette action modifie la valeur des bits DSCP (Differentiated Services Code Point — valeur de code des services différenciés) au sein de l’en-tête TOS (Type of Service — type de service) du paquet IPv4. Comme elle manipule un paquet, elle ne peut être utilisée que dans la table mangle.

--set-dscp valeur
    Affecter une valeur numérique au champ DSCP (en décimal ou hexadécimal).

--set-dscp-class classe
    Affecter une classe de DiffServ (Differentiated Services) au champ DSCP.

  ECN (spécifique à IPv4)
Cette action contourne de manière sélective les trous noirs ECN (Explicit Congestion Notification — notification explicite de congestion) connus. Elle ne peut être utilisée que dans la table mangle.

--ecn-tcp-remove
    Supprimer tous les bits ECN de l’en-tête TCP. Bien entendu, cette option ne peut être utilisée qu’en combinaison avec -p tcp.

  HL (spécifique à IPv6)
Cette action permet de modifier le champ « Hop Limit » de l’en-tête IPv6. Le champ « Hop Limit » est similaire à la valeur de TTL (Time To Live — durée de vie) en IPv4. Définir ou incrémenter la valeur du champ « Hop Limit » peut s’avérer très dangereux et il faut par conséquent éviter de le faire à tout prix. Cette action ne peut être utilisée que dans la table mangle.

Ne définissez ou incrémentez jamais cette valeur pour les paquets qui quittent votre réseau local !

--hl-set valeur
    Définir « Hop Limit » à valeur.

--hl-dec valeur
    Décrémenter « Hop Limit » un nombre de fois égal à valeur.

--hl-inc valeur
    Incrémenter « Hop Limit » un nombre de fois égal à valeur.

  HMARK
Cette action est similaire à MARK, c’est-à-dire qu’elle définit la marque fwmark (marque de pare-feu), mais que cette dernière est calculée en hachant le sélecteur de paquet choisi. Vous devez aussi spécifier la plage de marquage et éventuellement le décalage à partir duquel démarrer. Les messages d’erreur ICMP (Internet Control Message Protocol — Protocole de message de contrôle sur Internet) sont inspectés et utilisés pour calculer le hachage.

Les options disponibles sont :

--hmark-tuple tuple
    Les membres du tuple possibles sont : src pour adresse source (adresses IPv4 ou IPv6), dst pour adresse de destination (adresses IPv4 ou IPv6), sport pour port source (TCP, UDP, UDPlite, SCTP, DCCP), dport pour port de destination (TCP, UDP, UDPlite, SCTP, DCCP), spi pour « Security Parameter Index » (AH, ESP) et ct pour utilisation du tuple conntrack à la place des sélecteurs de paquet.

--hmark-mod valeur (doit être supérieure à 0)
    Modulus pour le calcul du hachage (afin de limiter la plage de marques possibles).

--hmark-offset valeur
    Décalage à partir duquel démarrer les marques.

Pour une utilisation avancée, au lieu d’utiliser --hmark-tuple, vous pouvez spécifier
    des préfixes et des masques personnalisés :

--hmark-src-prefix cidr
    Le masque d’adresse source en notation CIDR.

--hmark-dst-prefix cidr
    Le masque d’adresse de destination en notation CIDR.

--hmark-sport-mask valeur
    Un masque de port source sur 16 bits en hexadécimal.

--hmark-dport-mask valeur
    Un masque de port de destination sur 16 bits en hexadécimal.

--hmark-spi-mask valeur
    Un champ de 32 bits avec le masque spi.

--hmark-proto-mask valeur
    Un champ sur 8 bits avec le numéro du protocole de la couche 4.

--hmark-rnd valeur
    Une valeur personnalisée quelconque sur 32 bits pour amorcer le calcul du hachage.

Exemples :

iptables -t mangle -A PREROUTING -m conntrack --ctstate NEW
 -j HMARK --hmark-tuple ct,src,dst,proto --hmark-offset 10000 --hmark-mod 10 --hmark-rnd 0xcafedeca

iptables -t mangle -A PREROUTING -j HMARK --hmark-offset 10000 --hmark-tuple src,dst,proto --hmark-mod 10 --hmark-rnd 0xfadeface

  IDLETIMER
Cette action permet de détecter le moment où des interfaces sont inactives depuis un certain temps. Les minuteurs sont identifiés par des étiquettes et sont créés lorsqu’une règle est définie avec une nouvelle étiquette. Les règles acceptent aussi une valeur de délai (en secondes) en tant qu’option. Si plusieurs règles utilisent la même étiquette de minuteur, ce dernier sera redémarré chaque fois qu’une de ces règles s’applique à un paquet. Une entrée est créée pour chaque minuteur dans sysfs(5). Cet attribut contient le temps restant avant expiration du minuteur. Les attributs sont situés sous la classe xt_idletimer :

/sys/class/xt_idletimer/timers/<étiquette>

Lorsque le minuteur arrive à expiration, le module de l’action envoie une notification sysfs(5) vers l’espace utilisateur, ce dernier pouvant alors décider quoi faire (par exemple se déconnecter pour économiser de l’énergie).

--timeout valeur
    La valeur de délai en secondes après laquelle la notification sera envoyée.

--label chaîne
    Un identifiant unique pour chaque minuteur. La taille maximale de la chaîne est de 27 caractères.

  LED
Cette action permet de créer un déclencheur de LED (Light-Emitting Diode — diode électroluminescente) qui peut alors être relié aux voyants de l’indicateur du système en les allumant ou les faisant clignoter lorsque certains paquets traversent le système. Par exemple, une LED pourrait s’allumer pendant quelques minutes chaque fois qu’une connexion SSH est établie avec la machine locale. Le comportement du déclencheur peut être contrôlé à l’aide des options suivantes :

--led-trigger-id nom
    Le nom donné au déclencheur de LED. Le véritable nom du déclencheur sera préfixé par « netfilter- ».

--led-delay ms
    Le temps (en millisecondes) pendant lequel la LED devra rester allumée lorsqu’un paquet arrive avant d’être éteinte. La valeur par défaut est 0 (clignoter aussi vite que possible). Pour que la LED reste allumée en permanence une fois activée, utilisez la valeur spéciale inf (dans ce cas, le déclencheur devra être détaché et attaché à nouveau manuellement au dispositif à LED pour éteindre cette dernière).

--led-always-blink
    Toujours faire clignoter la LED à l’arrivée d’un paquet, même si cette dernière est déjà allumée. Cette option permet de notifier l’arrivée de nouveaux paquets, même avec de grandes valeurs de délai (autrement, le délai serait simplement prolongé de manière silencieuse).

Exemple :

Créer un déclencheur de LED pour le trafic SSH entrant :
    iptables -A INPUT -p tcp --dport 22 -j LED --led-trigger-id ssh

puis relier le nouveau déclencheur à une LED :
    echo netfilter-ssh >/sys/class/leds/nom_led/trigger

  LOG
Cette action permet d’activer la journalisation des paquets qui correspondent au niveau du noyau. Lorsqu’elle est utilisée dans une règle, le noyau Linux enregistre certaines informations à propos de tous les paquets qui correspondent (comme la plupart des champs d’en-tête IP/IPv6) dans le journal du noyau (d’où elles peuvent être consultées à l’aide de dmesg(1) ou lues dans le journal du système).

Cette action est « non terminale », c’est-à-dire que le parcours des règles continue à la règle suivante. Ainsi, si vous voulez journaliser les paquets que vous refusez, utilisez deux règles séparées avec les mêmes critères de correspondance, la première utilisant l’action LOG et la seconde la cible DROP (ou REJECT).

--log-level niveau
    Le niveau de journalisation qui peut être un nombre (spécifique au système) ou un mnémonique. Les valeurs possibles sont (dans l’ordre décroissant des priorités) : emerg, alert, crit, error, warning, notice, info ou debug.

--log-prefix préfixe
    Faire débuter les messages de journalisation par le préfixe spécifié (jusqu’à 29 lettres de long), ce qui permet de distinguer les messages dans les journaux.

--log-tcp-sequence
    Journaliser les numéros de séquence TCP. Cette option induit un risque de sécurité si le journal est accessible en lecture pour les utilisateurs.

--log-tcp-options
    Journaliser les options de l’en-tête du paquet TCP.

--log-ip-options
    Journaliser les options de l’en-tête du paquet IP/IPv6.

--log-uid
    Journaliser l’UID du processus qui a généré le paquet.

--log-macdecode
    Journaliser les adresses MAC et le protocole.

  MARK
Cette action permet de définir la valeur de la marque de Netfilter associée au paquet. Par exemple, vous pouvez l’utiliser conjointement avec un routage basé sur la marque de pare-feu fwmark (nécessite iproute2). Si vous envisagez de le faire, notez que pour affecter le routage, la marque doit être définie soit dans la chaîne PREROUTING, soit dans la chaîne OUTPUT de la table mangle. La taille du champ de la marque est de 32 bits.

--set-xmark valeur[/masque]
    Mettre à zéro les bits donnés par masque et combiner valeur avec la marque de paquet (« nfmark ») à l’aide d’un XOR. Si masque est omis, sa valeur par défaut est 0xFFFFFFFF.

--set-mark valeur[/masque]
    Mettre à zéro les bits donnés par masque et combiner valeur avec la marque de paquet à l’aide d’un OU logique. Si masque est omis, sa valeur par défaut est 0xFFFFFFFF.

Les mnémoniques suivants sont disponibles :

--and-mark bits
    Combiner la nfmark avec bits à l’aide d’un ET logique (c’est le mnémonique pour --set-xmark 0/invbits où invbits est la négation logique de bits).

--or-mark bits
    Combiner la nfmark avec bits à l’aide d’un OU logique (c’est le mnémonique pour --set-xmark bits/bits).

--xor-mark bits
    Combiner la nfmark avec bits à l’aide d’un XOR (c’est le mnémonique pour --set-xmark bits/0).

  MASQUERADE
Cette action n’est valable que dans la table nat et la chaîne POSTROUTING. Elle ne doit être utilisée que pour les connexions avec adresse IP dynamiquement assignée (dialup — accès commuté) : si vous avez une adresse IP statique, vous devez utiliser l’action SNAT. La « mascarade » (masquerading) consiste à spécifier une association avec l’adresse IP de l’interface par laquelle sort le paquet, mais a aussi pour effet d’oublier les connexions lorsque l’interface est désactivée. C’est un comportement approprié lorsque les accès commutés ultérieurs ont peu de chance d’avoir la même adresse d’interface (et que les connexions établies seront perdues de toute façon).

--to-ports port[-port]
    Cette option permet de spécifier une plage de ports source à utiliser, outrepassant les heuristiques de sélection de port source de SNAT (voir ci-avant). Elle ne peut être utilisée que si la règle spécifie aussi un des protocoles suivants : tcp, udp, dccp ou sctp.

--random
    Rendre aléatoire la redirection de port source (noyaux de version >= 2.6.21). À partir de la version 5.0 du noyau, --random est identique à --random-fully.

--random-fully
    Rendre totalement aléatoire la redirection de port source (noyaux de version >= 3.13).

IPv6 est pris en charge depuis la version 3.7 du noyau Linux.

  NETMAP
Cette action permet de rediriger statiquement tout un réseau d’adresses vers un autre réseau d’adresses. Elle ne peut être utilisée que dans les règles de la table nat.

--to adresse[/masque]
    Cette option permet de spécifier le réseau d’adresses de redirection. L’adresse résultante est construite de la manière suivante : tous les bits à 1 du masque sont remplacés par ceux de l’adresse de redirection spécifiée, et tous les bits à 0 du masque par ceux de l’adresse d’origine.

IPv6 est pris en charge depuis la version 3.7 du noyau Linux.

  NFLOG
Cette action permet la journalisation des paquets qui correspondent. Lorsqu’elle est utilisée dans une règle, le noyau Linux transmet le paquet au dorsal de journalisation chargé pour le journaliser. Cette action est en général utilisée conjointement avec nfnetlink_log comme dorsal de journalisation, lequel diffusera (multicast) le paquet à l’aide d’un socket netlink vers le groupe de multidiffusion spécifié. Un ou plusieurs processus de l’espace utilisateur peuvent souscrire au groupe afin de recevoir les paquets. Comme LOG, c’est une action « non terminale », c’est-à-dire que le parcours des règles continue à la règle suivante.

--nflog-group groupe_netlink
    Cette option permet de spécifier le groupe netlink (0–2^16-1) auquel les paquets sont envoyés (applicable seulement à nfnetlink_log). La valeur par défaut est 0.

--nflog-prefix préfixe
    Cette option permet de spécifier un préfixe, d’une longueur maximale de 64 caractères, à ajouter au message de journalisation pour faciliter la discrimination des messages dans les journaux.

--nflog-range taille
    Cette option n’ayant jamais fonctionné, utilisez --nflog-size à la place.

--nflog-size taille
    Cette option permet de spécifier le nombre d’octets qui doivent être copiés vers l’espace utilisateur (applicable seulement pour nfnetlink_log). Des instances de nfnetlink_log pouvant spécifier leur propre plage, cette option outrepasse cette dernière.

--nflog-threshold taille
    Cette option permet de spécifier le nombre de paquets à mettre en file d’attente dans le noyau avant de les envoyer vers l’espace utilisateur (applicable seulement pour nfnetlink_log). Une valeur élevée diminue la surcharge par paquet, mais augmente le délai avec lequel les paquets atteignent l’espace utilisateur. La valeur par défaut est 1.

  NFQUEUE
Cette action transmet le paquet à l’espace utilisateur en utilisant le gestionnaire nfnetlink_queue. Le paquet est placé dans la file d’attente identifiée par son numéro sur 16 bits. L’espace utilisateur peut inspecter et modifier le paquet s’il le souhaite ; il devra alors supprimer ou réinjecter le paquet dans le noyau. Voir libnetfilter_queue pour les détails. nfnetlink_queue a été ajouté à Linux à partir de la version 2.6.14, queue-balance à partir de la version 2.6.31 et queue-bypass à partir de la version 2.6.39.

--queue-num valeur
    Cette option permet de spécifier le numéro de file d’attente à utiliser qui doit être compris entre 0 et 65535 inclus. La valeur par défaut est 0.

--queue-balance valeur:valeur
    Cette option permet de spécifier une plage de numéros de file d’attente à utiliser. Les paquets seront alors répartis entre ces dernières. Cette option s’avère utile pour les systèmes multicœurs : lancer plusieurs instances du programme en espace utilisateur associés aux files d’attente x, x+1, ... x+n et utiliser « --queue-balance x:x+n ». Les paquets appartenant à une même connexion sont placés dans la même file d’attente de netfilter (nfqueue). À cause de certains détails de l’implémentation, une valeur de borne inférieure de la plage égale à 0 limite la valeur de la borne supérieure à 65534, c’est-à-dire que le nombre de files d’attente entre lesquelles les paquets pourront être répartis est de 65535.

--queue-bypass
    Par défaut, si aucun programme de l’espace utilisateur n’est associé à une file d’attente de netfilter, tous les paquets qui doivent être mis en file d’attente sont supprimés. Lorsque cette option est utilisée, la règle contenant l’action NFQUEUE se comportera comme la cible ACCEPT, et le paquet sera envoyé à la table suivante.

--queue-cpu-fanout
    Cette option est disponible à partir de la version 3.10 du noyau Linux. Lorsqu’elle est spécifiée conjointement avec l’option --queue-balance, elle utilise l’identifiant de processeur comme un index pour associer les paquets à une file d’attente. Elle est conçue sur l’idée selon laquelle on peut améliorer les performances s’il y a une file d’attente par processeur. Vous devez spécifier l’option --queue-balance pour pouvoir utiliser cette option.

  NOTRACK
Cette action permet de désactiver le traçage des connexions pour tous les paquets qui correspondent à la règle actuelle. Elle est équivalente à « -j CT --notrack ». Comme CT, NOTRACK ne peut être utilisée que dans la table raw.

  RATEEST
Cette action collecte des statistiques, effectue des estimations de débit et sauvegarde les résultats pour une évaluation ultérieure à l’aide du module rateest.

--rateest-name nom
    Cette option permet d’enregistrer le décompte des paquets qui correspondent dans l’ensemble spécifié par nom, ce dernier pouvant être choisi arbitrairement.

--rateest-interval quantité{s|ms|µs}
    Cette option permet de spécifier un intervalle de mesure de débit en secondes, millisecondes ou microsecondes.

--rateest-ewmalog valeur
    Cette option permet de spécifier avec quelle période doit être effectué le calcul de la moyenne de la mesure du débit.

  REDIRECT
Cette action ne peut être utilisée que dans les chaînes PREROUTING et OUTPUT de la table nat, et dans les chaînes définies par l’utilisateur qui ne sont appelées que depuis ces chaînes. Elle redirige le paquet vers la machine elle-même en remplaçant l’adresse IP de destination par l’adresse primaire de l’interface d’entrée (les paquets générés localement sont associés à l’adresse « localhost », 127.0.0.1 pour IPv4 et ::1 pour IPv6, et les paquets arrivant sur une interface qui n’ont pas d’adresse IP configurée sont supprimés).

--to-ports port[-port]
    Cette option permet de spécifier un port ou une plage de ports de destination à utiliser : sans cela, le port de destination ne sera jamais modifié. Elle ne peut être utilisée que si la règle spécifie aussi un des protocoles suivants : tcp, udp, dccp ou sctp. Pour un port unique, il est aussi possible de spécifier un nom de service parmi ceux listés dans /etc/services.

--random
    Rendre aléatoire la redirection du port source (noyaux >= 2.6.22).

IPv6 est pris en charge à partir de la version 3.7 des noyaux Linux.

  REJECT (spécifique à IPv6)
Cette action permet de renvoyer un paquet d’erreur en réponse à un paquet qui correspondait à la règle ; cela mis à part, elle est équivalente à DROP ; il s’agit donc d’une action terminale qui interrompt le parcours des règles. Elle ne peut être utilisée que dans les chaînes INPUT, FORWARD et OUTPUT, et dans les chaînes définies par l’utilisateur qui ne sont appelées que depuis ces chaînes. Les options suivantes permettent de contrôler la nature du paquet d’erreur renvoyé :

--reject-with type
    Le type spécifié peut être icmp6-no-route, no-route, icmp6-adm-prohibited, adm-prohibited, icmp6-addr-unreachable, addr-unreach ou icmp6-port-unreachable qui renvoie le message d’erreur ICMPv6 approprié (la valeur par défaut est icmp6-port-unreachable). L’option tcp-reset peut être utilisée dans les règles qui ne concernent que le protocole TCP : elle renvoie un paquet TCP RST. Cette option s’avère particulièrement utile pour bloquer les tentatives ident (113/tcp) qui surviennent fréquemment lors d’envois de courriels à des serveurs de messagerie défectueux (qui autrement n'accepteront pas votre courrier). tcp-reset ne peut être utilisée que depuis la version 2.6.14 du noyau.

Avertissement : vous ne devez pas appliquer sans discrimination l’action REJECT aux paquets dont l’état de connexion est considéré INVALID ; vous devez plutôt les supprimer à l’aide de la cible DROP.

Imaginez un hôte source transmettant un paquet P, ce dernier subissant un retard de transmission si important que l’hôte source effectue une retransmission sous la forme du paquet P_2, ce dernier atteignant sa destination avec succès et faisant progresser l’état de connexion normalement. Il est concevable que le paquet P arrivant en retard soit considéré comme non associé à une entrée de traçage de connexion. Générer une réponse REJECT pour un tel paquet mettrait alors fin à la connexion saine.

Donc, au lieu de :

-A INPUT ... -j REJECT

utilisez plutôt :

-A INPUT ... -m conntrack --ctstate INVALID -j DROP
-A INPUT ... -j REJECT

  REJECT (spécifique à IPv4)
Cette action permet de renvoyer un paquet d’erreur en réponse à un paquet qui correspondait à la règle ; cela mis à part, elle est équivalente à DROP ; il s’agit donc d’une action terminale qui interrompt le parcours des règles. Elle ne peut être utilisée que dans les chaînes INPUT, FORWARD et OUTPUT, et dans les chaînes définies par l’utilisateur qui ne sont appelées que depuis ces chaînes. Les options suivantes permettent de contrôler la nature du paquet d’erreur renvoyé :

--reject-with type
    Le type spécifié peut être icmp-net-unreachable, icmp-host-unreachable, icmp-port-unreachable, icmp-proto-unreachable, icmp-net-prohibited, icmp-host-prohibited ou icmp-admin-prohibited (*) qui renvoie le message d’erreur ICMP approprié (la valeur par défaut est icmp-port-unreachable). L’option tcp-reset peut être utilisée dans les règles qui ne concernent que le protocole TCP : elle renvoie un paquet TCP RST. Cette option s’avère particulièrement utile pour bloquer les tentatives ident (113/tcp) qui surviennent fréquemment lors d’envois de courriels à des serveurs de messagerie défectueux (qui autrement n'accepteront pas votre courrier).

    (*) Utiliser icmp-admin-prohibited avec des noyaux qui ne le prennent pas en charge entraînera l’envoi vers la cible DROP au lieu de l’application de l’action REJECT.

Avertissement : vous ne devez pas appliquer sans discrimination l’action REJECT aux paquets dont l’état de connexion est considéré INVALID ; vous devez plutôt les supprimer à l’aide de la cible DROP.

Imaginez un hôte source transmettant un paquet P, ce dernier subissant un retard de transmission si important que l’hôte source effectue une retransmission sous la forme du paquet P_2, ce dernier atteignant sa destination avec succès et faisant progresser l’état de connexion normalement. Il est concevable que le paquet P arrivant en retard soit considéré comme non associé à une entrée de traçage de connexion. Générer une réponse REJECT pour un tel paquet mettrait alors fin à la connexion saine.

Donc, au lieu de :

-A INPUT ... -j REJECT

utilisez plutôt :

-A INPUT ... -m conntrack --ctstate INVALID -j DROP
-A INPUT ... -j REJECT

  SECMARK
Ce module permet de définir la valeur de la marque de sécurité associée au paquet et destinée à être utilisée par les sous-systèmes de sécurité tels que SELinux. Il peut être utilisé dans la table security (ainsi que dans la table mangle à des fins de rétrocompatibilité avec les noyaux plus anciens). La taille de la marque est de 32 bits.

--selctx contexte_sécurité

  SET
Ce module permet d’ajouter et/ou supprimer des entrées dans les ensembles d’adresses IP définis à l’aide d’ipset(8).

--add-set nom_ensemble drapeau[,drapeau...]
    Cette option permet d’ajouter la(les) adresse(s)/port(s) du paquet à l’ensemble spécifié.

--del-set nom_ensemble drapeau[,drapeau...]
    Cette option permet de supprimer la(les) adresse(s)/port(s) du paquet de l’ensemble spécifié.

--map-set nom_ensemble drapeau[,drapeau...]
    [--map-mark] [--map-prio] [--map-queue] mappent les propriétés du paquet (marquage pare-feu, priorité tc (traffic control — contrôle de trafic), file d'attente matériel)

    où les drapeau(x), dont le nombre est limité à 6, sont des spécifications src et/ou dst.

--timeout valeur
    Lors de l’ajout d’une entrée, cette option permet de définir la valeur du délai d’expiration à utiliser à la place de la valeur par défaut définie pour l’ensemble.

--exist
    Lors de l’ajout d’une entrée, si elle existe déjà, cette option permet de réinitialiser la valeur du délai d’expiration à la valeur spécifiée ou, à défaut, à celle définie pour l’ensemble.

--map-set nom_ensemble
    nom_ensemble doit être créé à l’aide de l’option --skbinfo. --map-mark mappe la marque de pare-feu avec le paquet en en recherchant la valeur dans l’ensemble. --map-prio mappe la priorité du contrôle de trafic avec le paquet en en recherchant la valeur dans l’ensemble. --map-queue mappe la file d’attente matériel de la NIC (Network Interface Card — carte réseau) en en recherchant la valeur dans l’ensemble.

    L’option --map-set ne peut être utilisée que dans la table mangle. Les options --map-prio et --map-queue peuvent être utilisées dans les chaînes OUTPUT, FORWARD et POSTROUTING.

L’utilisation de « -j SET » nécessite la prise en charge d’ipset par le noyau, ce qui est le cas, pour les noyaux standards, à partir de Linux 2.6.39.

  SNAT
Cette action ne peut être utilisée que dans les chaînes POSTROUTING et INPUT de la table nat, et dans les chaînes définies par l’utilisateur qui ne sont appelées que depuis ces chaînes. Elle indique que l’adresse source du paquet (ainsi que celle de tous les paquets ultérieurs de cette connexion) doit être modifiée et que le parcours des règles doit cesser. Elle accepte les options suivantes :

--to-source [adr_ip[-adr_ip]][:port[-port]]
    Cette option permet de spécifier une seule nouvelle adresse IP source ou une plage inclusive d’adresses IP, et éventuellement une plage de ports, si la règle spécifie aussi un des protocoles suivants : tcp, udp, dccp ou sctp. Si aucune plage de ports n’est spécifiée, les ports source de numéro inférieur à 512 seront redirigés vers d’autres ports de numéro inférieur à 512, ceux dont les numéros sont compris entre 512 et 1023 inclus seront redirigés vers d’autres ports de numéro inférieur à 1024 et les autres ports seront redirigés vers d’autres ports de numéro supérieur ou égal à 1024. Lorsque c’est possible, aucune modification de port n’est effectuée.

--random
    Rendre aléatoire la redirection du port source grâce à un algorithme basé sur le hachage (noyaux de version >= 2.6.21).

--random-fully
    Rendre totalement aléatoire la redirection du port source grâce à un PRNG (Pseudorandom Number Generator — générateur de nombres pseudo-aléatoires) ; disponible à partir de la version 3.14 du noyau.

--persistent
    Attribuer à un client les mêmes adresses source et destination pour chaque connexion. Cette option l’emporte sur l’action SAME. La redirection persistante est prise en charge depuis la version 2.6.29-rc2.

Les noyaux de version antérieure à 2.6.36-rc1 ne prennent pas en charge l’action SNAT dans la chaîne INPUT.

IPv6 est pris en charge depuis la version 3.7 du noyau Linux.

  SNPT (spécifique à IPv6)
Cette action permet d’effectuer une translation NPTv6 (IPv6 à IPv6 Network Prefix Translation) sans conservation d’état (stateless) du préfixe réseau source (comme décrit dans la RFC 6296).

Vous devez utiliser cette action dans la table mangle, pas dans la table nat. Elle accepte les options suivantes :

--src-pfx [préfixe/taille]
    Définir le préfixe source que vous voulez traduire, ainsi que sa taille.

--dst-pfx [préfixe/taille]
    Définir le préfixe de destination que vous voulez utiliser dans la traduction, ainsi que sa taille.

Pour annuler la translation, vous devez utiliser l’action DNPT. Exemple :

    ip6tables -t mangle -I POSTROUTING -s fd00::/64 ! -o vboxnet0 -j SNPT --src-pfx fd00::/64 --dst-pfx 2001:e20:2000:40f::/64

    ip6tables -t mangle -I PREROUTING -i wlan0 -d 2001:e20:2000:40f::/64 -j DNPT --src-pfx 2001:e20:2000:40f::/64 --dst-pfx fd00::/64

Vous devrez peut-être activer le mandataire d’hôtes voisins IPv6 :

    sysctl -w net.ipv6.conf.all.proxy_ndp=1

Vous devez aussi utiliser l’action NOTRACK pour désactiver le traçage de connexion pour les flux traduits.

  SYNPROXY
Cette action permet de traiter la poignée de main TCP en trois temps (TCP three-way-handshake) en parallèle dans le contexte netfilter pour protéger le système de la machine locale ou du dorsal. Elle nécessite le traçage de connexion, car les numéros de séquence doivent être traduits. La capacité des noyaux à absorber les attaques SYNFLOOD ayant été considérablement améliorée avec la version 4.4, cette action ne devrait plus être nécessaire pour protéger les serveurs Linux.

--mss taille_maximale_segment
    Cette option permet de définir la taille maximale de segment indiquée aux clients. Elle doit être identique à celle du dorsal.

--wscale redimensionnement_fenêtre
    Facteur de multiplication de la fenêtre de réception indiqué aux clients. Il doit être identique à celui du dorsal.

--sack-perm
    Transmission de l'option d'acquittement sélectif du client au dorsal (sera désactivée si non présente).

--timestamps
    Transmission de l'option d'horodatage du client au dorsal (sera désactivée si non présente, aussi nécessaire pour l’acquittement sélectif et le redimensionnement de fenêtre).

Exemple :

Déterminer les options tcp utilisées par le dorsal à partir d’un système externe.

    tcpdump -pni eth0 -c 1 'tcp[tcpflags] == (tcp-syn|tcp-ack)'
        port 80 &
    telnet 192.0.2.42 80
    18:57:24.693307 IP 192.0.2.42.80 > 192.0.2.43.48757:
        Flags [S.], seq 360414582, ack 788841994, win 14480,
        options [mss 1460,sackOK,
        TS val 1409056151 ecr 9690221,
        nop,wscale 9],
        length 0

Mettre le mode tcp_loose à off de façon que le traçage de connexion marque les paquets hors flux comme « INVALID ».

    echo 0 > /proc/sys/net/netfilter/nf_conntrack_tcp_loose

Faire que les paquets SYN ne soient pas tracés.

    iptables -t raw -A PREROUTING -i eth0 -p tcp --dport 80
        --syn -j CT --notrack

Intercepter les états « UNTRACKED » (paquets SYN) et « INVALID » (paquets ACK de la poignée de main en trois temps) et les soumettre à l’action SYNPROXY. Cette règle répondra aux paquets SYN avec des syncookies SYN+ACK, créera une connexion ESTABLISHED pour une réponse client valable (paquets ACK de la poignée de main en trois temps) et supprimera les cookies incorrects. Les combinaisons de drapeaux inattendues (par exemple SYN+FIN, SYN+ACK) au cours de la poignée de main en trois temps ne correspondront pas et le parcours des règles continuera.

    iptables -A INPUT -i eth0 -p tcp --dport 80
        -m state --state UNTRACKED,INVALID -j SYNPROXY
        --sack-perm --timestamp --mss 1460 --wscale 9

Supprimer les paquets non valables, c’est-à-dire les paquets hors flux qui n’ont pas été soumis à l’action SYNPROXY.

    iptables -A INPUT -i eth0 -p tcp --dport 80 -m state --state INVALID -j DROP

  TCPMSS
Cette action modifie la valeur de MSS (Maximum Segment Size — taille maximale de segment) des paquets TCP SYN pour contrôler la taille maximale pour cette connexion (en général en la limitant au MTU (Maximum Transmission Unit — unité de transmission maximale) de votre interface de sortie moins 40 pour IPv4 ou moins 60 pour IPv6). Bien entendu, elle ne peut être utilisée que conjointement avec l’option -p tcp.

Cette action permet de contourner les FAI ou serveurs en état de mort cérébrale manifeste qui bloquent les paquets considérés comme « nécessitant une fragmentation ICMP » ou comme « paquets ICMPv6 trop gros ». Les symptômes de ce problème se manifestent par le fait que, bien que tout semble fonctionner correctement depuis votre pare-feu ou routeur Linux, les machines situées derrière ces derniers ne peuvent jamais échanger de gros paquets :

1.  Les navigateurs internet se connectent puis se bloquent sans réception de données.

2.  Les petits courriels sont envoyés, mais les gros bloquent.

3.  ssh fonctionne correctement, mais scp bloque après la poignée de main initiale.

Solution : activer cette option et ajouter à la configuration de votre pare-feu une règle du style :

     iptables -t mangle -A FORWARD -p tcp --tcp-flags SYN,RST SYN
                 -j TCPMSS --clamp-mss-to-pmtu

--set-mss valeur
    Cette option permet de définir explicitement la MSS à la valeur spécifiée. Si la MSS du paquet est déjà inférieure à valeur, elle ne sera pas augmentée (à partir de Linux 2.6.25) pour éviter des problèmes avec les hôtes qui fonctionnent avec une MSS particulière.

--clamp-mss-to-pmtu
    Cette option permet de fixer automatiquement la valeur de MSS à « path_MTU - 40 » pour IPv4 et à « path_MTU - 60 » pour IPv6 (NDT : le path_MTU est la plus petite unité de transmission maximale rencontrée sur le chemin réseau). Elle peut ne pas fonctionner comme souhaité lorsque des routes asymétriques avec des path_MTU différents existent — le noyau utilise le path_MTU qu’il utiliserait pour envoyer des paquets depuis lui-même vers les adresses IP source et de destination. Avant Linux 2.6.25, seul le path_MTU vers l’adresse IP de destination était considéré par cette option ; les noyaux ultérieurs considèrent aussi le path_MTU vers l’adresse IP source.

Ces options sont mutuellement exclusives.

  TCPOPTSTRIP
Cette action permet de supprimer les options TCP d’un paquet TCP (en fait, elle les remplace par des options vides — NO-OP). Pour qu’elle fonctionne, vous devez ajouter l’option -p tcp.

--strip-options option[,option...]
    Cette option permet de supprimer les options spécifiées. Ces dernières peuvent être spécifiées à l’aide de leur numéro d’option TCP ou de leur nom symbolique. La liste des options reconnues peut être obtenue en appelant iptables avec -j TCPOPTSTRIP -h.

  TEE
Cette action permet de cloner un paquet et de rediriger ce clone vers une autre machine sur le segment réseau local. En d’autres termes, le prochain saut doit être la cible, ou vous devrez configurer le prochain saut pour rediriger le clone plus loin si vous le souhaitez.

--gateway adr_ip
    Cette option permet d’envoyer le paquet cloné à l’hôte pouvant être atteint à l’adresse IP spécifiée. Utiliser 0.0.0.0 (pour les paquets IPv4) ou :: (pour les paquets IPv6) n’est pas valable.

Pour rediriger tout le trafic entrant sur eth0 vers une machine de journalisation de la couche réseau :

-t mangle -A PREROUTING -i eth0 -j TEE --gateway 2001:db8::1

  TOS
Cette action permet de définir le champ « Type of Service » de l’en-tête IPv4 (y compris les bits de priorité) ou le champ « Priority » de l’en-tête IPv6. Notez que TOS partage les mêmes bits que DSCP et ECN. L’action TOS ne peut être utilisée que dans la table mangle.

--set-tos valeur[/masque]
    Mettre à zéro les bits spécifiés par masque (voir NOTE ci-après) et combiner valeur et le champ TOS/Priority avec un XOR. Si masque est omis, sa valeur par défaut est 0xFF.

--set-tos symbole
    Vous pouvez utiliser un nom symbolique lors de l’utilisation de l’action TOS pour IPv4. Un masque de 0xFF sera alors implicite (voir NOTE ci-après). La liste des noms de TOS valables peut être obtenue en appelant iptables avec « -j TOS -h ».

Les mnémoniques suivants sont disponibles :

--and-tos bits
    Combiner la valeur de TOS et bits à l’aide d’un ET logique (mnémonique pour « --set-tos 0/invbits » où invbits est la négation binaire de bits, voir NOTE ci-après).

--or-tos bits
    Combiner la valeur de TOS et bits à l’aide d’un OU logique (mnémonique pour « --set-tos bits/bits », voir NOTE ci-après).

--xor-tos bits
    Combiner la valeur de TOS et bits à l’aide d’un XOR (mnémonique pour « --set-tos bits/0 », voir NOTE ci-après).

NOTE : avec les noyaux jusqu’à la version 2.6.38, à l’exception des versions à long terme 2.6.32 (>=.42), 2.6.33 (>=.15) et 2.6.35 (>=.14), un bogue fait que la manipulation du champ TOS en IPv6 se comporte différemment de ce qui est documenté et diffère de la version IPv4. Le masque TOS indique les bits que l’on veut mettre à zéro ; il doit donc être inversé avant d’être appliqué au champ TOS d’origine. Cependant, les noyaux mentionnés ci-avant n’effectuent pas cette inversion, ce qui entraîne un fonctionnement défectueux de l’option --set-tos et de ses mnémoniques.

  TPROXY
Cette action ne peut être utilisée que dans la table mangle, dans la chaîne PREROUTING et les chaînes définies par l’utilisateur qui ne sont appelées que depuis cette chaîne. Elle redirige le paquet vers un socket local sans modifier l’en-tête de paquet de quelque façon que ce soit. Elle peut aussi modifier la valeur de marquage qui pourra alors être utilisée dans des règles de routage avancées. Elle accepte trois options :

--on-port port
    Cette option permet de spécifier le port de destination à utiliser. Elle est obligatoire, 0 signifiant que le nouveau port de destination est le même que le port d’origine. Elle n’est valable que si la règle spécifie aussi -p tcp ou -p udp.

--on-ip adresse
    Cette option permet de spécifier l’adresse de destination à utiliser. Par défaut, il s’agit de l’adresse de l’interface entrante. Elle n’est valable que si la règle spécifie aussi -p tcp ou -p udp.

--tproxy-mark valeur[/masque]
    Cette option permet de marquer les paquets avec la paire valeur/masque spécifiée. La valeur de la marque de pare-feu (fwmark) définie ici peut être utilisée pour le routage avancé (cette option est nécessaire pour utiliser un mandataire transparent (transparent proxying) : si elle n’est pas présente, ces paquets seront redirigés, ce qui ne correspond probablement pas à ce vous souhaitez).

  TRACE
Cette action marque les paquets de façon que le noyau journalise chaque règle qui correspond aux paquets lorsque ces derniers traversent les tables, chaînes ou règles. Elle ne peut être utilisée que dans la table raw.

Avec iptables-legacy, un dorsal de journalisation comme ip(6)t_LOG ou nfnetlink_log doit être chargé pour que cela soit visible. Les paquets sont journalisés avec le préfixe « TRACE: nom_table:nom_chaîne:type:numéro_règle » où type peut avoir pour valeur « rule » pour une règle à part entière, « return » pour une règle implicite à la fin d’une chaîne définie par l’utilisateur ou « policy » pour la politique des chaînes intégrées.

Avec iptables-nft, l’action est traduite en une expression meta nftrace de nftables. Ainsi le noyau envoie les évènements de traçage à l’aide de netlink vers l’espace utilisateur où ils peuvent être affichés en utilisant la commande xtables-monitor --trace. Pour les détails, veuillez consulter xtables-monitor(8).

  TTL (spécifique à IPv4)
Cette action permet de modifier le champ d’en-tête IPv4 TTL. Le champ TTL détermine le nombre de sauts (routeurs) qu’un paquet peut traverser avant que sa durée de vie soit dépassée.

Définir ou augmenter la valeur du champ TTL peut s’avérer très dangereux et il faut donc à tout prix éviter de le faire. Cette action ne peut être utilisée que dans la table mangle.

Ne définissez ou incrémentez jamais cette valeur pour les paquets qui quittent votre réseau local !

--ttl-set valeur
    Cette option permet de définir la valeur du champ TTL à valeur.

--ttl-dec n
    Cette option permet de décrémenter la valeur du champ TTL n fois.

--ttl-inc n
    Cette option permet d’incrémenter la valeur du champ TTL n fois.

  ULOG (spécifique à IPv4)
Cette action est le prédécesseur obsolète spécifique à IPv4 de l’action NFLOG. Elle permet de journaliser les paquets qui correspondent dans l’espace utilisateur. Lorsque cette action est définie pour une règle, le noyau Linux multidiffuse les paquets à l’aide d’un socket netlink. Un ou plusieurs processus de l’espace utilisateur peuvent alors s’abonner à différents groupes de multidiffusion et recevoir les paquets. Comme LOG, c’est une action « non terminale », c’est-à-dire que le parcours des règles continue à la règle suivante.

--ulog-nlgroup groupe_netlink
    Cette option permet de spécifier le groupe netlink (1-32) auquel est envoyé le paquet. La valeur par défaut est 1.

--ulog-prefix préfixe
    Cette option permet de spécifier le préfixe à ajouter aux messages de journalisation ; d’une taille maximale de 32 caractères, il permet de distinguer les messages dans les journaux.

--ulog-cprange n
    Cette option permet de spécifier le nombre d’octets à copier vers l’espace utilisateur. Une valeur de 0 (la valeur par défaut) signifie que le paquet doit être copié dans sa totalité sans tenir compte de sa taille.

--ulog-qthreshold n
    Cette option permet de spécifier le nombre de paquets à mettre en file d’attente dans le noyau. Définir cette valeur à 10, par exemple, stocke dix paquets dans le noyau et les transmet à l’espace utilisateur en un seul message netlink en plusieurs parties (multipart). La valeur par défaut est 1 (à des fins de rétrocompatibilité).

TRADUCTION
La traduction française de cette page de manuel a été créée par Lucien Gentis <lucien.gentis@univ-lorraine.fr>

Cette traduction est une documentation libre ; veuillez vous reporter à la GNU General Public License version 3 (https://www.gnu.org/licenses/gpl-3.0.html) 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.