Page suivante Page précédente Table des matières

4. Nouvelles targets de netfilter

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.

4.1 Le patch ftos

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 :

--set-ftos value

-> Change le champs TOS du paquet à `value'. Cette valeur peut être en décimal (ex: 32) ou en héxa (ex: 0x20).

4.2 Le patch IPV4OPTSSTRIP

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.

4.3 Le patch NETLINK

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 :

--nldrop

-> DROP le paquet aussi.

--nlmark <number>

-> Marque le paquet

--nlsize <bytes>

-> Limite la taille du paquet.

Pour plus d'information sur les sockets netlink, vous pouvez vous référer au document Netlink Sockets Tour.

4.4 Le patch NETMAP

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 :

--to address[/mask]

-> L'adresse réseau à mapper.

4.5 Le patch ROUTE

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 :

--oif ifname

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é.

--iif ifname

Modifie l'interface d'arrivée du packet en l'interface `ifname'.

--gw ip

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

4.6 Le patch SAME

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 :

--to <ipaddr>-<ipaddr>

-> L'adresse vers laquelle il faut mapper la connexion.

--nodst

-> N'utilise pas l'adresse IP destination dans la sélection de la source.

4.7 Le patch tcp-MSS

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) :

--set-mss value

mettre la valeur du MSS explicitement à la valeur donnée.

--clamp-mss-to-pmtu

Bloque la valeur du MSS à (path_MTU - 40)

4.8 Le patch TTL

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 :

--ttl-set value

-> Met le TTL à la valeur <value>

--ttl-dec value

-> Décrémente le TTL par <value>

--ttl-inc value

-> Incrémente le TTL par <value>

4.9 Le patch ulog

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..


Page suivante Page précédente Table des matières