Как я могу переключиться с настраиваемого сетевого пространства имен linux обратно на пространство по умолчанию?

14

С ip netns exec вы можете выполнить команду в пользовательском сетевом пространстве имен - но есть ли способ выполнить команду в пространстве имен по умолчанию?

Например, после выполнения этих двух команд:

sudo ip netns add test_ns
sudo ip netns exec test_ns bash

Как только что созданные bash могут выполнять программы в сетевом пространстве имен по умолчанию? Насколько я нашел, там нет ip netns exec default или чего-то подобного.

Мой сценарий:

Я хочу запустить сервер SSH в отдельном сетевом пространстве имен (чтобы остальная часть системы не знала о сетевом подключении, так как система используется для тестирования сети), но хочу иметь возможность выполнять программы в сетевом пространстве имен по умолчанию через соединение SSH.

Что я узнал до сих пор:

Мартин
источник

Ответы:

13

Более новые дистрибутивы / ядра поддерживают nsenterкоманду, которая должна делать то, что вы хотите, при условии, что вы являетесь пользователем root, когда делаете это.

Вот пример (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 ~]# 

Это зависит от setnsсистемного вызова. Вам нужно как минимум ядро ​​3.0 и glibc-2.14, чтобы это работало.

RHEL 6.5 обеспечивает поддержку постоянных пространств имен, но не поддерживает перемещение существующих процессов в новые пространства имен.

Мэтью Ифе
источник
Это прекрасно работает, за исключением того факта, что Ubuntu предоставляет устаревший пакет util-linux без nsenter. Однако я нашел подробные инструкции по сборке здесь: askubuntu.com/questions/439056/…
Мартин,
Я пытался, nsenter -t 1 -nно он создал новый процесс так же, как ip netns execи не изменил пространство имен текущего процесса.
Павел Шимерда
15

Я обнаружил, что вы можете вернуться к сетевому пространству имен по умолчанию с помощью двух простых команд:

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

Этот метод, очевидно, предполагает, что вы можете видеть процессы вне вашего собственного пространства имен через procфайловую систему. Если вы также находитесь в отдельном пространстве имен PID, возврат к пространству имен по умолчанию не так прост.

Вышеуказанные команды были протестированы на Ubuntu 14.04. Я не знаю, есть ли что-то конкретное в подходе.

kasperd
источник
1
Это довольно роман! Я бы порекомендовал на самом деле делать mount --bindвместо ln -s, так как это означает, что ipкоманда тоже может управлять этим (ip в основном монтирует --bind для этих файлов пространств имен для настройки постоянных пространств имен).
Мэтью Иф
@kasperd вы говорите, что это не так просто с отдельным пространством имен PID. Это все еще возможно, хотя? Можете ли вы упомянуть, как?
copumpkin
@opumpkin Я не проверял это.
Касперд
0

"ln -s / proc / 1 / ns / net / var / run / netns / default" <----- Не рекомендуется вообще.

Счетчик кода, который выводит «ip netns show»

если у вас есть исполняющая оболочка bash, просто выйдите из bash, выйдите.

Если у вас есть ssh к netns, тогда ssh к интерфейсу ns по умолчанию и делайте то, что вам нужно сделать там.

В крайнем случае так же, как и выше, но я бы посоветовал удалить его, как только это будет сделано, и до того, как произойдут какие-либо изменения. В противном случае счетчик будет поврежден и вызовет проблемы.

Люк А
источник
2
Кажется, это комментарий к другому ответу.
Ральф Фридл
К сожалению, я только что зарегистрировался и не смог прокомментировать. Рад переехать, теперь я могу оставлять комментарии. @RalfFriedl
Люк
0
nsenter -n -t <pid of a process running in the default ns>

Вы можете получить форму pid, используя ps aux или даже top, если хотите.

Лично я всегда ssh к основному пространству имен, тогда я всегда могу вернуться к настройкам по умолчанию, напечатав exit и затем повторно введя пространство имен, если требуется.

Люк А
источник