С участием ip netns exec вы можете выполнить команду в настраиваемом сетевом пространстве имен - но есть ли способ выполнить команду в пространстве имен по умолчанию?
Например, после выполнения этих двух команд:
sudo ip netns add test_ns
sudo ip netns exec test_ns bash
Как только что созданный bash может выполнять программы в сетевом пространстве имен по умолчанию? Здесь нет ip netns exec по умолчанию или что-то подобное, насколько я нашел.
Мой сценарий:
Я хочу запустить SSH-сервер в отдельном сетевом пространстве имен (чтобы остальная часть системы не знала о сетевом подключении, поскольку система используется для тестирования сети), но хочу иметь возможность выполнять программы в сетевом пространстве имен по умолчанию через соединение SSH.
Что я выяснил на данный момент:
Созданные сетевые пространства имен перечислены как файлы в / var / run / netns (но для пространства имен по умолчанию нет файла)
В ip netns exec код можно найти здесь: http://git.kernel.org/cgit/linux/kernel/git/shemminger/iproute2.git/tree/ip/ipnetns.c#n132 - Я еще не понял всего, что он делает, но не очень перспективно.
ip netns идентифицирует $$ как было предложено Как запросить и изменить сетевое пространство имен в Linux? ничего не возвращает, когда в пространстве имен сети по умолчанию
Я обнаружил, что вы можете вернуться к сетевому пространству имен по умолчанию с помощью двух простых команд:
ln -s /proc/1/ns/net /var/run/netns/default
ip netns exec default ifconfig -a
Этот метод, очевидно, предполагает, что вы можете видеть процессы за пределами вашего собственного пространства имен через proc
файловая система. Если вы также находитесь в отдельном пространстве имен PID, вернуться в пространство имен по умолчанию не так просто.
Вышеупомянутые команды были протестированы на Ubuntu 14.04. Я не знаю, есть ли что-то особенное в этом подходе.
Новые дистрибутивы / ядра поддерживают 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 обеспечивает поддержку постоянных пространств имен, но не поддержка перемещения существующих процессов в новые пространства имен.
nsenter -n -t <pid of a process running in the default ns>
Вы можете получить форму pid, выполняющую "ps aux" или даже топ, если хотите.
Лично я всегда использую ssh для основного пространства имен, тогда я всегда могу вернуться к значениям по умолчанию, набрав exit, а затем повторно войдя в пространство имен, если это необходимо.
Как уже упоминалось, в корневое сетевое пространство имен можно войти с помощью nsenter --net --target=1
. Но если вы планируете использовать приложения, не поддерживающие сетевые пространства имен, необходимо также переключиться на корневое пространство имен монтирования, поэтому лучше использовать nsenter --net --mount --target=1
.