Créer un routeur statique sous linux (debian 12)
Bon, tu as envie de t'amuser avec le routage pour ton réseau perso ou pour monter un lab mais tu n'as pas envie de vendre ta maison pour te payer un routeur ? Et bien reste donc et installe toi confortablement, nous allons voir comment faire ça en ipv4 et ipv6 avec des technos récentes et le tout avec des outils de base en ligne de commande.
Icone d'un routeur utilisé dans les schémas réseaux licence CC0 1.0 Universal.
Un peu de contexte
Le routage, ça sert à quoi ?
Pour simplifier, le principe du routage c'est d'acheminer les paquets d'un réseau qui est géré par quelqu'un au réseau géré par quelqu'un d'autre. Les réseaux peuvent être connecté directement ou passer par d'autres réseaux intermédiaires. Il faut donc pourvoir aiguiller les paquets à chaque interconnexion vers les bons chemins. Les routeurs sont donc l’équivalent des carrefours avec des panneaux qui indiquent quel chemin prendre pour aller ou en veut (village A, village B, toute directions, etc).
Pourquoi faire un routeur soi-même ?
Comme je l'ai dit dans l'intro, ça n'est pas toujours intéressant d'acheter un vrai routeur du commerce si c'est juste pour simuler plusieurs petits réseaux dans le cas d'un labo. Même principe pour un réseau domestique. Les routeurs avec lesquels on peut faire des configs avancées coûtent cher. Et en plus le choix du hardware est ultra limité.
Avec ce tuto tu pourra utiliser un vieux PC auquel tu auras ajouté une carte réseau à moindre coût, voir même des adaptateurs USB vers ethernet pour environ 10 euros. Tu peux meme utiliser un odroid type H4 avec une carte d’extension 4 ports si vraiment t'aime la performance et l'efficience en terme de consommation électrique. Peut importe du moment que c'est un truc sur lequel tu peux installer une distribution linux et qu'il y a au moins 2 interfaces réseau.
A oui et je précise aussi que ce type de config fonctionne avec des machines virtuelles. Il est donc possible de créer des réseaus complexes dans des truc basiques comme virtualbox. C'est d’ailleurs ce que j'ai fait lors de l’écriture de cet article pour être certain que je ne te raconte pas de dinguerie.
Du routage mais pas trop hardcore
On va voir comment faire du routage statique. Il serait tout à fait possible de faire du routage dynamique avec BGP, de l'OSPF, voir même du RIP pour le fun (les trois sont des protocoles de communication inter-routeurs), mais on va commencer par quelque chose de plus accessible. Je rappelle que le but c'est de faire une routeur domestique, de labo ou de petite entreprise. Il n'y en aura normalement qu'un ou deux max sur un tel réseau.
C'est parti !
Prérequis
C'est mieux si tu connais au moins vaguement le principe des réseaux IP et des sous-réseaux.
Il va falloir activer le service systemd-networkd.service et nommer tes interfaces réseau. Si tu ne sais pas comment faire tu va devoir lire un autre des mes articles (ça me fait aussi un prétexte pour que tu reste un peu plus dans le coin 😁 ).
Comme d'habitude les commande sont à taper en root.
Ce qu'on va faire
Le routeur va permettre aux machines du réseau lan_bureaux de communiquer avec celles du réseau lan_serveurs. Les interfaces Ethernets du routeur seront nommées en fonction du réseau sur lequel chacune d'elle est raccordée. Ça sera plus simple et on évitera les confusions pendant la config (c'est pour ca qu'il faut les nommer correctement !).
Voila le shéma :

Source : moi. licence CC BY-SA 4.0.
Réseau lan_serveurs
Ce réseau aura comme plage d'adresses :
- ipv4 : 192.168.111.0/24
- ipv6 : fd00:ace::/32
L'interface "lan_serveurs" du routeur est connectée à un switch sur lequel sont raccordées les machines de ce réseau. Elle aura comme adresses :
- ipv4 : 192.168.111.1
- ipv6 : fd00:ace::1
Réseau lan_bureaux
Ce réseau aura comme plage d'adresses :
- ipv4 : 192.168.222.0/24
- ipv6 : fd00:b0b::/32
L'interface "lan_bureaux" du routeur est connectée à un switch sur lequel sont raccordées les machines de ce réseau. Elle aura comme adresses :
- ipv4 : 192.168.222.1
- ipv6 : fd00:b0b::1
Les logiciels utilisés
Pas de choses complexes ici avec des interfaces graphiques ou web lourdes, uniquement de la ligne de commande et des programmes basiques disponibles sur presque toutes les distribution linux :
- Systemd-networkd parce que c'est puissant et facile à configurer et déja préinstallé.
- Le kernel linux parce que ça fait le boulot et que de toute façon il est déjà la.
Voila c'est tout. Pas de framework à la noix ou d'interface web qui mange toutes les ressources. La distribution linux que j'utilise pour faire mes routeurs est une Debian 12 mais ça marche aussi avec ce que tu veux du moment que tu peux installer Systemd-networkd.
Ip forwarding
Par défaut le système détruit les paquets qui arrivent et qui ne sont pas à destination de l'adresse IP d'une de ses propres interfaces. On va donc activer la fonction permettant de faire transiter les paquets d'une interface entrante à une autre sortante.
Il va falloir éditer le fichier de configuration utilisateur du kernel /etc/sysctl.d/99-sysctl.conf. On va activer le forwarding de paquet pour l'ipv4 et l'ipv6 en décommentant les lignes suivantes :
net.ipv4.ip_forward=1
net.ipv6.conf.all.forwarding=1
Puis on recharge la config pour prendre en compte les modifications :
sysctl --system
Configuration des interfaces
Réseau lan_serveurs
Créer le fichier /etc/systemd/network/20-lan_serveurs.network qui contiendra :
[Match]
Name=lan_serveurs
[Network]
# Désactivation de l'autoconfig
DHCP=no
IPv6AcceptRA=false
LinkLocalAddressing=no
[Address]
Address=192.168.111.1/24
[Address]
Address=fd00:ace::1/32
Réseau lan_bureaux
Créer le fichier /etc/systemd/network/20-lan_serveurs.network qui contiendra :
[Match]
Name=lan_bureaux
[Network]
# Désactivation de l'autoconfig
DHCP=no
IPv6AcceptRA=false
LinkLocalAddressing=no
[Address]
Address=192.168.222.1/24
[Address]
Address=fd00:b0b::1/32
Activation de la conf
Une fois les fichiers édités, recharger la configuration réseau :
systemctl reload systemd-networkd
Controler la conf avec la commande suivante :
ip address
Ce qui doit donner :
3: lan_serveurs: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
link/ether 08:00:27:3c:d3:d9 brd ff:ff:ff:ff:ff:ff
inet 192.168.111.1/24 brd 192.168.111.255 scope global lan_serveurs
valid_lft forever preferred_lft forever
inet6 fd00:ace::1/16 scope global
valid_lft forever preferred_lft forever
4: lan_bureaux: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
link/ether 08:00:27:85:07:1c brd ff:ff:ff:ff:ff:ff
inet 192.168.222.1/24 brd 192.168.222.255 scope global lan_bureaux
valid_lft forever preferred_lft forever
inet6 fd00:b0b::1/16 scope global
valid_lft forever preferred_lft forever
Routage
Cette partie va être très simple puisque systemd-networkd ajoute automatiquement à la table de routage principale de la machine les réseaux dans lesquels se trouvent les interfaces configurées par son biais.
Il faut juste verifier que les routes sont bien apparues (pour l'ipv4):
ip route
ce qui doit donner :
192.168.111.0/24 dev lan_serveurs proto kernel scope link src 192.168.111.1
192.168.222.0/24 dev lan_bureaux proto kernel scope link src 192.168.222.1
Et pour ipv6
ip -6 route
fd00:ace::/32 dev lan_serveurs proto kernel metric 256 pref medium
fd00:b0b::/32 dev lan_bureaux proto kernel metric 256 pref medium
Tests de bon fonctionnement
Verifications
Dans le Réseau lan_bureaux on a une machine configurée comme ceci :
[Match]
Name=enp0s3
[Network]
Address=192.168.222.10/24
[Network]
Address=fd00:b0b::10/32
[Route]
Gateway=fd00:b0b::1
[Route]
Gateway=192.168.222.1
Et dans le réseau lan_serveurs on a un serveur configurée comme ceci :
[Match]
Name=lan
[Address]
Address=192.168.111.50/24
[Address]
Address=fd00:ace::50/32
[Route]
Gateway=92.168.111.1
[Route]
Gateway=fd00:ace::1
Depuis la machine dans le lan_bureaux on peut tester :
ping 192.168.111.50
Ce qui donne :
PING 192.168.111.50 (192.168.111.50) 56(84) bytes of data.
64 bytes from 192.168.111.50: icmp_seq=1 ttl=63 time=0.322 ms
64 bytes from 192.168.111.50: icmp_seq=2 ttl=63 time=0.462 ms
Ca fonctionne en ipv4.
Et en ipv6 :
ping -6 fd00:ace::50
Ce qui donne :
PING fd00:ace::50(fd00:ace::50) 56 data bytes
64 bytes from fd00:ace::50: icmp_seq=1 ttl=63 time=0.510 ms
64 bytes from fd00:ace::50: icmp_seq=2 ttl=63 time=0.593 ms
A ce stade tout est bon.
Explications
L'ajout d'une section [Route] dans un fichier systemd-networkd sans préciser de réseau de Destination est l'équivalent d'un panneau "toutes directions". Cela indique à la machine sur laquelle est configurée cette interface que si elle ne connait pas le réseau de destination, elle envoie par defaut les paquets à l'adresse pointée en gateway. Pour un pc sur réseau domestique (celui que tu as probablement chez toi) il s'agit de l'adresse de la box internet.
Si on voulait router du traffic vers un réseau spécifique précis on pourrrait le faire par exemple comme ceci :
[Match]
Name=enp0s3
[Network]
Address=192.168.222.10/24
[Network]
Address=fd00:b0b::10/32
[Route]
Gateway=fd00:b0b::1
[Route]
Gateway=192.168.222.1
[Route]
# Route vers un VPN monté localement en 10.8.0.1
Gateway=10.8.0.1
Destination=192.168.50.0/24
C'est ce qu'on ferait dans le cas d'un VPN installé sur la machine de bureau, par exemple, qui n'aspirerait que les flux relatifs à un réseau (ici 192.168.50.0/24) qui est à l'autre bout du tunnel VPN.
Conclusion
Et voila, tu as pu voir comment transformer n'importe quelle machine linux en routeur en modifiant seulement quelques fichiers de config déja présents sur le système. Avec quelques règles de pare-feu on pourrait même facilement transformer une machine comme notre routeur en DMZ.
Pour info aussi, avec ce type de config, j'ai fabriqué des switchs et des routeurs qui fonctionnent jusqu'à 100Gbps sur 6 interfaces avec des chassis de serveurs DELL et juste une Debian.
Mais ne me crois pas sur parole, teste par toi même. Et surtout amuse toi bien ;)