Jak mogę przełączyć się z niestandardowej przestrzeni nazw sieci Linux na domyślną?

14

Za pomocą ip netns exec możesz wykonać polecenie w niestandardowej sieciowej przestrzeni nazw - ale czy jest też sposób na wykonanie polecenia w domyślnej przestrzeni nazw?

Na przykład po wykonaniu tych dwóch poleceń:

sudo ip netns add test_ns
sudo ip netns exec test_ns bash

Jak nowo utworzony bash może uruchamiać programy w domyślnej sieciowej przestrzeni nazw? O ile nie znalazłem, nie ma domyślnego wykonania ip netns exec ani nic podobnego.

Mój scenariusz to:

Chcę uruchomić serwer SSH w oddzielnej sieciowej przestrzeni nazw (aby pozostała część systemu nie była świadoma połączenia sieciowego, ponieważ system służy do testowania sieci), ale chcę mieć możliwość uruchamiania programów w domyślnej przestrzeni nazw sieci za pośrednictwem połączenie SSH.

Co dotychczas odkryłem:

Jaskółka oknówka
źródło

Odpowiedzi:

13

Nowsze dystrybucje / jądra obsługują nsenterpolecenie, które powinno robić, co chcesz, pod warunkiem, że jesteś rootem, kiedy to robisz.

Oto przykład (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 ~]# 

Zależy to od setnswywołania systemowego. Aby to działało, potrzebujesz przynajmniej jądra 3.0 i glibc-2.14.

RHEL 6.5 zapewnia obsługę trwałych przestrzeni nazw, ale nie obsługuje przenoszenia istniejących procesów do nowych przestrzeni nazw.

Matthew Ife
źródło
Działa to dobrze, wykonywany przez fakt, że Ubuntu zapewnia przestarzały pakiet util-linux bez nsentera. Znalazłem tu jednak szczegółowe instrukcje kompilacji: askubuntu.com/questions/439056/...
Martin
Próbowałem, nsenter -t 1 -nale stworzyłem nowy proces tak samo, jak ip netns execi nie zmieniłem przestrzeni nazw bieżącego procesu.
Pavel Šimerda
15

Odkryłem, że możesz powrócić do domyślnej sieciowej przestrzeni nazw za pomocą dwóch prostych poleceń:

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

Ta metoda oczywiście zakłada, że ​​można zobaczyć procesy poza własną przestrzenią nazw przez procsystem plików. Jeśli znajdujesz się również w osobnej przestrzeni nazw PID, powrót do domyślnej przestrzeni nazw nie jest tak prosty.

Powyższe polecenia zostały przetestowane na Ubuntu 14.04. Nie wiem, czy w podejściu jest coś specyficznego dla dystrybucji.

kasperd
źródło
1
To całkiem powieść! Poleciłbym faktycznie robić mount --bindzamiast ln -s, ponieważ oznacza to, że ippolecenie może również nim zarządzać (ip w zasadzie wykonuje polecenie mount --bind przeciwko tym plikom przestrzeni nazw, aby skonfigurować trwałe przestrzenie nazw).
Matthew Ife,
@kasperd mówisz, że to nie jest tak proste z oddzielną przestrzenią nazw PID. Czy w rzeczywistości jest to nadal możliwe? Czy możesz wspomnieć jak?
copumpkin
@ kopumpkin Nie testowałem tego.
kasperd
0

„ln -s / proc / 1 / ns / net / var / run / netns / default” <----- W ogóle nie jest zalecane.

Licznik kodu, który wyświetla „ip netns show”

jeśli masz wykonywaną powłokę bash, proste istnieją poza bash, wyjdź.

Jeśli masz ssh do netns, to ssh do interfejsu domyślnego ns i zrób to, co musisz tam zrobić.

W ostateczności więc ln jak wyżej, ale sugerowałbym usunięcie go tak szybko, jak to zrobione, i zanim jakiekolwiek zmiany wystąpią w dowolnym ns. W przeciwnym razie licznik zostanie uszkodzony i spowoduje problemy.

Łukasz A.
źródło
2
To wydaje się być komentarzem do innej odpowiedzi.
RalfFriedl
Niestety, właśnie się zarejestrowałem i nie mogłem komentować. Z przyjemnością się przeprowadzam, mogę dodawać komentarze. @RalfFriedl
Luke A
0
nsenter -n -t <pid of a process running in the default ns>

Możesz dostać formularz pid robiąc 'ps aux', a nawet górę, jeśli chcesz.

Osobiście zawsze ssh do głównej przestrzeni nazw, potem zawsze mogę wrócić do wartości domyślnej, wpisując polecenie exit, a następnie ponownie wpisując przestrzeń nazw, jeśli to konieczne.

Łukasz A.
źródło