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.
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]
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.
- [!] --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.
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
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"
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 ...
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
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
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).
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 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.
- [!] --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.
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.
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.
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.
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.
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]
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.
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 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
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.
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.
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.
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
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
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é.
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.
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
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]
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-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.
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).
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
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.
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.
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.
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.
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.
Ce module vérifie la correspondance du type du paquet au
niveau de la couche liaison.
- [!] --pkt-type
{unicast|broadcast|multicast}
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.
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.
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
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).
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/*.
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
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.
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
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.
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
état
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.
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).
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.
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.
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.
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.
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).
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.
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.
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.
iptables peut utiliser des modules d’action
étendue ; les actions suivantes sont incluses dans la
distribution standard :
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
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.
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é.
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.
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.
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.
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_*.
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]]]
- Cette option permet de spécifier une adresse IP de destination
seule ou une plage inclusive d’adresses IP. Il est possible
d’indiquer 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, le port de destination ne sera jamais
modifié. Si aucune adresse IP n’est spécifiée,
seul le port de destination sera modifié. Si port_de_base
est spécifié, la différence entre le port de
destination d’origine et sa valeur sera utilisée comme
décalage dans la plage de ports de redirection, ce qui permet de
créer des plages de redirection de ports décalés
(disponible depuis la version 4.18 du noyau). Pour un seul port ou
un port_de_base, il est possible d’utiliser un nom de
service tel que ceux du fichier /etc/services.
- --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.
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.
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.
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.
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.
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
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.
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
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.
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).
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.
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.
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.
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.
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.
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.
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
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é
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.
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.
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.
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
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.
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.
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
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.
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).
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).
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.
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é).