Предыдущая статьяупомянуть в конце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
отправлять. -
Открытие ядра
vxlan0
IP-адрес172.18.1.2/24
, а IP-адрес назначения находится в том же сегменте сети, поэтому в той же локальной сети вам необходимо знать MAC-адрес другой стороны, чтобы он отправилARP
запрос сообщения. -
ARP
MAC-адрес источника пакетаvxlan0
MAC-адрес назначения — это широковещательный адрес всех единиц (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-адрес получателя ответного пакета — это отправитель.
VTEP
MAC-адрес IP-адреса назначения является отправителемVTEP
IP-адрес отправляется непосредственно на 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 namespace
eth0 в:
$ 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
отправлять. - Открытие ядра
vxlan0
IP-адрес172.18.1.2/24
, а IP-адрес назначения находится в том же сегменте сети, поэтому в той же локальной сети вам необходимо знать MAC-адрес другой стороны, чтобы он отправилARP
запрос сообщения. -
ARP
MAC-адрес источника пакетаvxlan0
MAC-адрес назначения — это широковещательный адрес всех единиц (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, и ответьте на официальную учетную запись ◉Добавить группу◉, чтобы присоединиться к нашей облачной коммуникационной группе и обсудить облачные технологии с Сунь Хунляном, директором Чжаном, Ян Мином и другими важными шишками.