Network Namespace
Grundlegende Informationen
Ein Netzwerk-Namespace ist eine Funktion des Linux-Kernels, die eine Isolierung des Netzwerkstapels ermöglicht und es jedem Netzwerk-Namespace ermöglicht, seine eigene unabhängige Netzwerkkonfiguration, Schnittstellen, IP-Adressen, Routing-Tabellen und Firewall-Regeln zu haben. Diese Isolierung ist in verschiedenen Szenarien nützlich, wie z.B. bei der Containerisierung, bei der jeder Container seine eigene Netzwerkkonfiguration haben sollte, unabhängig von anderen Containern und dem Host-System.
Wie es funktioniert:
Wenn ein neuer Netzwerk-Namespace erstellt wird, startet er mit einem vollständig isolierten Netzwerkstapel, ohne Netzwerkschnittstellen außer der Loopback-Schnittstelle (lo). Das bedeutet, dass Prozesse, die im neuen Netzwerk-Namespace ausgeführt werden, standardmäßig nicht mit Prozessen in anderen Namespaces oder dem Host-System kommunizieren können.
Virtuelle Netzwerkschnittstellen, wie z.B. veth-Paare, können erstellt und zwischen Netzwerk-Namespaces verschoben werden. Dadurch kann eine Netzwerkverbindung zwischen Namespaces oder zwischen einem Namespace und dem Host-System hergestellt werden. Zum Beispiel kann ein Ende eines veth-Paares im Netzwerk-Namespace eines Containers platziert werden und das andere Ende kann mit einer Bridge oder einer anderen Netzwerkschnittstelle im Host-Namespace verbunden werden, um dem Container Netzwerkverbindung bereitzustellen.
Netzwerkschnittstellen innerhalb eines Namespaces können ihre eigenen IP-Adressen, Routing-Tabellen und Firewall-Regeln haben, unabhängig von anderen Namespaces. Dadurch können Prozesse in verschiedenen Netzwerk-Namespaces unterschiedliche Netzwerkkonfigurationen haben und so arbeiten, als ob sie auf separaten vernetzten Systemen ausgeführt würden.
Prozesse können zwischen Namespaces wechseln, indem sie den Systemaufruf
setns()
verwenden oder neue Namespaces erstellen, indem sie die Systemaufrufeunshare()
oderclone()
mit dem FlagCLONE_NEWNET
verwenden. Wenn ein Prozess in einen neuen Namespace wechselt oder einen erstellt, beginnt er die Netzwerkkonfiguration und Schnittstellen zu verwenden, die mit diesem Namespace verbunden sind.
Labor:
Verschiedene Namespaces erstellen
CLI
Durch das Einbinden einer neuen Instanz des /proc
-Dateisystems mit dem Parameter --mount-proc
stellen Sie sicher, dass der neue Mount-Namespace eine genaue und isolierte Ansicht der prozessspezifischen Informationen für diesen Namespace hat.
Docker
Überprüfen Sie, in welchem Namespace sich Ihr Prozess befindet
Um festzustellen, in welchem Namespace sich Ihr Prozess befindet, können Sie den folgenden Befehl verwenden:
Dieser Befehl gibt den Pfad zum Netzwerk-Namespace des aktuellen Prozesses zurück.
Alle Netzwerk-Namespaces finden
```bash nsenter -n TARGET_PID --pid /bin/bash ``` Außerdem können Sie nur in einen anderen Prozess-Namespace eintreten, wenn Sie root sind. Und Sie können nicht in einen anderen Namespace eintreten, ohne einen darauf verweisenden Deskriptor (wie z.B. `/proc/self/ns/net`) zu haben.
Referenzen
Last updated