Учебное пособие по основам VXLAN: настройка сети VXLAN в Linux

Linux

Предыдущая статьяупомянуть в концеLinuxда поддержкаVXLANДа, мы можем использовать Linux для сборкиVXLANНакладная сеть, чтобы углубить понимание VXLAN, в конце концов, обрабатывать и носику.

1. Двухточечный VXLAN

Давайте сначала рассмотрим простейшую двухточечнуюVXLANсеть, одноранговая сетьVXLANт.е. построен на двух хостахVXLANсети, по одному на каждом хостеVTEP,VTEPМежду общением через их IP-адреса. Топология Vxlan Peer Topology Как показано:

Чтобы не влиять на сетевое окружение хоста, мы можем использовать LinuxVRFдля изоляции маршрутов пространства имен корневой сети. VRF (Virtual Routing and Forwarding) — экземпляр маршрутизации, состоящий из таблицы маршрутизации и набора сетевых устройств, можно понимать как легковесныйnetwork namespace, виртуализируется только трехуровневый стек сетевых протоколов, иnetwork namespaceВиртуализируйте весь стек сетевых протоколов. Подробнее см.Принцип и реализация Linux VRF (Virtual Routing Forwarding).

Версия ядра Linux больше, чем4.3Поддерживается только VRF.Студентам, которые будут проводить эксперименты в этой статье, рекомендуется сначала обновить ядро.

Конечно, если у вас есть чистый хост, предназначенный для экспериментов, вы можете изолировать его без VRF.

Объединить нижеVRFдля создания двухточечной сети VXLAN.

первый в192.168.57.50Создайте интерфейс VXLAN на:

$ ip link add vxlan0 type vxlan \
  id 42 \
  dstport 4789 \
  remote 192.168.57.54 \
  local 192.168.57.50 \
  dev eth0

Пояснение важных параметров:

  • id 42: уточнитьVNIзначение, допустимые значения от 1 до2^{24}между.
  • dstport : VTEPПорт для связи, порт, назначенный IANA, — 4789. Если не указано, Linux использует значение по умолчанию.8472.
  • remote: Адрес однорангового VTEP.
  • local: текущий узелVTEPИспользуемый IP-адрес, то есть IP-адрес туннельного порта текущего узла.
  • dev eth0: текущий узел используется дляVTEPУстройство связи, используемое для получения IP-адреса VTEP.Этот параметр имеет ту же цель, что и локальный параметр, вы можете выбрать один из двух.

Проверятьvxlan0Детали:

$ ip -d link show vxlan0

11: vxlan0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master vrf-test state UNKNOWN mode DEFAULT group default qlen 1000
    link/ether 82:f3:76:95:ab:e1 brd ff:ff:ff:ff:ff:ff promiscuity 0
    vxlan id 42 remote 192.168.57.54 local 192.168.57.50 srcport 0 0 dstport 4789 ageing 300 udpcsum noudp6zerocsumtx noudp6zerocsumrx

Затем создайте VRF и поместитеvxlan0привязать к этомуVRFсередина:

$ ip link add vrf0 type vrf table 10
$ ip link set vrf0 up
$ ip link set vxlan0 master vrf0

Проверьте еще разvxlan0Информация:

$ ip -d link show vxlan0

13: vxlan0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master vrf0 state UNKNOWN mode DEFAULT group default qlen 1000
    link/ether aa:4d:80:e3:75:e0 brd ff:ff:ff:ff:ff:ff promiscuity 0
    vxlan id 42 remote 192.168.57.54 local 192.168.57.50 srcport 0 0 dstport 4789 ageing 300 udpcsum noudp6zerocsumtx noudp6zerocsumrx
    vrf_slave table 10 addrgenmode eui64 numtxqueues 1 numrxqueues 1 gso_max_size 65536 gso_max_segs 65535

Вы найдете больше информации о VRF.

Затем настройте IP-адрес для vxlan0 и включите его:

$ ip addr add 172.18.1.2/24 dev vxlan0
$ ip link set vxlan0 up

После успешного выполнения вы обнаружите, что запись в таблице маршрутизации VRF имеет следующее содержимое.172.18.1.0/24Сетевые пакеты должны пересылаться через vxlan0:

$ ip route show vrf vrf0

172.18.1.0/24 dev vxlan0 proto kernel scope link src 172.18.1.2

Также добавьте А.FDBТаблица переадресации:

$ bridge fdb show

00:00:00:00:00:00 dev vxlan0 dst 192.168.57.54 self permanent

Эта запись означает, что по умолчаниюVTEPАдрес пира192.168.57.54. Другими словами, исходное сообщение проходит черезvxlan0Заголовок VXLAN будет добавлен ядром, а IP-адрес назначения внешнего заголовка UDP будет иметь префикс192.168.57.54.

Та же самая конфигурация также выполняется на другом хосте (192.168.57.54):

$ ip link add vxlan0 type vxlan id 42 dstport 4789 remote 192.168.57.50
$ ip link add vrf0 type vrf table 10
$ ip link set vrf0 up
$ ip link set vxlan0 master vrf0
$ ip addr add 172.18.1.3/24 dev vxlan0
$ ip link set vxlan0 up

После того, как все сделано, вы можете общаться друг с другом, в192.168.57.50при пинге172.18.1.3:

$ ping 172.18.1.3 -I vrf0

использовать одновременноwiresharkУдаленный захват пакетов:

$ ssh root@192.168.57.54 'tcpdump -i any -s0 -c 10 -nn -w - port 4789' | /Applications/Wireshark.app/Contents/MacOS/Wireshark -k -i -

Я не буду объяснять конкретное значение, см.Пример учебника по Tcpdump.

можно увидетьVXLANСообщение можно разделить на три части:

  • Самый внутренний уровень — это сообщение, которое видят объекты, фактически взаимодействующие в оверлейной сети (например, здесьARPзапросы), они неотличимы от классического сетевого трафика, за исключением того, чтоMTUВ результате некоторые пакеты имеют относительно небольшой размер.
  • Средний уровень — это заголовок VXLAN, поле, о котором мы заботимся больше всего.VNIверно42.
  • Самый внешний слой этоVTEPЗаголовок коммуникационного пакета хоста, на котором находится хост, и IP-адрес назначения является равноправным192.168.57.54.

Давайте проанализируем процесс связи vxlan в этом простейшем режиме:

  1. Отправить пинг-сообщение на172.18.1.3, проверьте таблицу маршрутизации, пакеты будут отправляться сvxlan0отправлять.

  2. Открытие ядраvxlan0IP-адрес172.18.1.2/24, а IP-адрес назначения находится в том же сегменте сети, поэтому в той же локальной сети вам необходимо знать MAC-адрес другой стороны, чтобы он отправилARPзапрос сообщения.

  3. ARPMAC-адрес источника пакетаvxlan0MAC-адрес назначения — это широковещательный адрес всех единиц (ff:ff:ff:ff:ff:ff).

  4. VXLANДобавьте верхний заголовок в соответствии с конфигурацией (VNI 42).

  5. вглядетьсяVTEPАдрес 192.168.57.54, и сообщение отправляется на этот адрес.

  6. Когда одноранговый узел получает это сообщение, ядро ​​определяет, что это сообщение VXLAN, иVNIОтправить на соответствующийVTEP.

  7. VTEPУдалите заголовок VXLAN и выньте настоящийARPсообщение запроса, тем временем,VTEPбудет регистрировать источникMACадрес и информацию об IP-адресе дляFDBВ таблице это процесс обучения. затем сгенерироватьARPответное сообщение.

$ bridge fdb show
 
00:00:00:00:00:00 dev vxlan0 dst 192.168.57.50 self permanent
aa:4d:80:e3:75:e0 dev vxlan0 dst 192.168.57.50 self
  1. MAC-адрес получателя ответного пакета — это отправитель.VTEPMAC-адрес IP-адреса назначения является отправителемVTEPIP-адрес отправляется непосредственно на VTEP назначения.

  2. Ответное сообщение возвращается непосредственно на хост-отправитель через базовую сеть, и хост-отправитель в соответствии сVNIПересылает пакет на VTEP, VTEP распаковывает ответный ARP-пакет, добавляетARPКэшировать в ядро ​​и узнавать назначение по сообщениюVTEPизIPадрес и цельMACадрес, добавитьFDBв таблице.

$ ip neigh show vrf vrf0
 
172.18.1.3 dev vxlan0 lladdr 76:06:5c:15:d9:78 STALE
 
$ bridge fdb show
 
00:00:00:00:00:00 dev vxlan0 dst 192.168.57.54 self permanent
fe:4a:7e:a2:b5:5d dev vxlan0 dst 192.168.57.54 self
  1. ужеVTEPВся информация, необходимая для связи, известна.Последующие пинг-пакеты ICMP являются одноадресными в этом логическом туннеле, и их больше не нужно отправлять.ARPзапрос сообщения.

Обобщим описанный выше процесс: сообщение ping сети VXLAN должно пройти черезАдресация ARP + ответ ICMPдва процесса, один разVTEPУстройство узнало ARP-адрес другой стороны, и последующего обмена данными можно избежать.ARPпроцесс адресации.

2. VXLAN + Bridge

точка-точкаVXLANСуществует только одна сетевая коммуникационная сторонаVTEP, и есть только один коммуникационный объект, но в реальном производстве на каждом хосте есть десятки или даже сотни виртуальных машин или контейнеров, которым необходимо обмениваться данными, поэтому необходим механизм для соединения этихобъект связиОрганизуйте, а затем пройдите через устье туннеляVTEPотправлено.

Решение на самом деле очень распространено. Мост Linux может подключить несколько виртуальных сетевых карт, поэтому вы можете использоватьBridgeПоместите несколько виртуальных машин или контейнеров в одну сеть VXLAN, топология сети показана на рисунке:

По сравнению с вышеописанным режимом есть только один дополнительныйBridge, используемый для соединения различных сетевых пространств именveth pair,в то же времяVXLANСетевая карта также должна быть подключена кBridge.

первый в192.168.57.50Создайте интерфейс VXLAN на:

$ ip link add vxlan0 type vxlan \
  id 42 \
  dstport 4789 \
  local 192.168.57.50 \
  remote 192.168.57.54

затем создайте мостbridge0, поставить сетевую карту VXLANvxlan0привязать к вышеуказанному, затем поставитьbridge0связываются сVRF, и запустите их:

$ ip link add br0 type bridge
$ ip link set vxlan0 master br0
$ ip link add vrf0 type vrf table 10
$ ip link set br0 master vrf0
$ ip link set vxlan0 up
$ ip link set br0 up
$ ip link set vrf0 up

Создать нижеnetwork namespaceи параveth pair, и привяжите один конец пары veth к мосту, затем поместите другой конец в сетевое пространство имен и привяжите IP-адрес172.18.1.2:

$ ip netns add ns0

$ ip link add veth0 type veth peer name eth0 netns ns0
$ ip link set veth0 master br0
$ ip link set veth0 up

$ ip -n ns0 link set lo up
$ ip -n ns0 addr add 172.18.1.2/24 dev eth0
$ ip -n ns0 link set eth0 up

Таким же образом настройте сеть VXLAN на другом хосте, привяжите172.18.1.3другомуnetwork namespaceeth0 в:

$ ip link add vxlan0 type vxlan \
  id 42 \
  dstport 4789 \
  local 192.168.57.54 \
  remote 192.168.57.50
  
$ ip link add br0 type bridge
$ ip link set vxlan0 master br0
$ ip link add vrf0 type vrf table 10
$ ip link set br0 master vrf0
$ ip link set vxlan0 up
$ ip link set br0 up
$ ip link set vrf0 up

$ ip netns add ns0

$ ip link add veth0 type veth peer name eth0 netns ns0
$ ip link set veth0 master br0
$ ip link set veth0 up

$ ip -n ns0 link set lo up
$ ip -n ns0 addr add 172.18.1.3/24 dev eth0
$ ip -n ns0 link set eth0 up

от172.18.1.2 ping 172.18.1.3Выяснено, что весь коммуникационный процесс аналогичен предыдущему эксперименту, за исключением того, что контейнер отправляетARPСообщение сначала пройдет через мост, а затемvxlan0, затем вvxlan0Заголовок VXLAN добавляется ядром Linux и, наконец, отправляется узлу.

Логически разные хосты в сети VXLANnetwork namespaceВсе сетевые карты в сети подключены к одному и тому же мосту, поэтому один и тот же хост может быть создан на одном хосте.VXLANНесколько контейнеров в сети и общаются друг с другом.

3. VXLAN в многоадресном режиме

Вышеупомянутые два режима могут быть связаны только точка-точка, то есть в одной сети VXLAN может быть только два узла, как это можно допустить? . . Есть ли способ разместить несколько узлов в одной сети VXLAN? Давайте сначала рассмотрим две ключевые части информации о связи VXLAN:

  1. другой виртуальной машины (или контейнера)MACадрес
  2. IP-адрес хоста, на котором находится одноранговый узел (т.VTEPАйпи адрес)

Первая связь между контейнерами между хостами должна знать друг друга.MACадрес, так вышлемARPзапрос сообщения.如果有多个节点,就要把ARPсообщения с запросами отправляются на все узлы, но традиционныйARPПередача пакетов невозможна, так как Underlay и Overlay по умолчанию не находятся в одной и той же сети уровня 2.ARPтрансляцияне могу убежатьхозяин. Чтобы реализовать трансляцию сети Overlay, сообщение должно быть отправлено на все узлы, где находится VTEP.Чтобы решить эту проблему, вероятно, есть две идеи:

  1. С помощью многоадресной рассылки некоторые узлы в сети группируются в виртуальное целое.
  2. знать заранееMACадрес иVTEP IPинформация, непосредственноARPиFDBСообщение сообщает отправителю VTEP. Эта информация обычно собирается через внешний распределенный центр управления, и собранная информация будет распространяться на все узлы в той же сети VXLAN.

Давайте сначала посмотрим, как реализован мультикаст, а о распределенном центре управления речь пойдет в следующей статье.

Если VXLAN хочет использовать режим многоадресной рассылки, базовая сеть должна поддерживать функцию многоадресной рассылки, а диапазон адресов многоадресной рассылки224.0.0.0~239.255.255.255.

По сравнению с приведенным выше режимом «точка-точка» VXLAN + Bridge, здесь просто меняются параметры однорангового узла наgroupПараметры, остальные без изменений, команда выглядит следующим образом:

# 在主机 192.168.57.50 上执行
$ ip link add vxlan0 type vxlan \
  id 42 \
  dstport 4789 \
  local 192.168.57.50 \
  group 224.1.1.1
  
$ ip link add br0 type bridge
$ ip link set vxlan0 master br0
$ ip link add vrf0 type vrf table 10
$ ip link set br0 master vrf0
$ ip link set vxlan0 up
$ ip link set br0 up
$ ip link set vrf0 up

$ ip netns add ns0

$ ip link add veth0 type veth peer name eth0 netns ns0
$ ip link set veth0 master br0
$ ip link set veth0 up

$ ip -n ns0 link set lo up
$ ip -n ns0 addr add 172.18.1.2/24 dev eth0
$ ip -n ns0 link set eth0 up
# 在主机 192.168.57.54 上执行
$ ip link add vxlan0 type vxlan \
  id 42 \
  dstport 4789 \
  local 192.168.57.54 \
  group 224.1.1.1
  
$ ip link add br0 type bridge
$ ip link set vxlan0 master br0
$ ip link add vrf0 type vrf table 10
$ ip link set br0 master vrf0
$ ip link set vxlan0 up
$ ip link set br0 up
$ ip link set vrf0 up

$ ip netns add ns0

$ ip link add veth0 type veth peer name eth0 netns ns0
$ ip link set veth0 master br0
$ ip link set veth0 up

$ ip -n ns0 link set lo up
$ ip -n ns0 addr add 172.18.1.3/24 dev eth0
$ ip -n ns0 link set eth0 up

Очевидным отличием от приведенного выше эксперимента является содержание записи FDB:

$ bridge fdb show

00:00:00:00:00:00 dev vxlan0 dst 224.1.1.1 self permanent

dstЗначение поля становится многоадресным адресом224.1.1.1, вместо предыдущего адреса VTEP другой стороны будет передан VTEPIGMP (протокол управления интернет-группами)Присоединяйтесь к одной многоадресной группе224.1.1.1.

Разберем мультикаст режимVXLANВесь процесс общения:

  1. Отправить пинг-сообщение на172.18.1.3, проверьте таблицу маршрутизации, пакеты будут отправляться сvxlan0отправлять.
  2. Открытие ядраvxlan0IP-адрес172.18.1.2/24, а IP-адрес назначения находится в том же сегменте сети, поэтому в той же локальной сети вам необходимо знать MAC-адрес другой стороны, чтобы он отправилARPзапрос сообщения.
  3. ARPMAC-адрес источника пакетаvxlan0MAC-адрес назначения — это широковещательный адрес всех единиц (ff:ff:ff:ff:ff:ff).
  4. VXLANДобавьте верхний заголовок в соответствии с конфигурацией (VNI 42).
  5. На данный момент это не то же самое, что и раньше, так как пир неизвестенVTEPна каком хосте, в соответствии с многоадресной конфигурацией,VTEPна многоадресный адрес224.1.1.1Отправка многоадресных пакетов.
  6. Все хосты в группе многоадресной рассылки получат это сообщение, и ядро ​​обнаружит, что оноVXLANсообщение, оно будет основано наVNIотправить в соответствующийVTEP.
  7. всех хостов, получивших сообщениеVTEPудалитVXLANголова, выньте настоящуюARPсообщение запроса. в то же время,VTEPбудет регистрировать источникMACадрес и информацию об IP-адресе дляFDBВ таблице это процесс обучения. если найденоARPЕсли он не отправлен вам, он будет удален напрямую; если он отправлен вам, он будет сгенерированARPответное сообщение.
  8. Следующие шаги аналогичны описанному выше эксперименту.

Весь процесс общения аналогичен предыдущему, за исключениемUnderlayОтправка пакетов в многоадресном режиме, для нескольких узловVXLANСеть относительно проста и эффективна. Но и у многоадресной рассылки есть свои проблемы: не все сетевые устройства поддерживают многоадресную рассылку (например, общедоступное облако), а потери пакетов, вызванные многоадресной рассылкой, редко используются в реальной генерации. Следующая статья будет посвящена тому, как автоматически обнаруживать через распределенные центры управленияVTEPиMACадрес и другие данные.

4. Ссылки

Публичный аккаунт WeChat

Отсканируйте QR-код ниже, чтобы подписаться на официальную учетную запись WeChat, и ответьте на официальную учетную запись ◉Добавить группу◉, чтобы присоединиться к нашей облачной коммуникационной группе и обсудить облачные технологии с Сунь Хунляном, директором Чжаном, Ян Мином и другими важными шишками.