Предыдущая статьяупомянуть в конце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 домежду.
-
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 в этом простейшем режиме:
-
Отправить пинг-сообщение на
172.18.1.3, проверьте таблицу маршрутизации, пакеты будут отправляться сvxlan0отправлять. -
Открытие ядра
vxlan0IP-адрес172.18.1.2/24, а IP-адрес назначения находится в том же сегменте сети, поэтому в той же локальной сети вам необходимо знать MAC-адрес другой стороны, чтобы он отправилARPзапрос сообщения. -
ARPMAC-адрес источника пакетаvxlan0MAC-адрес назначения — это широковещательный адрес всех единиц (ff:ff:ff:ff:ff:ff). -
VXLANДобавьте верхний заголовок в соответствии с конфигурацией (VNI 42). -
вглядеться
VTEPАдрес 192.168.57.54, и сообщение отправляется на этот адрес. -
Когда одноранговый узел получает это сообщение, ядро определяет, что это сообщение VXLAN, и
VNIОтправить на соответствующийVTEP. -
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
-
MAC-адрес получателя ответного пакета — это отправитель.
VTEPMAC-адрес IP-адреса назначения является отправителемVTEPIP-адрес отправляется непосредственно на VTEP назначения. -
Ответное сообщение возвращается непосредственно на хост-отправитель через базовую сеть, и хост-отправитель в соответствии с
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
- уже
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:
- другой виртуальной машины (или контейнера)
MACадрес - IP-адрес хоста, на котором находится одноранговый узел (т.
VTEPАйпи адрес)
Первая связь между контейнерами между хостами должна знать друг друга.MACадрес, так вышлемARPзапрос сообщения.如果有多个节点,就要把ARPсообщения с запросами отправляются на все узлы, но традиционныйARPПередача пакетов невозможна, так как Underlay и Overlay по умолчанию не находятся в одной и той же сети уровня 2.ARPтрансляцияне могу убежатьхозяин. Чтобы реализовать трансляцию сети Overlay, сообщение должно быть отправлено на все узлы, где находится VTEP.Чтобы решить эту проблему, вероятно, есть две идеи:
- С помощью многоадресной рассылки некоторые узлы в сети группируются в виртуальное целое.
- знать заранее
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Весь процесс общения:
- Отправить пинг-сообщение на
172.18.1.3, проверьте таблицу маршрутизации, пакеты будут отправляться сvxlan0отправлять. - Открытие ядра
vxlan0IP-адрес172.18.1.2/24, а IP-адрес назначения находится в том же сегменте сети, поэтому в той же локальной сети вам необходимо знать MAC-адрес другой стороны, чтобы он отправилARPзапрос сообщения. -
ARPMAC-адрес источника пакетаvxlan0MAC-адрес назначения — это широковещательный адрес всех единиц (ff:ff:ff:ff:ff:ff). -
VXLANДобавьте верхний заголовок в соответствии с конфигурацией (VNI 42). -
На данный момент это не то же самое, что и раньше, так как пир неизвестен
VTEPна каком хосте, в соответствии с многоадресной конфигурацией,VTEPна многоадресный адрес224.1.1.1Отправка многоадресных пакетов. - Все хосты в группе многоадресной рассылки получат это сообщение, и ядро обнаружит, что оно
VXLANсообщение, оно будет основано наVNIотправить в соответствующийVTEP. - всех хостов, получивших сообщение
VTEPудалитVXLANголова, выньте настоящуюARPсообщение запроса. в то же время,VTEPбудет регистрировать источникMACадрес и информацию об IP-адресе дляFDBВ таблице это процесс обучения. если найденоARPЕсли он не отправлен вам, он будет удален напрямую; если он отправлен вам, он будет сгенерированARPответное сообщение. - Следующие шаги аналогичны описанному выше эксперименту.
Весь процесс общения аналогичен предыдущему, за исключениемUnderlayОтправка пакетов в многоадресном режиме, для нескольких узловVXLANСеть относительно проста и эффективна. Но и у многоадресной рассылки есть свои проблемы: не все сетевые устройства поддерживают многоадресную рассылку (например, общедоступное облако), а потери пакетов, вызванные многоадресной рассылкой, редко используются в реальной генерации. Следующая статья будет посвящена тому, как автоматически обнаруживать через распределенные центры управленияVTEPиMACадрес и другие данные.
4. Ссылки
Публичный аккаунт WeChat
Отсканируйте QR-код ниже, чтобы подписаться на официальную учетную запись WeChat, и ответьте на официальную учетную запись ◉Добавить группу◉, чтобы присоединиться к нашей облачной коммуникационной группе и обсудить облачные технологии с Сунь Хунляном, директором Чжаном, Ян Мином и другими важными шишками.