Différences entre versions de « Source routing »
(Page créée avec « = Introduction = Le routage source permet de router un paquet en fonction de son réseau source plutôt que son réseau destination. Cela peut être utile dans le cas d'un... ») |
|||
(6 versions intermédiaires par le même utilisateur non affichées) | |||
Ligne 2 : | Ligne 2 : | ||
Le routage source permet de router un paquet en fonction de son réseau source plutôt que son réseau destination. Cela peut être utile dans le cas d'un routeur avec plusieurs interfaces connectées à Internet pour permettre de faire sortir les paquets d'une DMZ vers une interface et les paquets du LAN vers une autre interface. | Le routage source permet de router un paquet en fonction de son réseau source plutôt que son réseau destination. Cela peut être utile dans le cas d'un routeur avec plusieurs interfaces connectées à Internet pour permettre de faire sortir les paquets d'une DMZ vers une interface et les paquets du LAN vers une autre interface. | ||
+ | = Mise en pratique = | ||
+ | Prenons l'exemple suivant: | ||
+ | [[Fichier:Source routing example.png|centré]] | ||
+ | Le pare-feu est: | ||
+ | * en DHCP sur un réseau ''WAN2'' sur lequel se trouve la passerelle ''192.168.112.250''; | ||
+ | * en DHCP sur un réseau ''WAN1'' sur lequel se trouve la passerelle ''192.168.100.253''; | ||
+ | * la passerelle par défaut du réseau ''DMZ''; | ||
+ | * la passerelle par défaut du réseau ''LAN''. | ||
− | + | Si on regarde la table de routage par défaut: | |
+ | <pre> | ||
+ | # ip r | ||
+ | default via 192.168.112.250 dev enp6s0 proto dhcp metric 119 | ||
+ | default via 192.168.100.253 dev enp5s0 proto static metric 123 | ||
+ | 192.168.100.0/24 dev enp5s0 proto kernel scope link src 192.168.100.252 metric 123 | ||
+ | 192.168.112.0/24 dev enp6s0 proto kernel scope link src 192.168.112.1 metric 119 | ||
+ | 192.168.200.0/24 dev enp3s0 proto kernel scope link src 192.168.200.254 metric 122 | ||
+ | 192.168.201.0/24 dev enp4s0 proto kernel scope link src 192.168.201.254 metric 121 | ||
+ | </pre> | ||
+ | On se retrouve avec deux routes par défaut et, du fait des métriques (119 vs. 123), c'est la route par défaut de ''WAN2'' (''192.168.112.250'') qui sera choisit tout le temps. | ||
+ | Il faut trouver une façon de dire que les paquets en provenance du réseau ''DMZ'' doivent sortir par la passerelle du réseau ''WAN1'' (''192.168.100.253''). | ||
+ | |||
+ | == Création d'une table de routage spécifique == | ||
+ | La première étape consiste à créer une table de routage où nous allons ranger nos règles de routage. Toutes les informations relatives à iproute2 se trouvent dans le répertoire ''/etc/iproute2'' | ||
+ | <pre> | ||
+ | # ll /etc/iproute2/ | ||
+ | total 36 | ||
+ | -rw-r--r--. 1 root root 85 Apr 7 01:16 bpf_pinning | ||
+ | -rw-r--r--. 1 root root 81 Apr 7 01:16 ematch_map | ||
+ | -rw-r--r--. 1 root root 31 Apr 7 01:16 group | ||
+ | -rw-r--r--. 1 root root 262 Apr 7 01:16 nl_protos | ||
+ | -rw-r--r--. 1 root root 735 Apr 7 01:16 rt_dsfield | ||
+ | -rw-r--r--. 1 root root 201 Apr 7 01:16 rt_protos | ||
+ | -rw-r--r--. 1 root root 112 Apr 7 01:16 rt_realms | ||
+ | -rw-r--r--. 1 root root 92 Apr 7 01:16 rt_scopes | ||
+ | -rw-r--r--. 1 root root 94 Aug 24 15:22 rt_tables | ||
+ | </pre> | ||
+ | Le fichier qui nous intéresse s'appelle ''rt_tables'' et nous allons ajouter la ligne suivante à la fin: | ||
+ | <pre> | ||
+ | 10 dmz | ||
+ | </pre> | ||
+ | Cela permet de créer la table de routage ''dmz'' qui, pour le moment, est vide. | ||
+ | |||
+ | == Ajout des lignes d'interfaces == | ||
+ | Pour que le routage fonctionne il faut préciser à la machine qu'elles sont les interfaces concernées dans le contexte de cette table de routage. Comme on cherche à rediriger les paquets en provenance du réseau ''DMZ'' vers la passerelle du réseau ''WAN1'', les interfaces concernées sont enp4s0 et enp5s0 | ||
+ | |||
+ | Ces lignes sont les suivantes: | ||
+ | <pre> | ||
+ | # ip ro add 192.168.201.0/24 dev enp4s0 proto kernel scope link src 192.168.201.254 table dmz | ||
+ | # ip ro add 192.168.100.0/24 dev enp5s0 proto kernel scope link src 192.168.100.252 table dmz | ||
+ | </pre> | ||
+ | Ces lignes servent uniquement à préciser l'adresse IP source qui sera utilisée dans en fonction de l'interface de sortie. | ||
+ | |||
+ | == Ajout de la passerelle == | ||
+ | Il faut maintenant préciser la passerelle à qui transmettre les paquets : | ||
+ | <pre> | ||
+ | # ip ro add default via 192.168.100.253 dev enp5s0 table dmz | ||
+ | </pre> | ||
+ | |||
+ | == Ajout de la règle de routage == | ||
+ | Il ne reste plus qu'à préciser la table utilisée quand les paquets viennent du réseau ''192.168.201.0/24'': | ||
+ | <pre> | ||
+ | # ip rule add from 192.168.201.0/24 lookup dmz | ||
+ | </pre> | ||
+ | |||
+ | == Test == | ||
+ | On peut tester le bon fonctionnement du routage en utilisant la commande suivante: | ||
+ | <pre> | ||
+ | # ip ro get 8.8.8.8 from 192.168.201.254 | ||
+ | 8.8.8.8 from 192.168.201.254 via 192.168.100.253 dev enp5s0 table dmz uid 0 | ||
+ | cache | ||
+ | </pre> | ||
+ | Les paquets en provenance du réseau ''192.168.201.0/24'' passe par ''192.168.100.253'' | ||
+ | <pre> | ||
+ | # ip ro get 8.8.8.8 from 192.168.200.254 | ||
+ | 8.8.8.8 from 192.168.200.254 via 192.168.112.250 dev enp6s0 uid 0 | ||
+ | cache | ||
+ | </pre> | ||
+ | Les paquets en provenance du réseau ''192.168.200.0/24'' passe par ''192.168.112.250'' | ||
= Configuration permanente = | = Configuration permanente = | ||
+ | Pour activer la table de routage au démarrage de l'interface il faut intégrer un script au service ''NetworkManager'' en charge de la gestion du réseau depuis la migration vers [[Systemctl | systemd]]. | ||
+ | |||
+ | Le NetworkManager appelle tous les scripts qui sont dans le répertoire ''/etc/NetworkManager/dispatcher.d'' au démarrage et à l'extinction d'une interface réseau. Si on regarde les scripts présents dans le répertoire: | ||
+ | <pre> | ||
+ | |||
+ | # ll /etc/NetworkManager/dispatcher.d | ||
+ | total 16 | ||
+ | -rwxr-xr-x. 1 root root 1062 Apr 24 16:15 11-dhclient | ||
+ | -rwxr-xr-x. 1 root root 892 Apr 24 16:15 12-dhcpd | ||
+ | -rwxr-xr-x. 1 root root 428 May 10 2019 20-chrony | ||
+ | drwxr-xr-x. 2 root root 6 Jul 21 20:00 no-wait.d | ||
+ | drwxr-xr-x. 2 root root 6 Jul 21 20:00 pre-down.d | ||
+ | drwxr-xr-x. 2 root root 6 Jul 21 20:00 pre-up.d | ||
+ | </pre> | ||
+ | Les scripts sont numérotés dans l'ordre dans lequel on souhaite les exécuter et il faut savoir que le ''NetworkManager'' appelle les scripts avec en paramètre le nom de l'interface qui déclenche le script ainsi que l’événement associé. On aura donc, par exemple: | ||
+ | <pre> | ||
+ | # /etc/NetworkManager/dispatcher.d/11-dhclient enp5s0 up | ||
+ | </pre> | ||
+ | |||
+ | ou encore: | ||
+ | <pre> | ||
+ | # /etc/NetworkManager/dispatcher.d/11-dhclient enp5s0 down | ||
+ | </pre> | ||
+ | |||
+ | Nous allons donc créer le script ''/etc/NetworkManager/dispatcher.d/21-source_routing'' avec le contenu suivant: | ||
+ | <source lang="bash"> | ||
+ | #!/bin/bash | ||
+ | INF="$1" # interface name such as enp5s0 | ||
+ | STA="$2" # status such as up or down | ||
+ | |||
+ | if [ "$INF" == "enp5s0" ]; then | ||
+ | if [ "$STA" == "up" ];then | ||
+ | echo "Enabling source routing for DMZ" | ||
+ | ip ro flush table dmz | ||
+ | ip ro add 192.168.201.0/24 dev enp4s0 proto kernel scope link src 192.168.201.254 table dmz | ||
+ | ip ro add 192.168.100.0/24 dev enp5s0 proto kernel scope link src 192.168.100.252 table dmz | ||
+ | ip ro add default 192.168.100.253 dev enp5s0 table dmz | ||
+ | ip rule add from 192.168.201.0/24 lookup dmz | ||
+ | elif [ "$STA" == "down" ];then | ||
+ | echo "Disabling source routing for DMZ"; | ||
+ | ip ro flush table dmz | ||
+ | fi | ||
+ | fi | ||
+ | exit 0 | ||
+ | </source> | ||
+ | Ce script permet de prendre en compte l'activation du routage source au démarrage de l'interface ainsi que le nettoyage de la table de routage à la désactivation de l'interface. |
Version actuelle datée du 9 septembre 2020 à 17:10
Introduction
Le routage source permet de router un paquet en fonction de son réseau source plutôt que son réseau destination. Cela peut être utile dans le cas d'un routeur avec plusieurs interfaces connectées à Internet pour permettre de faire sortir les paquets d'une DMZ vers une interface et les paquets du LAN vers une autre interface.
Mise en pratique
Prenons l'exemple suivant:
Le pare-feu est:
- en DHCP sur un réseau WAN2 sur lequel se trouve la passerelle 192.168.112.250;
- en DHCP sur un réseau WAN1 sur lequel se trouve la passerelle 192.168.100.253;
- la passerelle par défaut du réseau DMZ;
- la passerelle par défaut du réseau LAN.
Si on regarde la table de routage par défaut:
# ip r default via 192.168.112.250 dev enp6s0 proto dhcp metric 119 default via 192.168.100.253 dev enp5s0 proto static metric 123 192.168.100.0/24 dev enp5s0 proto kernel scope link src 192.168.100.252 metric 123 192.168.112.0/24 dev enp6s0 proto kernel scope link src 192.168.112.1 metric 119 192.168.200.0/24 dev enp3s0 proto kernel scope link src 192.168.200.254 metric 122 192.168.201.0/24 dev enp4s0 proto kernel scope link src 192.168.201.254 metric 121
On se retrouve avec deux routes par défaut et, du fait des métriques (119 vs. 123), c'est la route par défaut de WAN2 (192.168.112.250) qui sera choisit tout le temps.
Il faut trouver une façon de dire que les paquets en provenance du réseau DMZ doivent sortir par la passerelle du réseau WAN1 (192.168.100.253).
Création d'une table de routage spécifique
La première étape consiste à créer une table de routage où nous allons ranger nos règles de routage. Toutes les informations relatives à iproute2 se trouvent dans le répertoire /etc/iproute2
# ll /etc/iproute2/ total 36 -rw-r--r--. 1 root root 85 Apr 7 01:16 bpf_pinning -rw-r--r--. 1 root root 81 Apr 7 01:16 ematch_map -rw-r--r--. 1 root root 31 Apr 7 01:16 group -rw-r--r--. 1 root root 262 Apr 7 01:16 nl_protos -rw-r--r--. 1 root root 735 Apr 7 01:16 rt_dsfield -rw-r--r--. 1 root root 201 Apr 7 01:16 rt_protos -rw-r--r--. 1 root root 112 Apr 7 01:16 rt_realms -rw-r--r--. 1 root root 92 Apr 7 01:16 rt_scopes -rw-r--r--. 1 root root 94 Aug 24 15:22 rt_tables
Le fichier qui nous intéresse s'appelle rt_tables et nous allons ajouter la ligne suivante à la fin:
10 dmz
Cela permet de créer la table de routage dmz qui, pour le moment, est vide.
Ajout des lignes d'interfaces
Pour que le routage fonctionne il faut préciser à la machine qu'elles sont les interfaces concernées dans le contexte de cette table de routage. Comme on cherche à rediriger les paquets en provenance du réseau DMZ vers la passerelle du réseau WAN1, les interfaces concernées sont enp4s0 et enp5s0
Ces lignes sont les suivantes:
# ip ro add 192.168.201.0/24 dev enp4s0 proto kernel scope link src 192.168.201.254 table dmz # ip ro add 192.168.100.0/24 dev enp5s0 proto kernel scope link src 192.168.100.252 table dmz
Ces lignes servent uniquement à préciser l'adresse IP source qui sera utilisée dans en fonction de l'interface de sortie.
Ajout de la passerelle
Il faut maintenant préciser la passerelle à qui transmettre les paquets :
# ip ro add default via 192.168.100.253 dev enp5s0 table dmz
Ajout de la règle de routage
Il ne reste plus qu'à préciser la table utilisée quand les paquets viennent du réseau 192.168.201.0/24:
# ip rule add from 192.168.201.0/24 lookup dmz
Test
On peut tester le bon fonctionnement du routage en utilisant la commande suivante:
# ip ro get 8.8.8.8 from 192.168.201.254 8.8.8.8 from 192.168.201.254 via 192.168.100.253 dev enp5s0 table dmz uid 0 cache
Les paquets en provenance du réseau 192.168.201.0/24 passe par 192.168.100.253
# ip ro get 8.8.8.8 from 192.168.200.254 8.8.8.8 from 192.168.200.254 via 192.168.112.250 dev enp6s0 uid 0 cache
Les paquets en provenance du réseau 192.168.200.0/24 passe par 192.168.112.250
Configuration permanente
Pour activer la table de routage au démarrage de l'interface il faut intégrer un script au service NetworkManager en charge de la gestion du réseau depuis la migration vers systemd.
Le NetworkManager appelle tous les scripts qui sont dans le répertoire /etc/NetworkManager/dispatcher.d au démarrage et à l'extinction d'une interface réseau. Si on regarde les scripts présents dans le répertoire:
# ll /etc/NetworkManager/dispatcher.d total 16 -rwxr-xr-x. 1 root root 1062 Apr 24 16:15 11-dhclient -rwxr-xr-x. 1 root root 892 Apr 24 16:15 12-dhcpd -rwxr-xr-x. 1 root root 428 May 10 2019 20-chrony drwxr-xr-x. 2 root root 6 Jul 21 20:00 no-wait.d drwxr-xr-x. 2 root root 6 Jul 21 20:00 pre-down.d drwxr-xr-x. 2 root root 6 Jul 21 20:00 pre-up.d
Les scripts sont numérotés dans l'ordre dans lequel on souhaite les exécuter et il faut savoir que le NetworkManager appelle les scripts avec en paramètre le nom de l'interface qui déclenche le script ainsi que l’événement associé. On aura donc, par exemple:
# /etc/NetworkManager/dispatcher.d/11-dhclient enp5s0 up
ou encore:
# /etc/NetworkManager/dispatcher.d/11-dhclient enp5s0 down
Nous allons donc créer le script /etc/NetworkManager/dispatcher.d/21-source_routing avec le contenu suivant:
#!/bin/bash
INF="$1" # interface name such as enp5s0
STA="$2" # status such as up or down
if [ "$INF" == "enp5s0" ]; then
if [ "$STA" == "up" ];then
echo "Enabling source routing for DMZ"
ip ro flush table dmz
ip ro add 192.168.201.0/24 dev enp4s0 proto kernel scope link src 192.168.201.254 table dmz
ip ro add 192.168.100.0/24 dev enp5s0 proto kernel scope link src 192.168.100.252 table dmz
ip ro add default 192.168.100.253 dev enp5s0 table dmz
ip rule add from 192.168.201.0/24 lookup dmz
elif [ "$STA" == "down" ];then
echo "Disabling source routing for DMZ";
ip ro flush table dmz
fi
fi
exit 0
Ce script permet de prendre en compte l'activation du routage source au démarrage de l'interface ainsi que le nettoyage de la table de routage à la désactivation de l'interface.