¿Cómo puedo cambiar de un espacio de nombres de red de Linux personalizado al predeterminado?

14

Con ip netns exec puede ejecutar un comando en un espacio de nombres de red personalizado, pero ¿hay alguna forma de ejecutar un comando en el espacio de nombres predeterminado?

Por ejemplo, después de ejecutar estos dos comandos:

sudo ip netns add test_ns
sudo ip netns exec test_ns bash

¿Cómo puede el bash recién creado ejecutar programas en el espacio de nombres de red predeterminado? No hay ip netns exec default ni nada similar por lo que he encontrado.

Mi escenario es:

Quiero ejecutar un servidor SSH en un espacio de nombres de red separado (para que el resto del sistema no esté al tanto de la conexión de red, ya que el sistema se usa para las pruebas de red), pero quiero poder ejecutar programas en el espacio de nombres de red predeterminado a través de La conexión SSH.

Lo que he descubierto hasta ahora:

Martín
fuente

Respuestas:

13

Las distribuciones / núcleos más nuevos admiten el nsentercomando que debe hacer lo que desee, siempre que sea root cuando lo haga.

Aquí hay un ejemplo (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 ~]# 

Esto se basa en la setnsllamada al sistema. Necesita al menos un kernel 3.0 y glibc-2.14 para que esto funcione.

RHEL 6.5 proporciona soporte para espacios de nombres persistentes, pero no para mover procesos existentes a nuevos espacios de nombres.

Matthew Ife
fuente
Esto funciona bien, excepto por el hecho de que Ubuntu proporciona un paquete util-linux obsoleto sin nsenter. Sin embargo, encontré instrucciones de compilación detalladas aquí: askubuntu.com/questions/439056/…
Martin
Lo intenté nsenter -t 1 -npero creó un nuevo proceso igual que ip netns execy no cambió el espacio de nombres del proceso actual.
Pavel Šimerda
15

Descubrí que puede volver al espacio de nombres de red predeterminado con dos comandos simples:

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

Este método obviamente supone que puede ver procesos fuera de su propio espacio de nombres a través del procsistema de archivos. Si también está en un espacio de nombres PID separado, volver al espacio de nombres predeterminado no es tan simple.

Los comandos anteriores se probaron en Ubuntu 14.04. No sé si hay algo de distribución específica sobre el enfoque.

kasperd
fuente
1
¡Esto es bastante novedoso! Recomendaría hacerlo en mount --bindlugar de hacerlo ln -s, ya que significa que el ipcomando también puede administrarlo (ip básicamente se monta, se une a estos archivos de espacio de nombres para configurar espacios de nombres persistentes).
Matthew Ife
@kasperd dices que no es tan simple con un espacio de nombres PID separado. Sin embargo, ¿es realmente posible? ¿Puedes mencionar cómo?
copumpkin
@ Copumpkin No he probado eso.
Kasperd
0

"ln -s / proc / 1 / ns / net / var / run / netns / default" <----- No se recomienda en absoluto.

El contador del código que genera el "show de ip netns"

si tiene un shell bash exec, simplemente exista fuera del bash, salga.

Si tiene ssh a una red, entonces ssh a la interfaz de la ns predeterminada y haga lo que necesita hacer allí.

Como último recurso, el ln es como el anterior, pero sugeriría eliminarlo tan pronto como se haga, y antes de que ocurran cambios en cualquier ns. De lo contrario, el contador se dañará y causará problemas.

Luke A
fuente
2
Eso parece ser un comentario sobre otra respuesta.
RalfFriedl
Desafortunadamente, acababa de registrarme y no pude comentar. Feliz de mudarme ahora puedo publicar comentarios. @RalfFriedl
Luke A
0
nsenter -n -t <pid of a process running in the default ns>

Puede obtener la forma pid haciendo 'ps aux' o incluso una parte superior si lo desea.

Personalmente, siempre hago ssh al espacio de nombres principal, luego siempre puedo volver al valor predeterminado escribiendo exit y luego volviendo a ingresar el espacio de nombres si es necesario.

Luke A
fuente