Namespace réseau sans Docker
6 juil. 2016
Ne ratez pas nos articles sur l'open source, le big data et les systèmes distribués, fréquence faible d’un email tous les deux mois.
Imaginons le cas suivant :
- Je suis connecté à plusieurs réseaux (wlan0, eth0, usb0).
- Je veux choisir le réseau que je vais utiliser au lancement de mon application.
- Mon application ne permet pas de choisir une interface quand plusieurs sont disponibles.
Je pourrais utiliser Docker, ce dernier isole le réseau, cependant Docker isole aussi plein d’autres choses, nécessite une image, et n’est pas adapté pour lancer des applications graphiques.
Nous allons donc utiliser le même mécanisme que Docker, le namespacing, mais manuellement. Le principe est assez simple.
On commence par créer un namespace réseau que l’on va nommer 4g
sudo ip netns add 4g
Ensuite on link une interface physique au namespace (on peut passer par une interface virtuelle pour des configurations plus complexes).
La mienne se nomme enp0s20u2 :
sudo ip link set dev enp0s20u2 netns 4g
Une fois cette opération faite, l’interface n’est plus visible dans le namespace par défaut, on vérifie via :
ip addr show
Maintenant, il ne reste plus qu’à configurer l’interface classiquement. Il faut juste être bindé au namespace 4g, soit en préfixant chaque commande, soit en ouvrant un shell :
sudo ip netns exec 4g ip link set enp0s20u2 up
sudo ip netns exec 4g ip addr add 192.168.42.30/24 broadcast 192.168.42.255 dev enp0s20u2
sudo ip netns exec 4g ip route add default via 192.168.42.129
Ou bien :
sudo ip netns exec 4g bash
> ip link set enp0s20u2 up
> ip addr add 192.168.42.30/24 broadcast 192.168.42.255 dev enp0s20u2
> ip route add default via 192.168.42.129
> exit
A partir de là tout fonctionne mais nous n’avons pas configuré de DNS.
Petit souci, les DNS se configurent depuis le fichier /etc/resolv.conf
mais le système de namespace offre un système de “mapping” (default) /etc/netns/
Donc on édite ce fichier (attention si on a choisi l’option shell pour setup l’interface, il faut le quitter…)
sudo mkdir -p /etc/netstat/4g
sudo echo "nameserver 8.8.8.8" > /etc/netstat/4g/resolv.conf
Maintenant le namespace est pleinement fonctionnel. On peut lancer firefox par exemple :
sudo ip netns exec 4g firefox
Petit problème, le programme est lancé en root. Pour y remédier, on passe par sudo
:
USER=`whoami` sudo ip netns exec 4g sudo -u ${USER} firefox
Et le tour est joué.