Як налаштувати віртуальну мережу `veth`


26

Я хотів би встановити три віртуальні мережеві інтерфейси ( veth), які можуть спілкуватися один з одним. Щоб імітувати кластер з трьома вузлами, кожна програма потім прив'язується до одного vethінтерфейсу. Я хотів би зробити це без LXC, якщо можливо.

Я спробував використовувати:

  • Створено три vethпари:sudo ip link add type veth
  • Створили міст sudo brctl addbr br0
  • До мосту додано одну з кожної пари:
    • sudo brctl addif br0 veth1
    • sudo brctl addif br0 veth3
    • sudo brctl addif br0 veth5
  • Налаштовані інтерфейси:
    • 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

Тоді я перевірив, чи працює з використанням: ping -I veth0 10.0.0.202але це не так :(

Я додав IP - адреса до veth1, veth3, veth5і br0інтерфейси в діапазоні 10.0.1.x / 24. Але це не допомагає.

Якісь ідеї? або керівництво, все, що я знаходжу в тому, як його використовувати з LXC. Або я пробую щось, що неможливо?


Є чи br0сам по собі вгору?
grawity

Так, це вгору. Конфігурував це як веті
Reinder

Відповіді:


31

Щоб veth працювала, один кінець тунелю повинен бути з'єднаний з іншим інтерфейсом. Оскільки ви хочете зберегти це все віртуальне, ви можете з'єднати vm1 кінець тунелю (vm2 - інший кінець тунелю) за допомогою віртуального інтерфейсу типу tap, в мості, який називається brm. Тепер ви даєте IP-адреси до brm та vm2 (10.0.0.1 та 10.0.0.2 відповідно), включаєте переадресацію IPv4 за допомогою

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

піднесіть всі інтерфейси та додайте маршрут, що вказує ядру, як досягти IP-адрес 10.0.0.0/24. Це все.

Якщо ви хочете створити більше пар, повторіть наведені нижче кроки з різними підмережами, наприклад, 10.0.1.0/24, 10.0.2.0/24 тощо. Оскільки ви ввімкнули переадресацію IPv4 та додали відповідні маршрути до таблиці маршрутизації ядра, вони зможуть поговорити один з одним відразу.

Також пам’ятайте, що більшість команд, які ви використовуєте (brctl, ifconfig, ...), є застарілими: пакет iproute2 має команди для виконання всього цього, див. Нижче моє використання команди ip .

Це правильна послідовність команд для використання інтерфейсів типу veth :

спочатку створіть усі необхідні інтерфейси,

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

Зауважте, що ми не виводили brm та vm2, оскільки ми маємо призначити їм IP адреси, але ми створили tapm та vm1, що необхідно для включення їх у brm міст. Тепер поневоліть інтерфейси tapm і vm1 до brm міст,

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

тепер надайте адреси мосту та іншому інтерфейсу veth vm2,

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

тепер піднесіть vm2 і brm вгору,

ip link set brm up
ip link set vm2 up

Не потрібно додавати маршрут до підмережі 10.0.0.0/24 явно, він генерується автоматично ,, Ви можете перевірити з ip route show . Це призводить до

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

Ви також можете зробити це назад, тобто від vm2 назад до 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

Найбільш корисним застосуванням NIC типу veth є мережевий простір імен , який використовується в контейнерах Linux (LXC). Ви запускаєте nnsm таким чином

ip netns add nnsm

потім ми переносимо на нього vm2,

ip link set vm2 netns nnsm 

ми надаємо новому простору імен мереж інтерфейс lo (абсолютно необхідний),

ip netns exec nnsm  ip link set dev lo up

ми дозволяємо NATING в основній машині,

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

(якщо ви підключені до Інтернету через eth0 , інакше зміните відповідно), запустіть оболонку в новому просторі мережних імен,

ip netns exec nnsm xterm & 

і тепер, якщо ви почнете вводити новий xterm, ви виявите, що ви знаходитесь в окремій віртуальній машині з IP-адресою 10.0.0.2, але ви можете зайти в Інтернет. Перевага цього полягає в тому, що новий простір імен мережі має власний стек, а це означає, що, наприклад, ви можете запустити в ньому VPN, поки решта вашого ПК не знаходиться на VPN. На цьому заснована контрацепція LXC.

Редагувати:

Я допустив помилку, в результаті чого інтерфейс vm2 збиває його та очищує його адресу. Таким чином, вам потрібно додати ці команди зсередини 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

і тепер ви можете орієнтуватися зсередини xterm.

Ці ipкоманди також можна зробити до 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

Дякую за пояснення. Я бачу lo в xterm, інтерфейс vm2 відсутній.
Нагадування

Знову дякую. Я створив сценарій, щоб встановити три xterm, і може пінг один одному :)
Reinder

Лише одне питання .... Коли я надсилаю передачу UPD в одному xterm, інші отримують пакет від 10.0.0.254 (brm). Для мого сценарію дивіться: ось (не можу розмістити його в коментарі)
Reinder

У мене є проблема з підняттям vm1 :( # ip-посилання додати dev vm1 типу veth peer name vm2 ip: RTNETLINK відповіді: Файл існує # ip посилання встановлено dev vm1 up ip: SIOCGIFFLAGS: Немає такого пристрою
результатів

@ MariusMatutiae Мені довелося спробувати пару разів, тому я погоджуюся з першою командою, але якось моя папка для копіювання не підходить для другої (я використовую minicom для пристрою), тож коротше я дотримувався саме того, як було запропоновано. Я думаю, що у мене немає пакета iproute2.
результатпуску

0

Ось налаштування мосту з 5 вузлами, який я використовую. Ви повинні мати можливість використовувати ifconfig для призначення адрес інтерфейсам 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

і прибирати

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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.