Как настроить виртуальную сеть `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. Или я пытаюсь сделать что-то невозможное?

Reinder
источник
Это br0само по себе?
Гравитация
Да, это так. Настроил это как ветеринар
Рейндер

Ответы:

31

Для работы veth один конец туннеля должен быть соединен с другим интерфейсом. Поскольку вы хотите сохранить все это виртуальным, вы можете соединить конец туннеля vm1 (другой конец туннеля vm2) с виртуальным интерфейсом типа ответвления в мосте, называемом 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

теперь дайте адреса мосту и оставшемуся ветхому интерфейсу 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

Наиболее полезное применение сетевых карт типа 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

мы разрешаем NAT в основной машине,

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
MariusMatutiae
источник
Спасибо за объяснение. Я вижу только в xterm, интерфейс vm2 отсутствует.
Рейндер
Еще раз спасибо. Я сделал скрипт для настройки трех xterm, и они могут пинговать друг друга :)
Reinder
Только одна проблема .... Когда я отправляю трансляцию UPD в одном xterm, остальные получают пакет от 10.0.0.254 (brm). Для моего сценария смотрите: здесь (не могу опубликовать его в комментарии)
Reinder
У меня проблема с подключением vm1 :( # ip link add dev vm1 тип veth peer name vm2 ip: RTNETLINK ответы: файл существует # ip link set dev vm1 up ip: SIOCGIFFLAGS: Нет такого устройства
Resultsway
@ 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
Нил МакГилл
источник