Como posso mudar de um namespace de rede linux customizado de volta para o padrão?

12

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

Por exemplo, depois de executar esses 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 default nem nada semelhante, até onde eu encontrei.

Meu cenário é:

Eu quero executar um servidor SSH em um namespace de rede separado (para manter o restante do sistema inconsciente da conexão de rede, já que o sistema é usado para testes de rede), mas quero poder executar programas no padrão namespace de rede através da conexão SSH.

O que eu descobri até agora:

  • Os namespaces de rede criados são listados como arquivos em / var / run / netns (mas não há arquivo para o namespace padrão)

  • O código ip netns exec pode ser encontrado aqui: link - Eu ainda não entendi tudo o que está fazendo, mas não parece muito promissor.

  • ip netns identificam $$ como sugerido por Como consultar e alterar o namespace de rede no linux? não retorna nada quando no namespace de rede padrão

por Martin 20.08.2014 / 18:40

2 respostas

11

Novas distribuições / kernels suportam o comando nsenter , que deve fazer o que você quer, desde que você seja root quando fizer isso.

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 chamada do sistema setns . 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.

    
por 10.09.2014 / 20:50
15

Descobri que você pode retornar ao namespace de rede padrão com dois comandos simples:

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

Este método obviamente supõe que você pode ver processos fora do seu próprio namespace através do sistema de arquivos proc . Se você também estiver em um namespace PID separado, retornar ao namespace padrão não é tão simples.

Os comandos acima foram testados no Ubuntu 14.04. Eu não sei se há alguma distribuição específica sobre a abordagem.

    
por 10.09.2014 / 19:39