Namespace réseau sans Docker

Namespace réseau sans Docker

Vous appréciez notre travail......nous recrutons !

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//resolv.conf -> () /etc/resolv.conf

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é.

Partagez cet article

Canada - Maroc - France

Nous sommes une équipe passionnée par l'Open Source, le Big Data et les technologies associées telles que le Cloud, le Data Engineering, la Data Science le DevOps…

Nous fournissons à nos clients un savoir faire reconnu sur la manière d'utiliser les technologies pour convertir leurs cas d'usage en projets exploités en production, sur la façon de réduire les coûts et d'accélérer les livraisons de nouvelles fonctionnalités.

Si vous appréciez la qualité de nos publications, nous vous invitons à nous contacter en vue de coopérer ensemble.

Support Ukrain