Le code des outils de configuration réseau ne faisant pas partie du noyau est généralement appelé : userspace code.
À 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.
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.
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
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.
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
.
-
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. -
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. -
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 ]