So richten Sie ein virtuelles "Veth" -Netzwerk ein

26

Ich möchte drei virtuelle Netzwerkschnittstellen ( veth) einrichten, die miteinander kommunizieren können. Zur Simulation eines Clusters mit drei Knoten wird jedes Programm an eine vethSchnittstelle gebunden. Ich würde es gerne ohne LXC machen, wenn möglich.

Ich habe versucht mit:

  • Erstellt drei veth Paare:sudo ip link add type veth
  • Erstellt eine Brücke sudo brctl addbr br0
  • Einer von jedem Paar zur Brücke hinzugefügt:
    • sudo brctl addif br0 veth1
    • sudo brctl addif br0 veth3
    • sudo brctl addif br0 veth5
  • Konfiguriert die Schnittstellen:
    • sudo ifconfig veth0 10.0.0.201 netmask 255.255.255.0 up
    • sudo ifconfig veth2 10.0.0.202 netmask 255.255.255.0 up
    • sudo ifconfig veth4 10.0.0.203 netmask 255.255.255.0 up

Dann habe ich überprüft, ob funktioniert mit: ping -I veth0 10.0.0.202 aber es funktioniert nicht :(

Die I hinzugefügt IP - Adressen an die veth1, veth3, veth5undbr0 Schnittstellen im 10.0.1.x / 24 - Bereich. Aber das hilft nicht.

Irgendwelche Ideen? oder eine Anleitung, alles, was ich in der Verwendung mit LXC finde. Oder versuche ich etwas, was nicht möglich ist?

Reinder
quelle
Ist br0selbst auf?
Grawity
Ja, es liegt an. Konfiguriert es wie die Veths
Reinder

Antworten:

31

Damit veth funktioniert, muss ein Ende des Tunnels mit einer anderen Schnittstelle überbrückt werden. Da Sie dies alles virtuell halten möchten, können Sie das vm1-Ende des Tunnels (vm2 ist das andere Ende des Tunnels) mit einer virtuellen Schnittstelle vom Typ tap in einer Brücke mit dem Namen brm überbrücken. Geben Sie nun IP-Adressen an brm und an vm2 (10.0.0.1 bzw. 10.0.0.2) und aktivieren Sie die IPv4-Weiterleitung mit

echo 1 > /proc/sys/net/ipv4/ip_forward

Rufen Sie alle Schnittstellen auf und fügen Sie eine Route hinzu, die den Kernel anweist, wie IP-Adressen 10.0.0.0/24 erreicht werden sollen. Das ist alles.

Wenn Sie weitere Paare erstellen möchten, wiederholen Sie die folgenden Schritte mit verschiedenen Subnetzen, z. B. 10.0.1.0/24, 10.0.2.0/24 usw. Da Sie die IPv4-Weiterleitung aktiviert und der Kernel-Routing-Tabelle entsprechende Routen hinzugefügt haben, können sie sofort miteinander kommunizieren.

Denken Sie auch daran, dass die meisten der von Ihnen verwendeten Befehle (brctl, ifconfig, ...) veraltet sind: Die iproute2- Suite verfügt über Befehle, um all dies zu tun, siehe unten meine Verwendung des Befehls ip .

Dies ist eine korrekte Befehlsfolge für die Verwendung von Schnittstellen vom Typ veth :

erst alle benötigten Schnittstellen anlegen,

ip link add dev vm1 type veth peer name vm2
ip link set dev vm1 up
ip tuntap add tapm mode tap
ip link set dev tapm up
ip link add brm type bridge

Beachten Sie, dass wir brm und vm2 nicht aufgerufen haben, weil wir ihnen IP-Adressen zuweisen müssen, aber tapm und vm1, die erforderlich sind, um sie in die bridge brm aufzunehmen. Versklaven Sie nun die Schnittstellen tapm und vm1 mit der Bridge brm,

ip link set tapm master brm
ip link set vm1 master brm

Geben Sie nun der Bridge und der verbleibenden veth-Schnittstelle vm2 Adressen.

ip addr add 10.0.0.1/24 dev brm
ip addr add 10.0.0.2/24 dev vm2

Bringen Sie jetzt vm2 und brm auf,

ip link set brm up
ip link set vm2 up

Es ist nicht erforderlich, die Route explizit zum Subnetz 10.0.0.0/24 hinzuzufügen. Sie wird automatisch generiert. Sie können dies mit ip route show überprüfen . Das führt zu

ping -c1 10.0.0.2
PING 10.0.0.2 (10.0.0.2) 56(84) bytes of data.
64 bytes from 10.0.0.2: icmp_seq=1 ttl=64 time=0.035 m

--- 10.0.0.2 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 1998ms
rtt min/avg/max/mdev = 0.035/0.035/0.035/0.000 ms

Sie können es auch rückwärts machen, dh von vm2 zurück zu brm:

ping -I 10.0.0.2 -c1 10.0.0.1
PING 10.0.0.1 (10.0.0.1) from 10.0.0.2 : 56(84) bytes of data.
64 bytes from 10.0.0.1: icmp_seq=1 ttl=64 time=0.045 ms

--- 10.0.0.1 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 1999ms
rtt min/avg/max/mdev = 0.045/0.045/0.045/0.000 ms

Die nützlichste Anwendung von NICs der veth- Art ist ein Netzwerk-Namespace , der in Linux-Containern (LXC) verwendet wird. Sie starten eine mit dem Namen nnsm wie folgt

ip netns add nnsm

dann übertragen wir vm2 darauf,

ip link set vm2 netns nnsm 

wir statten den neuen Netzwerknamensraum mit einer lo-Schnittstelle aus (unbedingt notwendig),

ip netns exec nnsm  ip link set dev lo up

Wir erlauben NATting in der Hauptmaschine,

iptables -t nat -A POSTROUTING -o brm -j MASQUERADE
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

(Wenn Sie über eth0 mit dem Internet verbunden sind , ändern Sie dies ansonsten entsprechend), starten Sie eine Shell im neuen Netzwerk-Namespace.

ip netns exec nnsm xterm & 

Wenn Sie jetzt mit der Eingabe des neuen xterm beginnen, werden Sie feststellen, dass Sie sich in einer separaten virtuellen Maschine mit der IP-Adresse 10.0.0.2 befinden, aber Sie können auf das Internet zugreifen. Dies hat den Vorteil, dass der neue Netzwerk-Namespace über einen eigenen Stack verfügt. Dies bedeutet, dass Sie beispielsweise ein VPN darin starten können, während sich der Rest Ihres PCs nicht im VPN befindet. Dies ist die Erfindung, auf der LXCs basieren.

BEARBEITEN:

Ich habe einen Fehler gemacht, indem ich die vm2-Schnittstelle heruntergefahren und ihre Adresse gelöscht habe. Daher müssen Sie diese Befehle aus dem xterm heraus hinzufügen:

ip addr add 10.0.0.2/24 dev vm2
ip link set dev  vm2 up
ip route add default via 10.0.0.1
echo "nameserver 8.8.8.8" >> /etc/resolv.conf
echo "nameserver 8.8.4.4" >> /etc/resolv.conf

und jetzt können Sie innerhalb von xterm navigieren.

Die ipBefehle können auch vor dem xterm mit ausgeführt werden

ip -netns nnsm addr add 10.0.0.2/24 dev vm2
ip -netns nnsm link set dev vm2 up
ip -netns nnsm route add default via 10.0.0.1
MariusMatutiae
quelle
Vielen Dank für die Erklärung. Ich sehe nur lo in xterm, die vm2-Schnittstelle fehlt.
Reinder
Danke noch einmal. Ich habe ein Skript erstellt, um drei xterms einzurichten, und die können miteinander
pingen
Nur ein Problem ... Wenn ich eine UPD-Sendung in einem xterm sende, empfangen die anderen das Paket von 10.0.0.254 (brm). Für mein Skript siehe: hier (kann nicht im Kommentar
gepostet werden
Ich habe Problem vm1 Erziehung up :( # ip link add dev vm1 Typ veth Peer Name vm2 ip: RTNETLINK Antworten: Die Datei existiert # ip link set dev vm1 up ip: SIOCGIFFLAGS: No such device
resultsway
@ MariusMatutiae Ich musste es ein paar Mal versuchen, damit ich dem ersten Befehl zustimme, aber irgendwie ist mein Kopieren und Einfügen für den zweiten Befehl nicht geeignet (ich verwende Minicom für das Gerät). Ich glaube, ich habe kein iproute2-Paket.
Ergebnisse
0

Hier ist ein 5-Node-Bridge-Setup, das funktioniert. Sie sollten ifconfig verwenden können, um den NodeX-Schnittstellen Adressen zuzuweisen

ip link add dev Node1s type veth peer name Node1
ip link add dev Node2s type veth peer name Node2
ip link add dev Node3s type veth peer name Node3
ip link add dev Node4s type veth peer name Node4
ip link add dev Node5s type veth peer name Node5

ip link set Node1 up
ip link set Node2 up
ip link set Node3 up
ip link set Node4 up
ip link set Node5 up

ip link set Node1s up
ip link set Node2s up
ip link set Node3s up
ip link set Node4s up
ip link set Node5s up

brctl addbr Br
ifconfig Br up

brctl addif Br Node1s
brctl addif Br Node2s
brctl addif Br Node3s
brctl addif Br Node4s
brctl addif Br Node5s

und aufzuräumen

brctl delif Br Node1s
brctl delif Br Node2s
brctl delif Br Node3s
brctl delif Br Node4s
brctl delif Br Node5s
brctl delif Br Node1
brctl delif Br Node2
brctl delif Br Node3
brctl delif Br Node4
brctl delif Br Node5

ifconfig Br down
brctl delbr Br

ip link del dev Node1
ip link del dev Node2
ip link del dev Node3
ip link del dev Node4
ip link del dev Node5
Neil McGill
quelle