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