Como posso alternar de um namespace de rede linux personalizado para o padrão?

14

Com o ip netns exec, você pode executar um comando em um namespace de rede personalizado - mas também existe uma maneira de executar um comando no namespace padrão?

Por exemplo, depois de executar estes dois comandos:

sudo ip netns add test_ns
sudo ip netns exec test_ns bash

Como o bash recém-criado pode executar programas no namespace de rede padrão? Não há ip netns exec padrão ou algo semelhante, até onde eu encontrei.

Meu cenário é:

Desejo executar um servidor SSH em um espaço para nome de rede separado (para manter o resto do sistema inconsciente da conexão de rede, pois o sistema é usado para teste de rede), mas quero poder executar programas no espaço para nome de rede padrão via a conexão SSH.

O que eu descobri até agora:

Martin
fonte

Respostas:

13

Distros / kernels mais novos suportam o nsentercomando que, deve fazer o que você deseja, desde que seja root quando o fizer.

Aqui está um exemplo (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 ~]# 

Isso depende da setnschamada do sistema. Você precisa de pelo menos um kernel 3.0 e glibc-2.14 para que isso funcione.

O RHEL 6.5 fornece suporte para namespaces persistentes, mas não para mover processos existentes para novos namespaces.

Matthew Ife
fonte
Isso funciona bem, exceto pelo fato de o Ubuntu fornecer um pacote util-linux desatualizado sem o nsenter. Eu encontrei instruções detalhadas de compilação aqui, no entanto: askubuntu.com/questions/439056/…
Martin
Eu tentei, nsenter -t 1 -nmas ele criou um novo processo da mesma forma ip netns exece não mudou o espaço para nome do processo atual.
Pavel Šimerda
15

Descobri que você pode retornar ao espaço para nome da rede padrão com dois comandos simples:

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

Esse método obviamente pressupõe que você pode ver processos fora do seu próprio espaço para nome através do procsistema de arquivos. Se você também estiver em um espaço para nome PID separado, retornar ao espaço para nome padrão não é tão simples.

Os comandos acima foram testados no Ubuntu 14.04. Não sei se existe alguma distribuição específica sobre a abordagem.

Kasperd
fonte
1
Esta é uma novela bonita! Eu recomendaria realmente fazer em mount --bindvez de ln -s, pois significa que o ipcomando também pode gerenciá-lo (o ip basicamente monta --bind nesses arquivos de espaço para nome para configurar espaços de nome persistentes).
Matthew Ife
@ Kasperd você diz que não é tão simples com um espaço para nome PID separado. Ainda é realmente possível? Você pode mencionar como?
Copumpkin
@ copumpkin Eu não testei isso.
precisa saber é
0

"ln -s / proc / 1 / ns / net / var / run / netns / default" <----- Não é recomendado.

O contador do código que gera o "ip netns show"

Se você possui um shell bash, basta sair do bash e sair.

Se você possui ssh em um netns, faça ssh na interface dos ns padrão e faça o que precisa fazer lá.

Como último recurso, ln como acima, mas sugiro removê-lo assim que for feito e antes que ocorram alterações em qualquer ns. Caso contrário, o contador será corrompido e causará problemas.

Luke A
fonte
2
Isso parece ser um comentário sobre outra resposta.
RalfFriedl
Infelizmente, eu tinha acabado de me inscrever e não consegui comentar. Feliz em mudar agora, posso postar comentários. @RalfFriedl
Luke A
0
nsenter -n -t <pid of a process running in the default ns>

Você pode obter o formulário pid fazendo 'ps aux' ou até um top, se quiser.

Pessoalmente, sempre ssh no namespace principal, sempre posso voltar ao padrão digitando exit e, em seguida, reinserir o namespace, se necessário.

Luke A
fonte