Come posso passare da uno spazio dei nomi di rete linux personalizzato a quello predefinito?


14

Con ip netns exec puoi eseguire un comando in uno spazio dei nomi di rete personalizzato - ma c'è anche un modo per eseguire un comando nello spazio dei nomi predefinito?

Ad esempio, dopo aver eseguito questi due comandi:

sudo ip netns add test_ns
sudo ip netns exec test_ns bash

Come può il bash appena creato eseguire programmi nello spazio dei nomi di rete predefinito? Non c'è ip netns exec default o qualcosa di simile per quanto ne ho trovato.

Il mio scenario è:

Voglio eseguire un server SSH in uno spazio dei nomi di rete separato (per mantenere il resto del sistema ignaro della connessione di rete, poiché il sistema viene utilizzato per i test di rete), ma voglio essere in grado di eseguire programmi nello spazio dei nomi di rete predefinito tramite la connessione SSH.

Quello che ho scoperto finora:

Risposte:


13

Le distro / kernel più recenti supportano il nsentercomando, che dovrebbe fare quello che vuoi, a condizione che tu sia root quando lo fai.

Ecco un esempio (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 ~]# 

Questo si basa sulla setnschiamata di sistema. È necessario almeno un kernel 3.0 e glibc-2.14 per farlo funzionare.

RHEL 6.5 fornisce supporto per spazi dei nomi persistenti ma non supporto per lo spostamento di processi esistenti in nuovi spazi dei nomi.


Funziona bene, a parte il fatto che Ubuntu fornisce un pacchetto util-linux obsoleto senza nsenter. Ho trovato istruzioni dettagliate sulla compilazione qui, tuttavia: askubuntu.com/questions/439056/…
Martin,

Ho provato, nsenter -t 1 -nma ha creato un nuovo processo proprio come ip netns exece non ha cambiato lo spazio dei nomi del processo corrente.
Pavel Šimerda,

15

Ho scoperto che puoi tornare allo spazio dei nomi di rete predefinito con due semplici comandi:

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

Questo metodo ovviamente presuppone che sia possibile vedere i processi al di fuori del proprio spazio dei nomi attraverso il procfile system. Se ci si trova anche in uno spazio dei nomi PID separato, tornare allo spazio dei nomi predefinito non è così semplice.

I comandi sopra sono stati testati su Ubuntu 14.04. Non so se ci sia qualcosa di specifico nella distribuzione dell'approccio.


1
Questo è un bel romanzo! Vorrei raccomandare effettivamente di fare mount --bindinvece di ln -s, poiché significa che anche il ipcomando può gestirlo (ip fondamentalmente monta --bind contro questi file dello spazio dei nomi per impostare spazi dei nomi persistenti).
Matthew Ife,

@kasperd dici che non è così semplice con uno spazio dei nomi PID separato. In realtà è ancora possibile, però? Puoi dire come?
copumpkin,

@copumpkin Non l'ho provato.
Kasperd,

0

"ln -s / proc / 1 / ns / net / var / run / netns / default" <----- Non è affatto raccomandato.

Il contatore per il codice che genera "ip netns show"

se hai una shell bash, semplicemente esci dalla bash, esci.

Se hai ssh su un netns, allora ssh sull'interfaccia del ns predefinito e fai quello che devi fare lì.

Come ultima risorsa, quindi ln come sopra, ma suggerirei di rimuoverlo non appena è stato fatto, e prima che si verifichino cambiamenti a qualsiasi ns. Altrimenti il ​​contatore verrà danneggiato e causerà problemi.


2
Questo sembra essere un commento su un'altra risposta.
RalfFriedl,

Purtroppo, mi ero appena registrato e non sono stato in grado di commentare. Felice di trasferirmi ora posso pubblicare commenti. @RalfFriedl
Luca,

0
nsenter -n -t <pid of a process running in the default ns>

Puoi ottenere il modulo pid facendo 'ps aux' o anche un top se lo desideri.

Personalmente ho sempre ssh nello spazio dei nomi principale, quindi posso sempre tornare al valore predefinito digitando exit e quindi inserendo nuovamente lo spazio dei nomi, se necessario.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.