Table des matières

Netfilter

Charcuter les datagrammes IP

Avertissement

Pour ce qui suit, il est fortement recommandé de savoir ce que sont Netfilter et IPtables, autrement dit d'avoir lu le chapitre « Netfilter et IPtables ».

La table « mangle »

Cette table, peu évoquée dans le chapitre indiqué ci-dessus, va nous servir ici. Son but est justement de pouvoir placer des marques sur les paquets qui circulent. Elle dispose au moins de la chaîne PREROUTING, celle qui nous intéresse ici. Autrement dit, ce qui suit doit être réalisable avec tout noyau 2.4.x ou supérieur.

Nous devons en effet marquer les paquets avant le routage, puisque le routage va dépendre justement de cette marque.

Que devons-nous faire exactement ?

Nous devons, sur la passerelle miroir, marquer avant routage les paquets qui contiennent un port de destination égal à 110 (en décimal), le port par défaut sur lequel écoutent les serveurs POP3 :

iptables -t mangle -A PREROUTING -i eth0 -p tcp -m tcp --dport 110 -j MARK --set-mark 0x6e

Pourquoi la marque 0x6e (le 0x signifie que l'on s'exprime en hexadécimal) ? En réalité, la valeur n'a aucune importance, pourvu qu'on utilise la même avec iproute2, lors de la création de la règle de routage. 0x6e = 110, c'est juste un choix mnémotechnique.

A ce niveau nous avons sur notre passerelle « miroir » :

Si cette passerelle est configurée pour effectuer le routage (/proc/sys/net/ipv4 = 1), elle devrait donc remplir son office.

Passons maintenant à la machine destinée à recevoir le proxy. Pour l'instant, il y a juste un système installé. Il n'est pas nécessaire qu'il soit configuré pour router, mais pour tester ce que nous avons fait jusqu'ici, ce sera utile.

Voyons son état :

mercure:~# ip rule list
0:      from all lookup local
32766:  from all lookup main
32767:  from all lookup default
mercure:~# ip route list
192.168.0.0/16 dev eth0  proto kernel  scope link  src 192.168.0.3
default via 192.168.0.1 dev eth0

Vous l'avez compris, sur la maquette, cette machine s'appelle mercure. Elle n'a aucune règle de routage particulière et donc, sa seule route par défaut est 192.168.0.1, la “vraie” passerelle vers l'internet.

Pour les besoins de la manip qui suit, nous activons le routage :

mercure:~# echo 1 > /proc/sys/net/ipv4/ip_forward

Et maintenant, nous avons besoin d'un outil un peu spécial. Un outil qui trace les routes, mais qui le fait en utilisant TCP (et non UDP ou ICMP, comme le traceroute classique), sur un port de son choix. Cet outil n'est bien sûr pas installé par défaut, mais est disponible sur la Debian Sarge, avec un “apt-get install tcptraceroute”.

Dans un premier temps, un tcptraceroute sur le port 80 de www.free.fr :

janus:~# tcptraceroute www.free.fr 80
Selected device eth0, address 192.168.0.4 for outgoing packets
Tracing the path to www.free.fr (213.228.0.42) on TCP port 80, 30 hops max
 1  192.168.0.2 (192.168.0.2)  0.275 ms  0.136 ms  0.121 ms
 2  192.168.0.1 (192.168.0.1)  0.769 ms
    193.253.160.3 (193.253.160.3)  68.483 ms  59.903 ms
 3  80.10.215.197 (80.10.215.197)  84.734 ms  58.070 ms  59.270 ms
 4  pos6-0.nraub303.Aubervilliers.francetelecom.net (193.252.99.70)  216.432 ms  215.634 ms  216.115 ms
 5  pos13-0.ntaub301.aubervilliers.francetelecom.net (193.252.161.82)  57.044 ms  55.925 ms  54.911 ms
 6  pos0-0-0-0.noaub101.aubervilliers.francetelecom.net (193.252.103.85)  56.687 ms  56.202 ms  57.633 ms
 7  193.252.161.98 (193.252.161.98)  58.090 ms  57.025 ms  57.829 ms
 8  p19-6k-2-v806.routers.proxad.net (212.27.50.161)  56.652 ms  55.946 ms  56.285 ms
 9  vlq-6k-2-v800.intf.routers.proxad.net (212.27.50.5)  58.152 ms  57.447 ms  57.984 ms
10  vlq-6k-1-po1.intf.routers.proxad.net (212.27.50.2)  57.969 ms  57.473 ms  60.456 ms
11  www1.free.fr (213.228.0.42) [open]  56.886 ms  58.319 ms  62.456 ms

Notez qu'à l'aller, le paquet issu de notre machine de test (janus, sous Debian Sarge elle aussi), passent par notre passerelle miroir 192.168.0.2, puis par le routeur NAT 192.168.0.1.

Voyons maintenant un tcptraceroute sur le port 110 de pop.free.fr :

janus:~# tcptraceroute pop.free.fr 110
Selected device eth0, address 192.168.0.4 for outgoing packets
Tracing the path to pop.free.fr (212.27.42.14) on TCP port 110, 30 hops max
 1  192.168.0.2 (192.168.0.2)  0.285 ms  0.122 ms  0.119 ms
 2  192.168.0.3 (192.168.0.3)  0.784 ms  0.229 ms  0.214 ms
 3  192.168.0.1 (192.168.0.1)  0.847 ms  0.585 ms  0.578 ms
 4  193.253.160.3 (193.253.160.3)  67.374 ms  58.665 ms
    80.10.215.197 (80.10.215.197)  58.922 ms
 5  pos1-0.nraub303.aubervilliers.francetelecom.net (193.252.103.170)  62.153 ms  63.039 ms  60.602 ms
 6  pos13-0.ntaub301.aubervilliers.francetelecom.net (193.252.161.82)  59.383 ms  55.566 ms  57.070 ms
 7  pos0-0-0-0.noaub101.aubervilliers.francetelecom.net (193.252.103.85)  57.811 ms  57.416 ms  59.551 ms
 8  193.252.161.98 (193.252.161.98)  56.101 ms  56.321 ms  57.904 ms
 9  p19-6k-2-v806.routers.proxad.net (212.27.50.161)  61.040 ms  55.864 ms  58.123 ms
10  vlq-6k-2-v800.intf.routers.proxad.net (212.27.50.5)  58.282 ms  58.115 ms  57.634 ms
11  vlq-6k-1-po1.intf.routers.proxad.net (212.27.50.2)  59.048 ms  58.657 ms  59.208 ms
12  pop4-q.free.fr (212.27.42.14) [open]  59.107 ms  58.373 ms  63.638 ms

Si le paquet issu de janus passe d'abord par la passerelle miroir 192.168.0.2, il est ensuite dirigé sur mercure, notre futur proxy POP3 dont l'adresse est 192.168.0.3. Comme celui-ci n'est pas encore configuré, mais qu'il a le routage activé, il transmet alors le paquet au routeur NAT 192.168.0.1

Nous avons bien réussi à mettre en évidence que saturne, la passerelle miroir, effectue un routage différent suivant que le trafic est du http (port 80) ou du POP3 (port 110).