Pour qu'une machine soit en mesure d'en contacter une autre, il faut que soit mis en place un mécanisme qui décrive comment aller de l'une à l'autre. C'est ce que l'on appelle le routage. Une “route” est définie par une paire d'adresses: une “destination” et une “passerelle”. Cette paire signifie que pour atteindre cette destination, vous devez passer par cette passerelle. Il y a trois sortes de destination: les machines individuelles, les sous-réseaux, et “default”—la destination par défaut. La route par défaut (“default route”) est utilisée lorsqu'aucune autre route n'est applicable. Nous parlerons un peu plus des routes par défaut par la suite. Il existe également trois sortes de passerelles: les machines individuelles, les interfaces (aussi appelées “liens”), et les adresses Ethernet matérielles (adresses MAC).
Pour illustrer différents aspects du routage,
nous utiliserons l'exemple suivant, qui est produit par la
commande netstat
:
%
netstat -r
Routing tables Destination Gateway Flags Refs Use Netif Expire default outside-gw UGSc 37 418 ppp0 localhost localhost UH 0 181 lo0 test0 0:e0:b5:36:cf:4f UHLW 5 63288 ed0 77 10.20.30.255 link#1 UHLW 1 2421 example.com link#1 UC 0 0 host1 0:e0:a8:37:8:1e UHLW 3 4601 lo0 host2 0:e0:a8:37:8:1e UHLW 0 5 lo0 => host2.example.com link#1 UC 0 0 224 link#1 UC 0 0
Les deux premières lignes définissent la
route par défaut (dont nous parlerons dans la section suivante) et la
route localhost
.
L'interface (colonne Netif
) qu'il est
indiqué d'utiliser pour localhost
est
lo0
, aussi appelée interface
“loopback”—en boucle. Ce qui veut dire que
tout le trafic vers cette destination doit rester interne, au
lieu d'être envoyé sur le réseau local,
puisqu'il reviendra de toute façon à son point de
départ.
Ce qui se remarque ensuite, ce sont les adresses
commençant par 0:e0:
. Ce
sont les adresses Ethernet matérielles, qui sont
également connues sous le nom d'adresses MAC. FreeBSD
reconnaîtra automatiquement toute machine
(test0
dans l'exemple) sur le réseau
local Ethernet et ajoutera une route vers cette machine,
directement via l'interface Ethernet
ed0
. Il y a aussi un délai
(colonne Expire
) associé à ce
type de route, qui est utilisé si l'on entend plus parler
de cette machine pendant un laps de temps précis. Quand
cela arrive, la route vers cette machine est automatiquement
supprimée. Ces machines sont identifiées par un
mécanisme appelé RIP (“Routing Information
Protocol”—protocole d'information de routage), qui
met en place des routes vers les machines locales en
déterminant le chemin le plus court.
FreeBSD ajoutera également des routes de
sous-réseau pour le sous-réseau local (10.20.30.255
est l'adresse de diffusion
pour le sous-réseau 10.20.30
, et example.com
est le nom de domaine
associé à ce sous-réseau). La
dénomination link#1
fait
référence à la première carte
Ethernet de la machine. Vous constaterez qu'il n'y a pas
d'autre interface associée à ces routes.
Ces deux types de routes (vers les machines du réseau local et les sous-réseaux locaux) sont automatiquement configurés par un “daemon” appelé routed. S'il ne tourne pas, alors seules les routes définies comme statiques (i.e. explicitement définies) existeront.
La ligne host1
fait
référence à votre machine, qui est
identifiée par l'adresse Ethernet. Puisque nous sommes
l'émetteur, FreeBSD sait qu'il faut utiliser l'interface
en “boucle” (lo0
)
plutôt que d'envoyer les données sur l'interface
Ethernet.
Les deux lignes host2
montrent ce qui
se passe quand on utilise un alias avec ifconfig(8)
(lisez la section sur l'Ethernet pour savoir pour quelles
raisons on peut vouloir cela). Le symbole
=>
qui suit l'interface
lo0
indique que non seulement nous
utilisons l'interface en “boucle” (puisque cette
adresse correspond également à la machine
locale), mais que c'est plus spécifiquement un alias.
Ce type de route n'apparaît que sur la machine pour
laquelle est défini l'alias; sur toutes les autres
machines du réseau local il n'y aura q'une ligne
link#1
pour cette machine.
La dernière ligne (le sous-réseau
destinataire 224
) concerne le
multicasting (diffusion pour plusieurs destinataires), qui
sera abordé dans une autre section.
Et enfin, diverses caractéristiques de chaque route
sont indiquées dans la colonne Flags
(indicateurs). Ci-dessous, une courte table présente
certains de ces indicateurs et leur signification:
U | Active (“Up”): la route est active. |
H | Machine (“Host”): la destination de la route est une machine. |
G | Passerelle (“Gateway”): envoyer tout ce qui concerne cette destination sur la machine distante indiquée, qui déterminera à qui transmettre ensuite. |
S | Statique (“Static”): cette route a été configurée manuellement et non pas générée automatiquement par le système. |
C | Clone: génère une nouvelle route sur la base de celle-ci pour les machines auxquelles nous nous connectons. Ce type de route est normalement utilisé pour les réseaux locaux. |
W | Clonée (“WasCloned”): cette route a été auto-configurée (Clone) à partir d'une route pour le réseau local. |
L | Lien (“Link”): la route fait référence à une adresse matérielle Ethernet. |
Quand le système local doit établir une connexion avec une machine distante, il consulte la table de routage pour voir s'il existe déjà une route connue. Si la machine distante appartient à un sous-réseau auquel le système sait se connecter (routes clonées), alors le système vérifie s'il peut se connecter via cette interface.
Si toutes les routes connues échouent, il reste
alors au système une dernière option: la route
par “défaut”. Cette route est un type
particulier de route passerelle (c'est
généralement la seule du système), et est
toujours marquée avec un c
dans le
champ des indicateurs. Pour les machines du réseau
local, cette passerelle est définie avec la machine qui
est directement connectée au monde extérieur
(que ce soit par une liaison PPP, DSL, cable, T1, ou toute
autre interface réseau).
Si vous configurez la route par défaut sur une machine qui fonctionne comme passerelle vers le monde extérieur, alors la route par défaut sera la passerelle de votre Fournisseur d'Accès à Internet (FAI).
Examinons un exemple de route par défaut. Voici une configuration classique:
Les machines Local1
et
Local2
sont sur votre site.
Local1
est connectée au serveur du FAI
via une liaison PPP par modem. Ce serveur PPP est
connecté par l'intermédiaire d'un réseau
local à un autre ordinateur passerelle relié au
point d'entrée Internet du FAI.
Les routes par défaut sur chacune de vos machines seront:
Machine | Passerelle par défaut | Interface |
---|---|---|
Local2 | Local1 | Ethernet |
Local1 | T1-GW | PPP |
Une question qui revient souvent est “Pourquoi
(ou comment) définir T1-GW
comme
passerelle par défaut pour Local1
,
plutôt que le serveur du FAI auquel elle est
connectée?“.
Rappelez-vous, puisque l'interface PPP utilise, de votre
côté de la connexion, une adresse IP du
réseau local du FAI, les routes vers toute autre
machine du réseau local du FAI seront automatiquement
générées. Par conséquent vous
savez déjà comment atteindre la machine
T1-GW
, il n'y a donc pas besoin
d'étape intermédiaire qui passe par le serveur
du FAI.
Il est habituel d'attribuer l'adresse X.X.X.1
à la passerelle sur
votre réseau local. Donc (dans notre exemple), si
votre espace d'adresse de classe C local était 10.20.30
et que votre FAI utilisait
l'espace 10.9.9
, alors les
routes par défaut seraient:
Machine | Route par défaut |
---|---|
Local2 (10.20.30.2) | Local1 (10.20.30.1) |
Local1 (10.20.30.1, 10.9.9.30) | T1-GW (10.9.9.1) |
Vous pouvez aisément définir la route par
défaut via le fichier
/etc/rc.conf
. Dans notre exemple, sur la
machine Local2
, nous avons ajouté la
ligne suivante dans /etc/rc.conf
:
defaultrouter="10.20.30.1"
Il est également possible de faire directement cela à partir de la ligne de commande avec la commande route(8):
#
route add default 10.20.30.1
Pour plus d'informations sur la manipulation à la main des tables de routage réseau, consultez la page de manuel route(8).
Il y a un autre type de configuration dont il faut parler, c'est celle d'une machine qui est connectée à deux réseaux différents. Techniquement, toute machine servant de passerelle (comme dans l'exemple ci-dessus, en utilisant une connexion PPP) est une machine sur deux réseaux. Mais ce terme n'est normalement utilisé que pour faire référence à une machine qui est sur deux réseaux locaux différents.
Selon le cas, la machine dispose de deux cartes Ethernet, ayant chacune une adresse sur des sous-réseaux séparés. Alternativement, la machine peut ne disposer que d'une seule carte Ethernet, et utiliser des alias avec ifconfig(8). Le premier cas correspond à l'utilisation de deux réseaux Ethernet physiquement séparés, le deuxième cas est employé s'il n'y a qu'un seul réseau physique mais deux sous-réseaux logiquement distincts.
Dans les deux cas, les tables de routage sont définies de telle sorte que chaque sous-réseau sache que cette machine est la passerelle (route entrante) vers l'autre sous-réseau. Cette configuration, où la machine sert de routeur entre les deux sous-réseaux, est souvent utilisée quand il faut mettre en place un dispositif de sécurité: filtrage de paquets ou coupe-feu, dans l'une ou dans les deux directions.
Si vous voulez que cette machine transmette réellement les paquets entre les deux interfaces, vous devez demander à FreeBSD d'activer cette fonctionnalité. Lisez la section suivante pour plus de détails sur comment faire cela.
Un routeur est un système qui transmet les paquets
d'une interface à une autre. Les standards de
l'Internet et de bons principes d'ingénierie
empêchent le projet FreeBSD d'activer cette fonction par
défaut sous FreeBSD. Vous pouvez l'activer en
positionnant à YES
la variable
suivante du fichier rc.conf(5):
gateway_enable=YES # Set to YES if this host will be a gateway
Cette option fixera la variable sysctl(8)
net.inet.ip.forwarding
à la valeur
1
. Si vous devez arrêter
temporairement le routage, vous pouvez positionner la variable
momentanément à 0
.
Votre nouveau routeur aura besoin de route pour savoir où envoyer le trafic. Si votre réseau est suffisamment simple vous pouvez utiliser des routes statiques. FreeBSD est également fourni avec le “daemon” de routage BSD standard routed(8), qui comprend et utilise les protocoles RIP (version 1 est 2) et IRDP. Le support de BGP v4, OSPF v2, et d'autres protocoles de routage sophistiqué est disponible avec le logiciel net/zebra. Des produits commerciaux comme GateD® sont également disponibles comme solutions avancées de routage.
Supposons que nous avons un réseau comme celui-ci:
Dans ce scénario, RouteurA
est
notre machine FreeBSD qui joue le rôle de routeur pour
l'Internet. Elle a une route par défaut vers 10.0.0.1
qui permet de se connecter
au reste du monde extérieur. Nous supposerons que la
machine RouteurB
est correctement
configurée et sait comment transmettre vers n'importe
quelle destination (D'après notre schéma c'est
relativement simple. Ajoutez juste une route par
défaut sur RouteurB
en utilisant
192.168.1.1
comme
passerelle).
Si nous regardons la table de routage de
RouteurA
nous verrions quelque chose
comme:
%
netstat -nr
Routing tables Internet: Destination Gateway Flags Refs Use Netif Expire default 10.0.0.1 UGS 0 49378 xl0 127.0.0.1 127.0.0.1 UH 0 6 lo0 10.0.0/24 link#1 UC 0 0 xl0 192.168.1/24 link#2 UC 0 0 xl1
Avec la table de routage actuelle,
RouteurA
ne sera pas en mesure d'atteindre
notre réseau interne 2. Elle ne dispose pas de route
pour 192.168.2.0/24
. Une
manière de résoudre cela est d'ajouter
manuellement la route. La commande suivante ajouterait le
réseau interne 2 à la table de routage de
RouteurA
en utilisant 192.168.1.2
comme point
intermédiaire:
#
route add -net 192.168.2.0/24 192.168.1.2
Maintenant RouteurA
peut joindre
n'importe quelle machine du réseau 192.168.2.0/24
.
L'exemple précédent est parfait pour
configurer une route statique sur un système en
fonctionnement. Cependant, le problème est que
l'information de routage ne sera pas conservée si
vous redémarrez votre machine FreeBSD. L'addition d'une
route statique doit se faire dans votre fichier
/etc/rc.conf
:
# Add Internal Net 2 as a static route static_routes="internalnet2" route_internalnet2="-net 192.168.2.0/24 192.168.1.2"
La variable static_routes
est une
liste de chaîne de caractères
séparées par une espace. Chaque chaîne
fait référence à un nom de route. Dans
notre exemple nous avons qu'une seule chaîne dans
static_routes
. Cette chaîne est
internalnet2
. Nous ajoutons
ensuite une variable de configuration appelée
route_internalnet2
dans laquelle nous mettons tous les paramètres de
configuration que nous passerions à la commande
route(8). Pour nous exemple précédent
nous aurions utilisé la commande:
#
route add -net 192.168.2.0/24 192.168.1.2
nous avons donc besoin de "-net 192.168.2.0/24
192.168.1.2"
.
Comme cela a été précisé,
nous pouvons avoir plus d'une chaîne dans la variable
static_routes
. Cela nous permet de
créer plusieurs routes statiques. Les lignes
suivantes donnent un exemple d'ajout de routes statiques
pour les réseaux 192.168.0.0/24
et 192.168.1.0/24
sur un routeur
imaginaire:
static_routes="net1 net2" route_net1="-net 192.168.0.0/24 192.168.0.1" route_net2="-net 192.168.1.0/24 192.168.1.1"
Nous avons déjà expliqué comment définir nos routes vers le monde extérieur, mais pas comment le monde extérieur apprend à nous localiser.
Nous savons déjà que les tables de routages peuvent être renseignées pour que tout le trafic pour un espace d'adresses donné (dans nos exemples, un sous-réseau de classe C) soit envoyé à une machine précise de ce réseau, qui transmettra les paquets entrants.
Lorsqu'il attribue un espace d'adresses à votre site, votre fournisseur d'accès définira ses tables de routage de sorte que tout le trafic destiné à votre sous-réseau vous soit envoyé sur votre liaison PPP. Mais comment les sites à l'autre bout du pays savent-ils qu'ils doivent passer par votre fournisseur d'accès?
Il existe un mécanisme (assez semblable au système d'information distribué du DNS) qui conserve un enregistrement de tous les espaces d'adresses affectés, et définit leur point de connexion à la dorsale Internet (“backbone”). La “dorsale” comprend les liaisons principales qui véhiculent le trafic Internet à travers le pays et le monde entier. Chaque machine de la dorsale dispose d'une copie de l'ensemble des tables maîtresses qui aiguillent le trafic pour un réseau donné vers le transporteur correspondant de la dorsale, et de là par l'intermédiaire de fournisseurs d'accès successifs, jusqu'à atteindre votre réseau.
C'est le rôle de votre fournisseur d'accès d'annoncer aux sites de la dorsale qu'il est le point de connexion (et par conséquent la route entrante) pour votre site. C'est ce que l'on appelle la propagation de route.
Il se peut qu'il y ait parfois un problème avec la propagation de route et que certains sites ne puissent vous atteindre. La commande probablement la plus utile pour déterminer où une route est défaillante est la commande traceroute(8). Elle est également utile si vous n'arrivez pas à vous connecter à une machine distante (i.e. lorsque ping(8) échoue).
La commande traceroute(8) prend comme paramètre le nom de la machine distante avec laquelle vous essayez d'établir une connexion. Elle vous donnera la liste de passerelles intermédiaires jusqu'à la machine cible, ou jusqu'à ce qu'il n'y ait plus de connexion.
Pour plus d'informations, consultez la page de manuel de traceroute(8).
FreeBSD supporte nativement les applications et le routage multicast (diffusion pour plusieurs destinataires). Les applications multicast ne nécessitent pas de configuration spécifique de FreeBSD, généralement, elles fonctionneront directement. Le routage multicast demande à ce que le support soit compilé dans le noyau:
options MROUTING
De plus, le “daemon” de routage multicast,
mrouted(8) doit être configuré par
l'intermédiaire du fichier
/etc/mrouted.conf
pour mettre en place
des tunnels et le protocole DVMRP. Plus de détails sur
la configuration du routage multicast peuvent être
trouvés dans la page de manuel de
mrouted(8).
Ce document, ainsi que d'autres peut être téléchargé sur ftp://ftp.FreeBSD.org/pub/FreeBSD/doc/
Pour toutes questions à propos de FreeBSD, lisez la
documentation avant de contacter
<questions@FreeBSD.org>.
Pour les questions sur cette documentation, contactez
<doc@FreeBSD.org>.