4. Les outils réseaux du noyau Linux

Le code des outils de configuration réseau ne faisant pas partie du noyau est généralement appelé : userspace code.

4.1. Configuration des interfaces réseaux

À partir de la version 2.2 du noyau LINUX, de nombreuses fonctionnalités sont apparues dans le support du protocole TCP/IP, notamment au niveau du routage. Pour pouvoir utiliser ces nouveautés, les outils classiques tels que ifconfig ou route ne suffisent plus. Il convient d'utiliser un nouvel outil, appelé iproute2. Le paquet de la distribution Debian GNU/Linux est baptisé iproute.

La syntaxe générale pour l'outil iproute2 est la suivante :

Usage: ip [ OPTIONS ] OBJET { COMMAND | help }
où  OBJET := { link | addr | route | rule | neigh | tunnel |
                   maddr | mroute | monitor }
       OPTIONS := { -V[ersion] | -s[tatistics] | -r[esolve] |
                    -f[amily] { inet | inet6 | dnet | link } | -o[neline] }

Les différents objets permettent de voir ou de configurer un élément du réseau.

4.2. ip link

L'objet link permet de visualiser l'état des périphériques réseaux et de les modifier. La syntaxe générale pour cette option est la suivante :

Usage: ip link set DEVICE { up | down | arp { on | off } |
                             dynamic { on | off } |
                             multicast { on | off } | txqueuelen PACKETS |
                             name NEWNAME |
                             address LLADDR | broadcast LLADDR |
                             mtu MTU }
       ip link show [ DEVICE ]

Cette option ne s'intéresse qu'au niveau 2 du modèle OSI.

4.3. ip address

Cet objet permet d'attacher une ou plusieurs adresses IPv4 ou IPv6 à un périphérique réseau.

Usage: ip addr {add|del} IFADDR dev STRING
       ip addr {show|flush} [ dev STRING ] [ scope SCOPE-ID ]
                            [ to PREFIX ] [ FLAG-LIST ] [ label PATTERN ]
IFADDR := PREFIX | ADDR peer PREFIX
          [ broadcast ADDR ] [ anycast ADDR ]
          [ label STRING ] [ scope SCOPE-ID ]
SCOPE-ID := [ host | link | global | NUMBER ]
FLAG-LIST := [ FLAG-LIST ] FLAG
FLAG  := [ permanent | dynamic | secondary | primary |
           tentative | deprecated ]

La configuration de base d'une interface réseau ressemble à ceci :

# ifconfig eth0 192.168.0.2 netmask 255.255.255.0 broadcast 192.168.0.255
# route add default gw 192.168.0.1

Les commandes équivalentes avec l'outil iproute2 sont les suivantes :

# ip addr add 192.168.0.2/24 dev eth0 brodcast 192.168.0.255
# ip route add default dev eth0 via 192.168.0.1

4.4. ip rule

Le routage du trafic IP a été complètement revu avec le noyau 2.2. Avant cette version, la prise de décision ne se faisait qu'en consultant l'adresse de destination. Dans certaines circonstances, on peut souhaiter router les paquets IP en se basant sur d'autres champs : adresse source, champs TOS, etc.

Le routage est maintenant basé sur l'existence d'un ensemble de règles, qui dirigent le paquet vers des tables de routage. L'ensemble de ces règles est vu comme une base de données par le noyau, que l'on appelle Routing Policy DataBase (RPDB). Cette base de données de la politique de routage est en fait une liste linéaire de règles ordonnées par une valeur numérique de priorité. La gestion de ces règles se fait par l'intermédiaire de l'objet rule, dont voici la syntaxe :

Usage: ip rule [ list | add | del ] SELECTOR ACTION
SELECTOR := [ from PREFIX ] [ to PREFIX ] [ tos TOS ] [ fwmark FWMARK ]
            [ dev STRING ] [ pref NUMBER ]
ACTION := [ table TABLE_ID ] [ nat ADDRESS ]
          [ prohibit | reject | unreachable ]
          [ realms [SRCREALM/]DSTREALM ]
TABLE_ID := [ local | main | default | NUMBER ]

Chaque règle est constituée d'un sélecteur et d'une action. Quand le noyau a besoin de prendre une décision sur le routage, la Routing Policy DataBase (RPDB) est scannée dans l'ordre des priorités croissantes. Pour chaque paquet, on compare le sélecteur de la règle et l'en-tête du paquet. Si il y a correspondance entre les deux, l'action est réalisée. En général, l'action consiste à se «brancher» sur une table de routage qui contient l'information utile. Si l'action ne parvient pas à déterminer une route, alors la règle suivante est examinée. La commande suivante permet de lister l'ensemble des règles définies dans la base RPDB :

$ ip rule ls
0:      from all lookup local 
32766:  from all lookup main 
32767:  from all lookup default 

Ces lignes méritent quelques explications. Les chiffres de la colonne de gauche indiquent la priorité de la règle. Ensuite, on a le sélecteur. Dans ce cas, toutes les règles seront appliquées à tous les paquets (from all). Enfin, on a l'action. Le mot-clé lookup indique d'aller regarder la table de routage dont le nom suit.

4.5. ip route

Une fois que le noyau a sélectionné la table à consulter, il recherche dans celle-ci les informations de routage proprement dites. Ces informations précisent le périphérique de sortie et éventuellement l'adresse de la prochaine passerelle. Par défaut, il y a trois tables de routage : local, main et default.

  1. local : cette table est une table un peu spéciale ayant la plus grande priorité. Elle contient les routes pour les adresses locales et les adresses de diffusion.

  2. main : cette table est la table de routage normale, et ce sont les informations contenues dans celle-ci qui seront affichées par la commande ip route ls.

  3. default : cette table est généralement vide et n'est consultée que si les règles précédentes n'ont pas sélectionné le paquet.

La syntaxe associée à l'objet route est la suivante :

Usage: ip route { list | flush } SELECTOR
       ip route get ADDRESS [ from ADDRESS iif STRING ]
                            [ oif STRING ]  [ tos TOS ]
       ip route { add | del | change | append | replace | monitor } ROUTE
SELECTOR := [ root PREFIX ] [ match PREFIX ] [ exact PREFIX ]
            [ table TABLE_ID ] [ proto RTPROTO ]
            [ type TYPE ] [ scope SCOPE ]
ROUTE := NODE_SPEC [ INFO_SPEC ]
NODE_SPEC := [ TYPE ] PREFIX [ tos TOS ]
             [ table TABLE_ID ] [ proto RTPROTO ]
             [ scope SCOPE ] [ metric METRIC ]
INFO_SPEC := NH OPTIONS FLAGS [ nexthop NH ]...
NH := [ via ADDRESS ] [ dev STRING ] [ weight NUMBER ] NHFLAGS
OPTIONS := FLAGS [ mtu NUMBER ] [ advmss NUMBER ]
           [ rtt NUMBER ] [ rttvar NUMBER ]
           [ window NUMBER] [ cwnd NUMBER ] [ ssthresh REALM ]
           [ realms REALM ]
TYPE := [ unicast | local | broadcast | multicast | throw |
          unreachable | prohibit | blackhole | nat ]
TABLE_ID := [ local | main | default | all | NUMBER ]
SCOPE := [ host | link | global | NUMBER ]
FLAGS := [ equalize ]
NHFLAGS := [ onlink | pervasive ]
RTPROTO := [ kernel | boot | static | NUMBER ]