Comment le noyau interprète-t-il la table de routage

Tags: #<Tag:0x00007f63f2184130>

La situation est la suivante. Une station équipée de deux interfaces sert, entre autres, de firewall. « enp2s2 » est reliée à une box internet et « enp2s5 » au réseau local. Très classique donc.
Le réseau local a pour adresse 192.168.0.0/24 et celui de la box, 192.168.1.0/24.

Comme j’ai un problème de configuration avec le firewall, j’ai essayé d’interpréter la table de routage. D’après ce que j’ai compris, le noyau opère un « ET » logique entre l’adresse de destination du paquet et le masque (Genmask) d’une ligne de la table, puis compare le résultat à la « Destination » inscrite sur cette même ligne. Si le résultat du « ET » logique et la « Destination » sont équivalents, le paquet est envoyé à l’interface inscrite sur cette ligne. Dans le cas contraire, il passe à la suivante.

Voila la table de routage de ma station « firewall » :

Root /!\ : netstat -rn                                                                                              
Table de routage IP du noyau                                                                                        
Destination     Passerelle      Genmask         Indic   MSS Fenêtre irtt Iface                                      
0.0.0.0         192.168.1.254   0.0.0.0         UG        0 0          0 enp2s2                                     
192.168.0.0     0.0.0.0         255.255.255.0   U         0 0          0 enp2s5                                     
192.168.1.0     0.0.0.0         255.255.255.0   U         0 0          0 enp2s2                                     
Root /!\ :

Dans des documentations, qui datent malheureusement, j’ai lu que le noyau commence par la première ligne, puis éventuellement interprète la seconde et ainsi de suite.

Seulement voila, si j’en crois la table de mon firewall, tous les paquets sont envoyés vers la box, puisque un « ET » logique entre une adresse et 0.0.0.0, donnera toujours 0.0.0.0 !

Donc, soit la présentation du résultat de la commande netstat -rn a changé, soit, je n’ai rien compris !

Quelqu’un pourrait il m’éclairer sur le sujet ou me transmettre un lien vers un cours (fr/en) sérieux sur le sujet ?

Merci de votre attention. :slight_smile:

Alors, de ce que j’en sais, il trouve les lignes qui correspondent à l’adresse de destination (avec le ET, comme tu le dis), puis il prend la route avec la métrique la plus faible. La métrique apparaît quand tu exécutes une commande un peu moins obsolète comme ip r, que tu n’as pas besoin d’exécuter en tant que root.
Après, je ne sais pas comment il fait en cas d’égalité. Il doit probablement choisir au masque le plus long ou à l’absence de passerelle…

L’ordre d’affichage des routes n’a aucune importance.

Non, il prend d’abord la route avec le préfixe de destination le plus long qui correspond. Ensuite seulement, il utilise la métrique pour départager des routes qui ont le même préfixe.

Ou bien une commande tout aussi obsolète comme route -n.

Le préfixe, c’est le masque non ? Tu veux dire le plus long, non ? Sinon, il enverrait tout le trafic à la route par défaut.

Non, mais les deux ont la même longueur.

Tu as raison, je corrige. Toujours ce problème de confusion entre la taille du préfixe et la taille du réseau correspondant, on parle de l’une en pensant à l’autre…

1 J'aime

Merci pour vos réponses très enrichissantes.

Par contre, au sujet de la commande ip r, j’ai sur ma station une métrique qui s’affiche :

 :-) ip r                                                                                       
default via 192.168.0.1 dev enp3s0 proto dhcp src 192.168.0.2 metric 202 
192.168.0.0/24 dev enp3s0 proto dhcp scope link src 192.168.0.2 metric 202 
 :-)

Mais pas sur la station servant de firewall :

Screen /!\ : ip r
default via 192.168.1.254 dev enp2s2
192.168.0.0/24 dev enp2s5 proto kernel scope link src 192.168.0.1
192.168.1.0/24 dev enp2s2 proto kernel scope link src 192.168.1.36
Screen /!\ : 

Va comprendre Charles !

Au sujet de l’ordre d’interprétation des lignes de la table de routage, il me semble que la documentation de Shorewall prête à confusion, puisqu’au chapitre « Routing » de la page,

file:///usr/share/doc/shorewall-doc/html/shorewall_setup_guide.htm

l’auteur écrit :

When the kernel is trying to send a packet to IP address A, it starts at the
top of the routing table and:

  * A is logically ANDed with the “Genmask” value in the table entry.
   
  * The result is compared with the “Destination” value in the table entry.
   
  * If the result and the “Destination” value are the same, then:
   
      + If the “Gateway” column is non-zero, the packet is sent to the gateway
        over the interface named in the “Iface” column.
       
      + Otherwise, the packet is sent directly to A over the interface named in
        the “iface” column.
       
  * Otherwise, the above steps are repeated on the next entry in the table.

D’ailleurs, avec d’autres vieux exemples trouvés sur la toile, on retrouve systématiquement la passerelle en fin de liste.

Y aurait il eu, en un temps que les moins de vingt ans ne peuvent pas connaître, une interprétation par ordre d’apparition dans la table ?

C’était il y a très longtemps, sur Red Hat c est sur, idem Mandrake, mais sur debian je ne suis pas sur

La présence ou non d’une métrique dépend du programme qui a créé la route, de sa configuration, de la méthode…

Encore faut-il savoir de quel ordre il s’agit. Cela ne peut pas être l’ordre d’affichage qui est manifestement l’ordre croissant des adresses de préfixes. Si l’ordre est celui des préfixes triés par longueur décroissante, alors la documentation est correcte.

De toute façon, pour savoir quelle route le noyau utiliserait pour telle adresse de destination, il suffit de lui demander avec ip route get <adresse>

1 J'aime

Impeccable ! Ça fonctionne du tonnerre !

Je clos le fil puisque j’ai eu toutes les réponses aux questions que je me posais.

Merci pour votre participation.