Dans cette section, on essayera d'expliquer l'utilisation de ces nouvelles targets de netfilter. Les patches seront abordés par ordre alphabétique. Aussi, nous n'expliquerons pas les patches qui cassent les autres patches. Mais ça pourra venir ensuite.
De manière générale, pour les targets, vous pouvez voir le petit synopsis de chacune d'elles en tapant :
# iptables -j LA_TARGET_QUE_VOUS_VOULEZ --help
Ça va afficher le texte d'aide normal d'iptables, et le petit synopsis spécifique de ``LA_TARGET_QUE_VOUS_VOULEZ'' à la fin.
Ce patch par Matthew G. Marsh <mgm@paktronix.com> ajoute une nouvelle target qui vous permet de changer le TOS du paquet vers une valeur arbitraire.
Par exemple, si vous voulez changer le TOS de tous les paquets sortants à 15, faites comme suit :
# iptables -t mangle -A OUTPUT -j FTOS --set-ftos 15
# iptables -t mangle --list
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
FTOS all -- anywhere anywhere TOS set 0x0f
Les options supportées par la target FTOS sont :
-> Change le champs TOS du paquet à `value'. Cette valeur
peut être en décimal (ex: 32
) ou en héxa (ex: 0x20
).
Ce patch par Fabrice MARIE <fabrice@netfilter.org> ajoute une nouvelle target qui retire toute option IPv4 d'un paquet.
On peut l'utiliser comme suit :
# iptables -t mangle -A PREROUTING -j IPV4OPTSSTRIP
# iptables -t mangle --list
Chain PREROUTING (policy ACCEPT)
target prot opt source destination
IPV4OPTSSTRIP all -- anywhere anywhere
Cette target ne prend aucune option.
Ce patch Gianni Tedesco <gianni@ecsc.co.uk> ajoute une nouvelle target qui vous permet d'envoyer les paquets DROPpés vers le userspace via une socket netlink.
Par exemple, si vous voulez DROPper tous les pings et les envoyer à une socket netlink en userland à la place, faites comme suit :
# iptables -A INPUT -p icmp --icmp-type echo-request -j NETLINK --nldrop
# iptables --list
Chain INPUT (policy ACCEPT)
target prot opt source destination
NETLINK icmp -- anywhere anywhere icmp echo-request nldrop
Les options supportées pour la target NETLINK sont :
-> DROP le paquet aussi.
-> Marque le paquet
-> Limite la taille du paquet.
Pour plus d'information sur les sockets netlink, vous pouvez vous référer au document Netlink Sockets Tour.
Ce patch par Svenning Soerensen <svenning@post5.tele.dk> ajoute une nouvelle target qui vous permet de créer un lien statique 1:1 d'une adresse réseau, tout en gardant l'adresse de la machine intacte.
Par exemple, si vous voulez changer la destination de toutes les connexions entrantes, de 1.2.3.0/24 vers 5.6.7.0/24, faites comme suit :
# iptables -t nat -A PREROUTING -d 1.2.3.0/24 -j NETMAP --to 5.6.7.0/24
# iptables -t nat --list
Chain PREROUTING (policy ACCEPT)
target prot opt source destination
NETMAP all -- anywhere 1.2.3.0/24 5.6.7.0/24
Les options supportées par la target NETMAP sont :
-> L'adresse réseau à mapper.
Ce patch par Cédric de Launois <delaunois@info.ucl.ac.be> ajoute une nouvelle target qui vous d'établir des routes particulières qui ne sont pas supportées par la table de routage standard du noyau. La target ROUTE vous permet the router un paquet vers une interface ou un hôte, même si la destination normale du paquet est le routeur lui-même. La target ROUTE permet également de changer l'interface d'arrivée d'un paquet. Les paquets sont envoyés directement sur la ligne, sans traverser aucune autre table.
Cette target ne modifie jamais les paquets et est une target finale. Elle doit être utilisée dans la table `mangle'.
Lorsque c'est possible, il est préférable d'utiliser la target MARK couplée à l'utilisation d'iproute2. Cette target ROUTE est cependant utile pour forcer l'utilisation d'une interface ou d'une passerelle, et pour changer l'interface d'arrivée d'un paquet. Certaines personnes l'utilisent aussi par facilité et pour simplifier leur règles (une règle pour router un paquet est plus facile qu'une règle MARK + une règle iproute2).
Les options supportées par la target ROUTE sont :
Envoie le paquet en utilisant l'interface de nom `ifname'. La machine de destination doit être sur le même lien, ou bien l'interface doit être un tunnel. Dans le cas contraire, la résolution arp ne peut se faire et le paquet est jeté.
Modifie l'interface d'arrivée du packet en l'interface `ifname'.
Route le paquet via cette passerelle. Le paquet est routé comme si son adresse IP de destination était cette ip.
Supposons par exemple que vous voulez rediriger les paquets ssh vers un serveur situé à l'intérieur de votre réseau, sans modifier ces paquets (ceci exclu l'utilisation de la technique de redirection de port). Une solution est d'utiliser un tunnel ipip et la target ROUTE pour rerouter les paquets ssh vers le vrai serveur ssh, qui a la même adresse IP que le routeur. Il n'est pas possible de rerouter ces paquets en utilisant la table de routage du noyau car le noyau délivre localement les paquets ayant une adresse de destination appartenant au routeur lui-même.
Un peu d'art ASCII :
eth0 +-------+ 192.168.0.1 192.168.0.2 +----+ ----------------|routeur|---------------------------------|hôte| IP: 150.150.0.1 +-------+ +----+ | | tunl1 IP: 150.150.0.1 | | | +-------------------------------------+ | +-----------------------------------------+ tunnel IPIP
Pour l'exemple ci-dessus, vous pouvez faire comme suit :
# iptables -A PREROUTING -t mangle -i eth0 -p tcp --dport 22 -j ROUTE --oif tunl1
# iptables -A PREROUTING -t mangle -i tunl1 -j ROUTE --oif eth0
# iptables -L PREROUTING -t mangle
Chain PREROUTING (policy ACCEPT)
target prot opt source destination
ROUTE tcp -- anywhere anywhere tcp dpt:ssh ROUTE oif tunl1
ROUTE all -- anywhere anywhere ROUTE oif eth0
Autre exemple : si vous voulez facilement et rapidement répartir la charge entre deux passerelles 10.0.0.1 et 10.0.0.2, faites comme suit :
# iptables -A PREROUTING -t mangle -m random --average 50 -j ROUTE --gw 10.0.0.1
# iptables -A PREROUTING -t mangle -j ROUTE --gw 10.0.0.2
# iptables -L PREROUTING -t mangle
Chain PREROUTING (policy ACCEPT)
target prot opt source destination
ROUTE all -- anywhere anywhere random 50% ROUTE gw 10.0.0.1
ROUTE all -- anywhere anywhere ROUTE gw 10.0.0.2
Ce patch par Martin Josefsson <gandalf@wlug.westbo.se> ajoute une nouvelle target similaire à SNAT et qui donne au client la même adresse à chaque connexion.
Par exemple, si vous voulez modifier l'adresse source de toutes les connexions pour qu'elles soient 1.2.3.4-1.2.3.7, faites comme suit :
# iptables -t nat -A POSTROUTING -j SAME --to 1.2.3.4-1.2.3.7
# iptables -t nat --list
Chain POSTROUTING (policy ACCEPT)
target prot opt source destination
SAME all -- anywhere anywhere same:1.2.3.4-1.2.3.7
Les options supportées par la target SAME sont :
-> L'adresse vers laquelle il faut mapper la connexion.
-> N'utilise pas l'adresse IP destination dans la sélection de la source.
Ce patch par Marc Boucher <marc+nf@mbsi.ca> ajoute une nouvelle target qui vous permet d'examiner et de changer le MSS dans les paquets TCP SYN, pour contrôler la taille maximum pour cette connexion.
Comme l'explique Marc lui même, c'est un hack, utilisé pour résoudre les problèmes engendrés par ces ISPs têtus comme des mules qui bloquent les paquets ICMP Fragmentation Needed à tort.
Sont utilisation typique est :
# iptables -A FORWARD -p tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu
# iptables --list
Chain FORWARD (policy ACCEPT)
target prot opt source destination
TCPMSS tcp -- anywhere anywhere tcp flags:SYN,RST/SYN TCPMSS clamp to PMTU
Les options supportées par la target tcp-MSS sont (et sont mutuellement exclusives) :
mettre la valeur du MSS explicitement à la valeur donnée.
Bloque la valeur du MSS à (path_MTU - 40)
Ce patch par Harald Welte <laforge@gnumonks.org> ajoute une nouvelle target qui vous permet de changer le TTL d'un paquet vers une valeur explicite, ou d'incrémenter/décrémenter le TTL par une valeur donnée.
Par exemple, si vous voulez changer le TTL de toutes les connexions sortantes à 126, faites comme suit :
# iptables -t mangle -A OUTPUT -j TTL --ttl-set 126
# iptables -t mangle --list
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
TTL all -- anywhere anywhere TTL set to 126
Les options supportées par la target TTL sont :
-> Met le TTL à la valeur <value>
-> Décrémente le TTL par <value>
-> Incrémente le TTL par <value>
Ce patch par Harald Welte <laforge@gnumonks.org> ajoute une nouvelle target qui fournit un mécanisme un peu plus avancé que la target LOG standard pour logguer les paquets. Le répertoire `libipulog/' contient une librairie pour recevoir les messages ULOG en userland.
Harald maintient une page web contenant de la documentation sur l'utilisation de la target ULOG ainsi que sur la librairie, et donc on ne l'expliquera pas ici..