Une manip. très simple

Dans cet exemple, nous avons un cas extrêmement simple :

  • Un réseau bleu, dont l'adresse IP est 192.168.0.0, avec le classique masque 255.255.255.0 ;
  • un réseau rouge, dont l'adresse IP est 192.168.1.0, même masque ;
  • entre les deux, un routeur qui dispose donc deux deux adresses IP :
    192.168.0.9 dans le réseau bleu
    192.168.1.1 dans le réseau rouge. Ce routeur s'appelle Helios.

Dans le réseau bleu, Saturne, d'adresse IP 192.168.0.2, envoie un ping sur Neptune, qui se trouve dans le réseau rouge avec l'IP 192.168.1.3.

Saturne

Machine sous Debian Woody.

Configuration réseau

saturne:~# ifconfig
eth0      Link encap:Ethernet HWaddr 00:00:E8:78:9A:1F
          inet addr:192.168.0.2 Bcast:192.168.0.255 Mask:255.255.255.0
          UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
          RX packets:2674831 errors:7 dropped:559 overruns:7 frame:0
          TX packets:1880271 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:100
          RX bytes:2193374824 (2.0 GiB) TX bytes:932807313 (889.5 MiB)
          Interrupt:10 Base address:0xa000

lo        Link encap:Local Loopback...

Observez bien les deux adresses qui vont nous être utiles par la suite :

HW addr  :00:00:E8:78:9A:1F
inet addr:192.168.0.2

Configuration de routage

saturne:~# route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
192.168.0.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0
0.0.0.0 192.168.0.9 0.0.0.0 UG 0 0 0 eth0

Notez la route par défaut : Il faut passer par eth0 et joindre le nœud 192.168.0.9.

Neptune

Egalement sous Debian Woody.

Configuration réseau

neptune:~# ifconfig
eth0      Link encap:Ethernet  HWaddr 00:A0:C9:E0:2B:7B
          inet addr:192.168.1.3  Bcast:192.168.1.255  Mask:255.255.255.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:527923 errors:0 dropped:0 overruns:0 frame:0
          TX packets:422325 errors:0 dropped:0 overruns:0 carrier:0
          collisions:21182 txqueuelen:100
          RX bytes:269846768 (257.3 MiB)  TX bytes:240923195 (229.7 MiB)
          Interrupt:11 Base address:0x5000

lo        Link encap:Local Loopback...

Observez bien ici aussi les deux adresses qui vont nous être utiles par la suite :

HW addr  : 00:A0:C9:E0:2B:7B
inet addr:192.168.1.3

Configuration de routage

neptune:~# route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
192.168.1.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0
0.0.0.0 192.168.1.1 0.0.0.0 UG 0 0 0 eth0

Notez là encore  la route par défaut : Il faut passer par eth0 et joindre le nœud 192.168.1.1.

Helios

Sous Mandrake 9.0.

Là, ça va être un peu plus compliqué, il y a deux interfaces réseau :

[root@helios root]# ifconfig
eth0      Lien encap:Ethernet  HWaddr 00:20:18:B9:49:37
          inet adr:192.168.0.9  Bcast:192.168.0.255  Masque:255.255.255.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:4338949 errors:0 dropped:0 overruns:0 frame:0
          TX packets:4968746 errors:0 dropped:0 overruns:0 carrier:0
          collisions:11750 lg file transmission:100
          RX bytes:503746782 (480.4 Mb)  TX bytes:547552476 (522.1 Mb)
          Interruption:9 Adresse de base:0x5000

eth1      Lien encap:Ethernet  HWaddr 00:20:AF:4A:66:00
          inet adr:192.168.1.1  Bcast:192.168.1.255  Masque:255.255.255.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:4403671 errors:0 dropped:0 overruns:0 frame:0
          TX packets:3762159 errors:0 dropped:0 overruns:0 carrier:0
          collisions:34316 lg file transmission:100
          RX bytes:2763013200 (2635.0 Mb)  TX bytes:2646670391 (2524.0 Mb)
          Interruption:5 Adresse de base:0x210

lo        Lien encap:Boucle locale...

Notons les adresses utiles pour chaque réseau :

HW addr :00:20:18:B9:49:37
inet adr:192.168.0.9

Pour le réseau 192.168.0.0

HWaddr 00:20:AF:4A:66:00
inet adr:192.168.1.1

Pour le réseau 192.168.1.0

Configuration de routage

[root@helios root]# route -n
Table de routage IP du noyau
Destination Passerelle Genmask Indic Metric Ref Use Iface
192.168.1.0 0.0.0.0 255.255.255.0 U 0 0 0 eth1
192.168.0.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0

Notez que cette machine n'est qu'un routeur, son unique rôle, simplifié à l'extrême, est d'interconnecter les deux réseaux 192.168.0.0 et 192.168.1.0

Aucune route par défaut n'est indiquée ici.

Tout ce que nous observons, c'est que Helios sait que :

  • Pour aller dans le réseau bleu (192.168.0.0), il faut envoyer les paquets sur eth0,
  • pour aller dans le réseau rouge (192.168.1.0), il faut envoyer les paquets sur eth1

C'est bien, mais ça ne suffit pas pour que Helios fonctionne comme un routeur. Nous avons un peu besoin d'IPtables :

iptables -A FORWARD -j ACCEPT  # c'est pas bien compliqué...

Il faut aussi s'assurer que l'on a autorisé le noyau à faire le routage :

echo 1 > /proc/sys/net/ipv4/ip_forward

Et ça va router…

saturne:~# ping -c 1 neptune
PING neptune.eme.org (192.168.1.3): 56 data bytes
64 bytes from 192.168.1.3: icmp_seq=0 ttl=254 time=1.2 ms

--- neptune.eme.org ping statistics ---
1 packets transmitted, 1 packets received, 0% packet loss
round-trip min/avg/max = 1.2/1.2/1.2 ms

Si le ping passe, c'est que ça route.

Juste pour le fun :

neptune:~# ping -c 1 saturne
PING saturne.eme.org (192.168.0.2): 56 data bytes
64 bytes from 192.168.0.2: icmp_seq=0 ttl=254 time=1.1 ms

--- saturne.eme.org ping statistics ---
1 packets transmitted, 1 packets received, 0% packet loss
round-trip min/avg/max = 1.1/1.1/1.1 ms

Ca marche aussi dans l'autre sens.

Snif

On regarde tout ça avec des sniffers, l'un sur le réseau bleu et l'autre sur le réseau rouge.

saturne:~# ping -c 1 neptune

Les traces qui suivent ont été expurgées de ce qui nous est inutile ici.

Tout ce qu'il est important d'observer est surligné

Frame 1 ...
Ethernet II
    Destination: 00:20:18:b9:49:37
    Source: 00:00:e8:78:9a:1f
    Type: IP (0x0800)
Internet Protocol, Src Addr: saturne.eme.org 
                             (192.168.0.2), 
                   Dst Addr: neptune.eme.org 
                             (192.168.1.3)
    ...
    Time to live: 64
    Protocol: ICMP (0x01)
    ...
Internet Control Message Protocol
    Type: 8 (Echo (ping) request)
... 

Frame 2 ...
Ethernet II
    Destination: 00:00:e8:78:9a:1f
    Source: 00:20:18:b9:49:37
    Type: IP (0x0800)
Internet Protocol, Src Addr: neptune.eme.org 
                             (192.168.1.3), 
                   Dst Addr: saturne.eme.org 
                             (192.168.0.2)
    ...
    Time to live: 254
    Protocol: ICMP (0x01)
    ...
Internet Control Message Protocol
    Type: 0 (Echo (ping) reply)
Frame 1 ...
Ethernet II
    Destination: 00:a0:c9:e0:2b:7b
    Source: 00:20:af:4a:66:00
    Type: IP (0x0800)
Internet Protocol, Src Addr: saturne.eme.org
                             (192.168.0.2),
                   Dst Addr: neptune.eme.org
                             (192.168.1.3)
    ...
    Time to live: 63
    Protocol: ICMP (0x01)
    ...
Internet Control Message Protocol
    Type: 8 (Echo (ping) request)
...

Frame 2...
Ethernet II
    Destination: 00:20:af:4a:66:00
    Source: 00:a0:c9:e0:2b:7b
    Type: IP (0x0800)
Internet Protocol, Src Addr: neptune.eme.org
                             (192.168.1.3),
                   Dst Addr: saturne.eme.org
                             (192.168.0.2)
    ...
    Time to live: 255
    Protocol: ICMP (0x01)
    ... 
Internet Control Message Protocol
    Type: 0 (Echo (ping) reply)

Vous avez noté les points fondamentaux :

  • Au niveau IP, les adresses source et destination sont les mêmes des deux côtés de Helios,
  • au niveau Ethernet, il n'en va pas de même :
    • Dans la trame 1 (echo request) :
      • côté bleu :
        • l'adresse MAC source est bien celle de Saturne,
        • l'adresse MAC destination est celle du routeur Helios côté bleu,
      • côté rouge :
        • l'adresse MAC source est celle du routeur Helios côté rouge,
        • l'adresse MAC destination est bien celle de Neptune,
    • Dans la trame 2 (echo reply) :
      • côté rouge :
        • l'adresse MAC source est bien celle de Neptune,
        • l'adresse MAC destination est celle u routeur Helios côté rouge,
      • côté bleu :
        • l'adresse MAC source est celle du routeur Helios côté bleu
        • l'adresse MAC de destination est bien celle de Saturne.

Autrement dit :

  • Lorsque Saturne doit envoyer son echo request à Neptune :
    • ICMP prépare son paquet et le refile à IP (couche 3),
    • IP constate que la cible n'est pas dans son réseau, cherche le routeur à joindre pour passer dans le réseau rouge. Il n'y a qu'une passerelle par défaut : 192.168.0.9.
      Advienne que pourra, on va lui envoyer le paquet, mais les adresses IP source et destination ne sont pas modifiées. En fait, IP va rechercher l'adresse MAC d'Helios dans son réseau et trouve que 192.168.0.9 a pour adresse MAC 00:20:18:b9:49:37.
      IP va donc déposer cette adresse de destination, avant de refiler le paquet à la couche 2
    • Ethernet va donc, sans se poser de question gérer ce paquet comme s'il s'adressait à Helios.
    • Helios reçoit ce paquet, le fait remonter jusqu'au niveau IP côté bleu (192.168.0.0),
    • là, la couche IP constate que Helios n'est pas le destinataire, puisque c'est Neptune (192.168.1.3),
    • Netfilter passe le paquer à la couche IP rouge (192.168.1.0)
    • La couche IP rouge va chercher l'adresse MAC de Neptune, puisqu'elle sait que Neptune est dans le même réseau qu'elle.

Et voilà le travail.

Un peu de philosophie

Jouons avec traceroute :

saturne:~# traceroute -I -n neptune
traceroute to neptune.eme.org (192.168.1.3), 30 hops max, 38 byte packets
1 192.168.0.9 0.824 ms 0.741 ms 0.740 ms
2 192.168.1.3 1.246 ms 0.922 ms 0.968 ms

neptune:~# traceroute -I -n saturne
traceroute to saturne.eme.org (192.168.0.2), 30 hops max, 38 byte packets
1 192.168.1.1 0.902 ms 0.705 ms 0.675 ms
2 192.168.0.2 1.108 ms 1.033 ms 1.008 ms

Bien entendu, nous passons toujours par Helios au « hop » 1, quelque soit le sens du traceroute, mais nous le voyons du côté bleu avec l'IP 192.168.0.9 et du côté rouge avec l'IP 192.168.1.1

Ça vous étonne ?