Wie kann ich von einem benutzerdefinierten Linux-Netzwerk-Namespace zurück auf den Standard-Namespace wechseln?

14

Mit ip netns exec können Sie einen Befehl in einem benutzerdefinierten Netzwerknamespace ausführen. Gibt es jedoch auch eine Möglichkeit, einen Befehl im Standardnamespace auszuführen?

Zum Beispiel nach dem Ausführen dieser beiden Befehle:

sudo ip netns add test_ns
sudo ip netns exec test_ns bash

Wie kann die neu erstellte Bash Programme im Standard-Netzwerk-Namespace ausführen? Es gibt keine IP Netns Exec Standard oder etwas ähnliches, soweit ich gefunden habe.

Mein Szenario ist:

Ich möchte einen SSH-Server in einem separaten Netzwerk-Namespace ausführen (damit der Rest des Systems nicht über die Netzwerkverbindung informiert wird, da das System zum Testen des Netzwerks verwendet wird), möchte jedoch Programme im Standard-Netzwerk-Namespace über ausführen können die SSH-Verbindung.

Was ich bisher herausgefunden habe:

Martin
quelle

Antworten:

13

Neuere Distributionen / Kernel unterstützen den nsenterBefehl, der tun soll, was Sie wollen, vorausgesetzt, Sie sind root, wenn Sie dies tun.

Hier ist ein Beispiel (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 ~]# 

Dies hängt vom setnsSystemaufruf ab. Sie benötigen mindestens einen 3.0-Kernel und glibc-2.14, damit dies funktioniert.

RHEL 6.5 bietet Unterstützung für persistente Namespaces, nicht jedoch für das Verschieben vorhandener Prozesse in neue Namespaces.

Matthew Ife
quelle
Dies funktioniert gut, wenn man bedenkt, dass Ubuntu ein veraltetes Util-Linux-Paket ohne nsenter zur Verfügung stellt. Eine ausführliche Bauanleitung habe ich hier gefunden: askubuntu.com/questions/439056/…
Martin
Ich habe versucht, nsenter -t 1 -naber es wurde ein neuer Prozess erstellt, ip netns execund der Namespace des aktuellen Prozesses wurde nicht geändert.
Pavel Šimerda
15

Ich habe festgestellt, dass Sie mit zwei einfachen Befehlen zum Standardnetzwerk-Namespace zurückkehren können:

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

Diese Methode setzt natürlich voraus, dass Sie Prozesse außerhalb Ihres eigenen Namespaces über das procDateisystem sehen können. Wenn Sie sich ebenfalls in einem separaten PID-Namespace befinden, ist die Rückkehr zum Standardnamespace nicht so einfach.

Die obigen Befehle wurden unter Ubuntu 14.04 getestet. Ich weiß nicht, ob der Ansatz eine bestimmte Verteilung aufweist.

Kasperd
quelle
1
Das ist ziemlich neuartig! Ich würde empfehlen, dies mount --bindstattdessen zu tun ln -s, da dies bedeutet, dass der ipBefehl es auch verwalten kann (ip hängt im Grunde genommen --bind an diese Namespace-Dateien an, um persistente Namespaces einzurichten).
Matthew Ife
@kasperd du sagst, es ist nicht so einfach mit einem separaten PID-Namespace. Ist das eigentlich noch möglich? Kannst du erwähnen wie?
Copumpkin
@copumpkin Das habe ich nicht getestet.
Kasperd
0

"ln -s / proc / 1 / ns / net / var / run / netns / default" <----- Wird überhaupt nicht empfohlen.

Der Zähler für den Code, der die "ip netns show" ausgibt

Wenn Sie eine Bash-Shell ausgeführt haben, die einfach aus der Bash-Shell besteht, beenden Sie sie.

Wenn Sie ssh zu einem Netz haben, dann ssh zur Schnittstelle des Standard-ns und tun, was Sie dort tun müssen.

Als letztes Mittel also das ln wie oben, aber ich würde vorschlagen, es zu entfernen, sobald es fertig ist und bevor irgendwelche Änderungen an irgendwelchen ns auftreten. Andernfalls ist der Zähler beschädigt und verursacht Probleme.

Luke A
quelle
2
Das scheint ein Kommentar zu einer anderen Antwort zu sein.
RalfFriedl
Leider hatte ich mich gerade angemeldet und konnte keinen Kommentar abgeben. Ich bin froh, dass ich mich jetzt bewegen kann. @RalfFriedl
Luke A
0
nsenter -n -t <pid of a process running in the default ns>

Sie können die PID-Form dazu bringen, 'ps aux' oder sogar ein Top zu machen, wenn Sie möchten.

Persönlich gehe ich immer zum Haupt-Namespace, dann kann ich immer zum Standard zurückkehren, indem ich exit eingebe und dann den Namespace erneut eingebe, falls erforderlich.

Luke A
quelle