Comment puis-je basculer d'un espace de noms réseau Linux personnalisé vers l'espace par défaut?

14

Avec ip netns exec, vous pouvez exécuter une commande dans un espace de noms réseau personnalisé - mais existe-t-il également un moyen d'exécuter une commande dans l'espace de noms par défaut?

Par exemple, après avoir exécuté ces deux commandes:

sudo ip netns add test_ns
sudo ip netns exec test_ns bash

Comment le bash nouvellement créé peut-il exécuter des programmes dans l'espace de noms réseau par défaut? Il n'y a pas d' IP netns exec par défaut ou quelque chose de similaire pour autant que je l'ai trouvé.

Mon scénario est:

Je souhaite exécuter un serveur SSH dans un espace de noms de réseau distinct (pour que le reste du système ne soit pas au courant de la connexion réseau, car le système est utilisé pour les tests de réseau), mais je veux pouvoir exécuter des programmes dans l'espace de noms de réseau par défaut via la connexion SSH.

Ce que j'ai découvert jusqu'à présent:

Martin
la source

Réponses:

13

Les distributions / noyaux plus récents prennent en charge la nsentercommande qui, devrait faire ce que vous voulez, à condition que vous soyez root lorsque vous le faites.

Voici un exemple (Fedora 20).

[root@home ~]# unshare -n /bin/bash
[root@home ~]# ip a l
1: lo: <LOOPBACK> mtu 65536 qdisc noop state DOWN group default 
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
[root@home ~]# ping google.com
ping: unknown host google.com
[root@home ~]# nsenter -t 1 -n -- ping -c 2 google.com
PING google.com (74.125.230.65) 56(84) bytes of data.
64 bytes from lhr14s23-in-f1.1e100.net (74.125.230.65): icmp_seq=1 ttl=56 time=14.2 ms
64 bytes from lhr14s23-in-f1.1e100.net (74.125.230.65): icmp_seq=2 ttl=56 time=15.0 ms

--- google.com ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1001ms
rtt min/avg/max/mdev = 14.239/14.621/15.003/0.382 ms
[root@home ~]# nsenter -t 1 -n -- ip a l
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default 
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: p4p1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 10:bf:48:88:50:ee brd ff:ff:ff:ff:ff:ff
    inet 192.168.1.2/24 brd 192.168.1.255 scope global p4p1
       valid_lft forever preferred_lft forever
    inet6 fe80::12bf:48ff:fe88:50ee/64 scope link 
       valid_lft forever preferred_lft forever
[root@home ~]# 

Cela dépend de l' setnsappel système. Vous avez besoin d'au moins un noyau 3.0 et de glibc-2.14 pour que cela fonctionne.

RHEL 6.5 prend en charge les espaces de noms persistants mais pas la prise en charge du déplacement des processus existants vers de nouveaux espaces de noms.

Matthew Ife
la source
Cela fonctionne très bien, sauf pour le fait qu'Ubuntu fournit un package util-linux obsolète sans nsenter. J'ai trouvé des instructions de construction détaillées ici, cependant: askubuntu.com/questions/439056/…
Martin
J'ai essayé nsenter -t 1 -nmais cela a créé un nouveau processus tout comme ip netns execet n'a pas changé l'espace de noms du processus actuel.
Pavel Šimerda
15

J'ai constaté que vous pouvez revenir à l'espace de noms réseau par défaut avec deux commandes simples:

ln -s /proc/1/ns/net /var/run/netns/default
ip netns exec default ifconfig -a

Cette méthode suppose évidemment que vous pouvez voir les processus en dehors de votre propre espace de noms via le procsystème de fichiers. Si vous êtes également dans un espace de noms PID distinct, le retour à l'espace de noms par défaut n'est pas aussi simple.

Les commandes ci-dessus ont été testées sur Ubuntu 14.04. Je ne sais pas s'il y a quelque chose de spécifique à la distribution dans l'approche.

kasperd
la source
1
C'est assez nouveau! Je recommanderais de le faire à la mount --bindplace de ln -s, car cela signifie que la ipcommande peut également le gérer (l'ip monte essentiellement --bind contre ces fichiers d'espace de noms pour configurer des espaces de noms persistants).
Matthew Ife
@kasperd vous dites que ce n'est pas aussi simple avec un espace de noms PID séparé. Mais est-ce encore possible? Pouvez-vous nous dire comment?
copumpkin
@copumpkin Je n'ai pas testé ça.
kasperd
0

"ln -s / proc / 1 / ns / net / var / run / netns / default" <----- N'est pas recommandé du tout.

Le compteur du code qui génère le "show ip netns"

si vous avez un shell bash exec, il existe simplement du bash, quittez.

Si vous avez ssh vers un réseau, alors ssh vers l'interface du ns par défaut et faites ce que vous devez faire là-bas.

En dernier recours, le ln comme ci-dessus, mais je suggère de le supprimer dès qu'il est fait et avant que des modifications ne soient apportées à ns. Sinon, le compteur sera corrompu et causera des problèmes.

Luke A
la source
2
Cela semble être un commentaire sur une autre réponse.
RalfFriedl
C'était, malheureusement, je venais de m'inscrire et je n'ai pas pu commenter. Heureux de bouger maintenant je peux poster des commentaires. @RalfFriedl
Luke A
0
nsenter -n -t <pid of a process running in the default ns>

Vous pouvez obtenir le formulaire pid en faisant 'ps aux' ou même un top si vous le souhaitez.

Personnellement, je ssh toujours vers l'espace de noms principal, puis je peux toujours revenir à la valeur par défaut en tapant exit puis en ressaisissant l'espace de noms si nécessaire.

Luke A
la source