Jak skonfigurować wirtualną sieć `veth`


26

Chciałbym skonfigurować trzy interfejsy sieci wirtualnej ( veth), które mogą się ze sobą komunikować. Aby zasymulować klaster z trzema węzłami, każdy program łączy się z jednym vethinterfejsem. Chciałbym to zrobić bez LXC, jeśli to możliwe.

Próbowałem użyć:

  • Utworzono trzy vethpary:sudo ip link add type veth
  • Utworzono most sudo brctl addbr br0
  • Dodano jedną z każdej pary do mostu:
    • sudo brctl addif br0 veth1
    • sudo brctl addif br0 veth3
    • sudo brctl addif br0 veth5
  • Skonfigurowane interfejsy:
    • 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

Następnie sprawdziłem, czy działa przy użyciu: ping -I veth0 10.0.0.202ale nie działa :(

I dodaje adresy IP do veth1, veth3, veth5i br0interfejsów w zakresie 10.0.1.x / 24. Ale to nie pomaga.

Jakieś pomysły? lub przewodnik, wszystko, co znajduję w tym, jak go używać z LXC. A może próbuję czegoś, co nie jest możliwe?


Czy to br0samo?
grawity

Tak, to już koniec. Skonfigurowany go jakby Veth użytkownika
Reinder

Odpowiedzi:


31

Aby veth działał, jeden koniec tunelu musi być połączony z innym interfejsem. Ponieważ chcesz zachować to wszystko jako wirtualne, możesz zmostkować koniec vm1 tunelu (vm2 jest drugim końcem tunelu) za pomocą interfejsu wirtualnego typu tap, w moście zwanym brm. Teraz podajesz adresy IP brm i vm2 (odpowiednio 10.0.0.1 i 10.0.0.2), włącz przekazywanie IPv4 za pomocą

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

uruchom wszystkie interfejsy i dodaj trasę instruującą jądro, jak dotrzeć do adresów IP 10.0.0.0/24. To wszystko.

Jeśli chcesz utworzyć więcej par, powtórz poniższe kroki z różnymi podsieciami, na przykład 10.0.1.0/24, 10.0.2.0/24 i tak dalej. Ponieważ włączyłeś przekazywanie IPv4 i dodałeś odpowiednie trasy do tabeli routingu jądra, będą mogli od razu ze sobą rozmawiać.

Pamiętaj też, że większość używanych poleceń (brctl, ifconfig, ...) jest przestarzała: pakiet iproute2 zawiera polecenia do wykonania tego wszystkiego, patrz poniżej moje użycie polecenia ip .

To jest poprawna sekwencja poleceń do używania interfejsów typu veth :

najpierw utwórz wszystkie wymagane interfejsy,

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

Zauważ, że nie uruchomiliśmy brm i vm2, ponieważ musimy przypisać im adresy IP, ale wprowadziliśmy tapm i vm1, co jest konieczne, aby uwzględnić je w bryle mostu. Teraz zniewolmy interfejsy tapm i vm1 do mostu brm,

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

teraz podaj adresy mostowi i pozostałemu interfejsowi veth2,

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

teraz przywołaj vm2 i brm,

ip link set brm up
ip link set vm2 up

Nie ma potrzeby jawnego dodawania trasy do podsieci 10.0.0.0/24, jest ona generowana automatycznie, można sprawdzić za pomocą ip route show . To skutkuje

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

Możesz to również zrobić wstecz, tj. Z vm2 z powrotem do 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

Najbardziej użyteczne stosowanie kart sieciowych z Veth rodzaj jest nazw sieci , co jest, co jest wykorzystywane w pojemnikach Linux (lxc). Możesz uruchomić jeden o nazwie nnsm w następujący sposób

ip netns add nnsm

następnie przesyłamy do niego vm2,

ip link set vm2 netns nnsm 

wyposażamy nową przestrzeń nazw sieci w interfejs lo (absolutnie konieczne),

ip netns exec nnsm  ip link set dev lo up

zezwalamy na NATting w głównej maszynie,

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

(jeśli masz połączenie z Internetem przez eth0 , w przeciwnym razie zmień odpowiednio), uruchom powłokę w nowej sieciowej przestrzeni nazw,

ip netns exec nnsm xterm & 

a teraz, jeśli zaczniesz pisać w nowym xterm, przekonasz się, że jesteś na osobnej maszynie wirtualnej o adresie IP 10.0.0.2, ale możesz połączyć się z Internetem. Zaletą tego jest to, że nowa przestrzeń nazw sieci ma swój własny stos, co oznacza, na przykład, możesz uruchomić w niej VPN, podczas gdy reszta twojego komputera nie jest w VPN. To jest urządzenie, na którym bazują LXC.

EDYTOWAĆ:

Popełniłem błąd, sprowadzając interfejs vm2, sprowadza go i usuwa adres. Dlatego musisz dodać te polecenia z poziomu xterm:

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

a teraz możesz nawigować z poziomu xterm.

Te ippolecenia mogą być również wykonane z przed xterm

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

Dziękuję za wyjaśnienie. Widzę tylko lo w xterm, brakuje interfejsu vm2.
Reinder

Dzięki jeszcze raz. Stworzyłem skrypt, aby skonfigurować trzy xtermy, i mogą pingować się do siebie :)
Reinder

Tylko jeden problem .... Kiedy wysyłam transmisję UPD w jednym xterm, inni otrzymują pakiet z 10.0.0.254 (brm). Dla mojego skryptu patrz: tutaj (nie mogę tego opublikować w komentarzu)
Reinder

Mam problem wychowywanie VM1 się :( # Link ip add dev typ VM1 Veth nazwa sieci peer VM2 ip: RTNETLINK odpowiedzi: plik istnieje # linków zestaw dev VM1 się IP: SIOCGIFFLAGS: Nie ma takiego urządzenia
resultsway

@ MariusMatutiae Musiałem spróbować kilka razy, więc zgadzam się z pierwszym poleceniem, ale jakoś moja wklejona kopia nie jest odpowiednia dla drugiego (używam do urządzenia minicom), więc w skrócie postąpiłem dokładnie tak, jak sugerowałem. Myślę, że nie mam pakietu iproute2.
resultsway

0

Oto 5-węzłowy most, którego używam, który działa. Powinieneś być w stanie używać ifconfig do przypisywania adresów do interfejsów NodeX

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

i posprzątać

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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.