[LINUX] Netzwerk-Namespace-Routing

Einführung

Hier ist eine Fortsetzung des vorherigen Namespace-Artikels. Letzter Beitrag: Linux Network Namespace1 Als ich mich fragte, was "netns" ist, war es ein Akronym für NETwork Name Space. Ich werde Qiita beschreiben, einschließlich dessen, was mir wieder aufgefallen ist.

Der Grund, warum die Kommunikation ohne den vorherigen Router möglich war

Ursprünglich hängt das mit IP konfigurierte Netzwerk vom Router ab. Es besteht aus einem Bucket-Relay von Paketen Die zuvor konfigurierte IP war jedoch __ "gehört zu einem Segment desselben Netzwerks" __ Die Kommunikation war ohne Router möglich

Mit anderen Worten, wenn Sie einen Router benötigen Nur wenn Sie mit jemandem mit einem anderen Segment kommunizieren möchten

Was ist ein Segment?

Ein Teil einer Sache Es scheint, dass es mehrere Codesegmente und Datensegmente gibt Ich denke nicht, dass es diesmal relevant ist, also werde ich es weglassen.

Die IP-Adresse ist in zwei Teile unterteilt

IPv4 Binäre Ganzzahl zwischen 32 Bit Beispiel) XXXXXXXX00000000 XXXXXXXX00000000

=> Versuchen Sie dies in 8-Bit-Intervallen zu teilen Jeder getrennte Raum heißt __octet __ Beispiel) XXXXXXXX00000000 XXXXXXXX00000000 => XXXXXXXX.00000000.XXXXXXXX.00000000

Lassen Sie uns dies in eine Dezimalzahl umwandeln Beispiel) XXXXXXXX.00000000.XXXXXXXX.00000000 => XXX.X.X.0

Und diese IP-Adresse sieht so aus und ist in zwei Teile unterteilt Beispiel) IP-Adresse von XXX.X.X .__ 1__ XXX.X.X in der ersten Hälfte __Netzwerkteil __ Die letztere 1 heißt __host part __

Netzwerkteil Netzwerkadresse Der Host-Teil wird auch als "Host-Adresse" bezeichnet

Warum sie getrennt sind

__ Segment identifizieren __ => Das heißt, IP-Adressen mit derselben Netzwerkadresse gehören zu demselben Segment.

Wenn Sie es durch das 24. Bit teilen Es wird dieselbe Netzwerkadresse sein XXX.X.X

Auch der Wert von veth, der zuletzt erstellt wurde, ist Es war so etwas wie XXX.X.X.X / 24 Diese Zeichenfolge __ / 24__ gibt an, dass das 24. Bit die Netzwerkadresse ist.

Daher gehören die beiden oben genannten zu demselben Segment im Netzwerk.

Versuchen Sie es mit einem Router

Installieren Sie es so, dass die Kommunikation über einen Router zwischen den vorherigen Namespaces ns1 und ns2 erfolgen kann

Terminal


$ sudo ip netns add ns1
$ sudo ip netns add router
$ sudo ip netns add ns2

Machen Sie noch einmal von 1. Erstellen Sie einen Namensraum namens "Router", der eine Brücke schlägt Erstellen Sie als Nächstes eine veth-Schnittstelle, die jeden Namespace verbindet. Da es 3 Namespaces gibt, sind insgesamt 2 Schnittstellen erforderlich.

Terminal


$ sudo ip link add ns1-veth0 type veth peer name gw-veth0
$ sudo ip link add ns2-veth0 type veth peer name gw-veth1

Stellen Sie sicher, dass jeder Namespace zur erstellten veth-Schnittstelle gehört, und erstellen Sie ihn

Terminal


$ sudo ip link set ns1-veth0 netns ns1
$ sudo ip link set gw-veth0 netns routes
$ sudo ip link set gw-veth0 netns router
$ sudo ip link set ns2-veth0 netns ns2

$ sudo ip netns exec ns1 ip link set ns1-veth0 up
$ sudo ip netns exec router ip link set gw-veth0 up
$ sudo ip netns exec router ip link set gw-veth0 up
$ sudo ip netns exec ns2 ip link set ns2-veth0 up

Stellen Sie die IP-Adresse ein

Stellen Sie zwischen ns1 und Router ein Weisen Sie jeder Netzwerkschnittstelle dieselbe Segment-IP-Adresse zu Beide sind auf dasselbe Segment 192.0.2.0 / 24 eingestellt

Terminal


$ sudo ip netns exec ns1 ip address add 192.0.2.1/24 dev ns1-veth0
$ sudo ip netns exec router ip address add 192.0.2.254/24 dev gw-veth0

Weisen Sie zwischen ns2 und Router dieselbe Segment-IP-Adresse zu Beide sind auf das gleiche Segment von 198.51.100.0/24 eingestellt

Terminal


$ sudo ip netns exec router ip address add 198.51.100.254/24 dev gw-veth1
$ sudo ip netns exec ns2 ip address add 198.51.100.1/24 dev ns2-veth0

Sie können die Einstellungen wie in der Abbildung gezeigt vornehmen. netns3.png

Kommunizieren Sie über einen Router

Stellen Sie sicher, dass Sie über den Router segmentübergreifend kommunizieren können Versuchen Sie, im aktuellen Status von der IP-Adresse ns1 auf ns2 zu pingen

Terminal


$ sudo ip netns exec ns1 ping -c 3 198.51.100.1. -I 192.0.2.1

PING 198.51.100.1 (198.51.100.1) from 192.0.2.1 : 56(84) bytes of data.
ping : sendmsg : Network is unreachable
ping : sendmsg : Network is unreachable
ping : sendmsg : Network is unreachable

—- 198.51.100.1 ping statisics —
3 packets transmitted, 0 received, 100% packet loss , time 2000ms

"Network is unreachable" Ich werde wütend, wenn mir gesagt wird, dass ich das Netzwerk nicht erreichen kann. Die Ursache für einen Kommunikationsfehler ist, dass im Netzwerk-Namespace keine Routing-Einstellung vorhanden ist Da die für das Relais zur Kommunikation erforderlichen Informationen in der Routing-Tabelle beschrieben wurden Überprüfen Sie die aktuelle Routing-Tabelle

Terminal


$ sudo ip netns exec ns1 ip route show
192.0.2.0/24 dev ns1-veth0 proto karnel scope link src 192.0.2.1

Es gibt einen Routing-Eintrag in der Routing-Tabelle von ns1 192.0.2.0/24宛はns1-veth0というネットワークインターフェースで通信するという内容しかない Mit anderen Worten, die Quelle des Paketziels 198.51.100.1 stimmt mit keinem Routing-Eintrag überein. "Weil ns1 nicht wusste, an wen das Paket als nächstes weitergeleitet werden soll"

Sie müssen der Routing-Tabelle einen Routing-Eintrag hinzufügen, um ihn aufzulösen

Terminal


$ sudo ip netns exec ns1 ip route add default via 192.0.2.254

Sie können einen Routing-Eintrag für "$ ip route add" hinzufügen Als nächstes habe ich das gleiche Problem mit ns2, also stelle es auf die gleiche Weise ein.

Terminal


$ sudo ip netns exec ns2 ip route add default via 198.51.100.254

Versuchen Sie erneut, von ns1 nach ns2 zu pingen

Terminal


$ sudo ip netns exec ns1 ping -c 3 198.51.100.1 -I 192.0.2.1
PING 198.51.100.1 (198.51.100.1) from 192.0.2.1 : 56(84) butes of data.

— 198.51.100.1 ping statistics—
3 packets transmitted , 0 received , 100% packet loss, time 2000ms

Der Fehler ist verschwunden, aber für den von mir gesendeten Ping wird keine Antwort zurückgegeben Es scheint, dass Sie einen Befehl eingeben müssen, um den Kernel-Parameter sysctl` festzulegen Dieser Befehl setzte die net.ipv4.ip_forward des Kernels auf 1 und aktivierte sie mit dem Parameter 1. Linux scheint nicht als Router zu booten, es sei denn, dieser Parameter ist aktiviert

Terminal


$ sudo ip netns exec router sysctl net.ipv4.ip_forward=1 net.ipv4.ip_forward=1

$ sudo ip netns exec ns1 ping -c 3 198.51.100.1 -I 192.0.2.1
PING 198.51.100.1 (198.51.100.1) from 192.0.2.1 : 56(84) butes of data.
64 bytes from 198.51.100.1 : icmp_seq=1 ttl=63 time=0022ms
64 bytes from 198.51.100.1 : icmp_seq=2 ttl=63 time=0044ms
64 bytes from 198.51.100.1 : icmp_seq=3 ttl=63 time=0066ms

—198.51.100.1 ping statistics —

Am Ende

Die Kommunikation zwischen ns1 und ns2 erfolgt über einen Router. Die meisten von ihnen wurden aus Büchern zitiert, und es fehlt ihnen immer noch an Tödlichkeit. Ich möchte lernen, indem ich nach und nach nach Wörtern suche.

Recommended Posts

Netzwerk-Namespace-Routing
Linux-Netzwerk-Namespace
Netzwerk
Betreiben Sie den Linux-Netzwerk-Namespace mit Go
Relationales Netzwerk