Forum: PC-Programmierung Systemd Network Namespace Verbindung zum anderen namespace?


von Thorben (Gast)


Lesenswert?

Hallo, ich versuche gerade das Systemd Network Namespace zuverstehen und 
anhand der Erklärung hier 
https://etherarp.net/network-isolation-of-services-with-systemd/index.html, 
verstehe ich den Sinn und den Anwendungsbereich.
Ich hab zwei Applikationen, welche in einem anderen Namespace liegen und 
über einen definierten TCP Port miteinander kommunizieren müssten.

Ist es trotzdem möglich die beiden Applikationen über einen festen TCP 
Port zuverbinden über localnetwork?

von Daniel A. (daniel-a)


Lesenswert?

Thorben schrieb:
> Hallo, ich versuche gerade das Systemd Network Namespace zuverstehen

Network Namespaces sind ein Linux feature, kein Systemd feature. Systemd 
kann lediglich welche erzeugen.

Es gibt sinnvolle Anwendungsfälle für Network Namespaces. Es fragt sich 
halt nur, was man damit erreichen will. Wenn du keinen Grund hast, das 
in dem Artikel zu tun, ist es eventuell nicht Sinvoll, es zu nutzen.

Grundsätzlich muss man 2 Sachen zu Netzwerk Namespacen wissen:
1) Jeder Netzwerk Namespace ist eine komplett getrennte Netzwerk 
Umgebung. Routen, IP-Adressen, Interfaces, alles ist erst mal nicht 
konfiguriert.
2) Ein Interface kann immer nur in einem Network Namespace sein

> Ist es trotzdem möglich die beiden Applikationen über einen festen TCP
> Port zuverbinden über localnetwork?

Wenn du Programme in 2 Netzwerk Namespaces Packst, diesen ein 
Netzwerkinterface gibst, und es zwischen diesen eine Verbindung gibt, 
und die IP und Routen in beiden Netzwerk Namespacen entsprechend 
konfiguriert sind, dann kann man eine Verbindung zwischen Anwendungen in 
den Namespacen herstellen. Aus Netzwerk Sicht sind das quasi 2 
unterschiedliche PCs, wo man das Netzwerk wie üblich konfiguriert.

Du kannst zur Kommunikation zwischen Network Namespacen nicht loopback 
nutzen, jeder netns hat ein eigenes unabhängiges lo Interface.

Du kannst virtuelle Verbindungen, und Switches einrichten mittels 
veth-pairs und bridges. veth pairs sind wie Kabel. Man hat 2 Interfaces, 
was beim einen rein kommt, kommt am anderen interface an, und die 2 
interfaces können in unterschiedlichen Netzwerk Namespacen sein. Bridges 
sind wie switches. Kann man Interfaces reinstecken, und die Pakete 
werden dann entsprechend verteilt. So kann man ein virtuelles Netzwerk 
zwischen den Sachen aufbauen, über Netzwerk Namespaces hinweg. Ist aber 
umständlich.

Ein paar andere Sachen, die zu beachten sind. Kommt eine Anwendung in 
den Besitz eines File Deskriptors, das kann ein Socket sein, verbunden 
oder auf verbindungen wartend, oder sonst irgend was, und dieser wurde 
in einem anderen Namespace erstellt, kann die Anwendung den trotzdem 
nutzen. Der Namespace, in dem der File Deskriptor erstellt wurde, ist 
relevant. Das ist bei allen arten von namespacen so. Systemd ist glaube 
ich unter anderem in der Lage, ähnlich wie xinetd auf Verbindungen zu 
warten und Anwendungen beim Starten den File Deskriptor mitzugeben. Ich 
glaube die nennen es socket activation.

Unix Sockets sollten von Netzwerk Namespacen nicht betroffen sein. Für 
deren Isolation existieren IPC Namespaces.

All dies gilt für Linux Namespaces allgemein, und ist nicht Systemd 
spezifisch. Es gilt dort aber natürlich auch.

: Bearbeitet durch User
von Thorben (Gast)


Lesenswert?

>Du kannst virtuelle Verbindungen, und Switches einrichten mittels
>veth-pairs und bridges. veth pairs sind wie Kabel. Man hat 2 Interfaces,
>was beim einen rein kommt, kommt am anderen interface an, und die 2
>interfaces können in unterschiedlichen Netzwerk Namespacen sein. Bridges
>sind wie switches. Kann man Interfaces reinstecken, und die Pakete
>werden dann entsprechend verteilt. So kann man ein virtuelles Netzwerk
>zwischen den Sachen aufbauen, über Netzwerk Namespaces hinweg. Ist aber
>umständlich.

Danke für die Erklärung, dann werde ich mir mal die veths und bridges 
anschauen.

von Εrnst B. (ernst)


Lesenswert?

Thorben schrieb:
> Danke für die Erklärung, dann werde ich mir mal die veths und bridges
> anschauen.

Einfacher wirds, wenn du dir das gleich im Kontext von systemd-nspawn 
anschaust.
Oder, wenn's dir nur um "Network Namespaces" geht, und weniger um 
systemd:  Docker oder LXC.

von DPA (Gast)


Lesenswert?

Ich würde zum herum probieren & lernen mit Network Namespaces das "ip" 
zeug empfehlen. "ip netns add ..." "ip netns exec ..." und "ip link set 
[interface] netns [namespace]". Da gibt's keine Magie, und man kann ales 
selbst mal durch gehen.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.