Virtual Extensible LAN
VXLAN (англ. Virtual eXtensible Local Area Network) - це схема інкапсуляції кадрів мережевого протоколу другого рівня в пакетах протоколу третього рівня (тунелювання), з метою створити віртуальну мережу, і обійти деякі обмеження традиційної схеми VLAN. VXLAN працює поверх наявної мережевої інфраструктури, таким чином можна назвати її оверлейною мережею.
В 2010-тих роках поширюються хмарні технології та віртуалізація серверів. Це створює додаткові виклики для мережевої інфраструктури. Ті з них які намагається розв’язати технологія VXLAN буде розглянуто нижче.
Якщо дата-центр використовує кілька користувачів, і кожен з них хоче мати свою окрему віртуальну мережу для з’єднання орендованих машин, то їх потрібно якось ізолювати одне від одного, як з метою безпеки, так і з метою продуктивності (наприклад щоб широкомовні кадри однієї мережі не заважали кадрам інших мереж (широкомовні кадри трапляються дуже часто при використанні ARP)). Традиційно це робили за допомогою технології VLAN, проте через те що VLAN намагається відповідати формату кадру стандарту Ethernet, ця технологія дозволяє створити лише 4096 віртуальних мереж. Ця кількість була достатньою раніше, коли дата-центри не обслуговували тисячі користувачів водночас. Окрім того, деякі користувачі самі потребуватимуть кількох VLAN.
Ще одною проблемою є розширення віртуальної мережі за межі фізичної мережі. Іноді користувач може орендувати сервери на кількох різних мережах дата-центру, і захотіти їх об’єднати. Він міг би вдатись до міжмережевого протоколу на рівні 3 (Internet Protocol), але це не враховує користувачів яким потрібні інші протоколи третього рівня, або прямий доступ до другого рівня.
Зі зростанням кількості віртуальних машин на фізичних серверах відповідно зростає кількість MAC-адрес присвоєних одному фізичному серверу. Це збільшує розмір таблиць маршрутизації у свічах. Якщо таблиця переповнюється - сервер перестає запам’ятовувати нові адреси, поки інформація про старі не застаріє і не буде видалена, що спричинить широкомовну трансляцію кадрів які призначені адресі яку свіч не знає, і падіння пропускної здатності мережі.
VXLAN також допомагає обійти деякі обмеження STP[джерело?].
Оверлейна мережа в Docker базується на основі технології VXLAN.[1]
VXLAN розбиває мережу на кілька сегментів (англ. VXLAN Segments). Кожен сегмент має ідентифікатор - VNI (англ. VXLAN Network Identifier), розміром 24 біт. Це дозволяє максимальну кількість сегментів приблизно 16 мільйонів. Між собою можуть з’єднуватись лише машини всередині одного сегменту.
Віртуальна машина на хості може не знати (і не повинна знати), що вона знаходиться в певному сегменті. Вона просто відправляє кадр Ethernet, і якщо на гіпервізорі хоста налаштований VTEP (англ. VXLAN Tunnel End Point) (сутність з якої починаються або в якій закінчуються тунелі VXLAN), то цей VTEP спершу перевірить якому сегменту відповідає MAC-адреса призначення, і звірить його з VNI для машини відправника. Якщо вони однакові - кадр можна відправляти. Якщо машина призначення знаходить на тому самому хості - гіпервізор передасть кадр машині зразу, якщо на якомусь іншому - загорне наш кадр в набір заголовків VXLAN і відправить VTEP-у віддаленого хоста. IANA призначила для протоколу VXLAN окремий номер порту UDP - 4789[2]
VXLAN може працювати наприклад на тому ж Ethernet, і дуже часто так і є. Тому він може містити два заголовки Ehternet, почнемо розглядати його з зовнішнього:
Зміщення (Offsets) | Октет | 0 | 1 | 2 | 3 | ||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Октет | Біти | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 |
0 | 0 | Зовнішня MAC-адреса призначення | |||||||||||||||||||||||||||||||
4 | 32 | Зовнішня MAC-адреса призначення | Зовнішня MAC-адреса відправника | ||||||||||||||||||||||||||||||
8 | 64 | Зовнішня MAC-адреса відправника | |||||||||||||||||||||||||||||||
12 | 96 | OptnlEthtype = C-Tag 802.1Q | VLAN Tag | ||||||||||||||||||||||||||||||
16 | 128 | Ethertype = 0x0800 (IPv4) |
Всередині кадру Ethernet міститься IPv4 пакет:
Зміщення (Offsets) | Октет | 0 | 1 | 2 | 3 | ||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Октет | Біти | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 |
0 | 0 | Версія | IHL | Тип сервісу | Загальна довжина | ||||||||||||||||||||||||||||
4 | 32 | Ідентифікація | Прапорці | Зміщення фрагментації | |||||||||||||||||||||||||||||
8 | 64 | TTL | Протокол=17 (UDP) | Контрольна сума заголовку | |||||||||||||||||||||||||||||
12 | 96 | Зовнішня IP-адреса призначення | |||||||||||||||||||||||||||||||
16 | 128 | Зовнішня IP-адреса відправника |
Який містить дейтаграму UDP:
Зміщення (Offsets) | Октет | 0 | 1 | 2 | 3 | ||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Октет | Біти | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 |
0 | 0 | Порт відправника | Порт призначення = порту VXLAN | ||||||||||||||||||||||||||||||
4 | 32 | Довжина UDP | Чексума UDP |
Всередині якої міститься заголовок VXLAN:
Зміщення (Offsets) | Октет | 0 | 1 | 2 | 3 | ||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Октет | Біти | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 |
0 | 0 | Р[3] | Р | Р | Р | I | Р | Р | Р | Зарезервовано | |||||||||||||||||||||||
4 | 32 | VNI | Зарезервовано |
Після якого йдуть заголовки внутрішнього кадру Ethernet, і нарешті вміст кадру:
Зміщення (Offsets) | Октет | 0 | 1 | 2 | 3 | ||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Октет | Біти | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 |
0 | 0 | Внутрішня MAC-адреса призначення | |||||||||||||||||||||||||||||||
4 | 32 | Внутрішня MAC-адреса призначення | Внутрішня MAC-адреса відправника | ||||||||||||||||||||||||||||||
8 | 64 | Внутрішня MAC-адреса відправника | |||||||||||||||||||||||||||||||
12 | 96 | OptnlEthtype = C-Tag 802.1Q | Внутрішній VLAN Tag | ||||||||||||||||||||||||||||||
16 | 128 | Ethertype вмісту що передається через VXLAN тунель | Вміст кадру | ||||||||||||||||||||||||||||||
20 | 160 | Вміст кадру (Зауважте що FCS оригінального кадру Ethernet не включаються) |
Зміщення (Offsets) | Октет | 0 | 1 | 2 | 3 | ||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Октет | Біти | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 |
0 | 0 | Нова FCS (Frame Check Sequence) для зовнішнього кадру Ethernet. |
Нехай віртуальна машина всередині VXLAN хоче поспілкуватись з іншою машиною, звернувшись до неї по IP. Якщо це IP в тій самій підмережі, то вона пошле широкомовний кадр ARP, щоб дізнатись фізичну адресу призначення. В середовищі без VXLAN, такий кадр було б послано з використанням широкомовної адреси FF:FF:FF:FF:FF:FF
, і був би переданий у всі порти свіча на який прийшов, або на всі порти свіча що належать тому самому VLAN, якщо свіч підтримує технологію VLAN.
У випадку з VXLAN, вміст кадру поміщається в VXLAN пакет, в полі якого встановлюється відповідне VNI, і вони загортаються в UDP та IP пакет. IP пакет відсилається IP мультикаст групі, яка пов’язана з даним VXLAN сегментом. Щоб це здійснити, потрібне відображення з VNI на потрібну IP мультикаст групу. Це відображення здійснюється на рівні керування мережею і надається кожному окремому VTEP через канал керування. Кожен VTEP може повідомляти свіч до якого він під’єднаний про приєднання чи вихід з мультикаст групи за допомогою IGMP.
Також для керування мультикаст деревами можуть використовуватись протоколи маршрутизації мультикаст повідомлень, на зразок Protocol Independent Multicast - Sparse-Mode PIM-SM (RFC 4601), або Bidirectional PIM (BIDIR-PIM, RFC 5015), так як VTEM може бути як відправником, так і приймачем широкомовних пакетів.
Мультикаст фрейми, і фрейми порт MAC-адреса призначення якої має невідомий порт також відсилаються через IP мультикаст.
- ↑ Poulton, Nigel (12 жовтня 2016). Demystifying Docker overlay networking. nigelpoulton.com. Архів оригіналу за 21 листопада 2018. Процитовано 21 листопада 2018. [Архівовано 2018-11-21 у Wayback Machine.]
- ↑ Service Name and Transport Protocol Port Number Registry. Архів оригіналу за 25 вересня 2020. Процитовано 24 квітня 2020.
- ↑ зарезервовано
- RFC 7348
- (англ.) VXLAN Series – How VTEP Learns and Creates Forwarding Table [Архівовано 12 жовтня 2015 у Wayback Machine.] VMware vSphere Blog
- (англ.) Five Functional Facts about VXLAN [Архівовано 22 жовтня 2016 у Wayback Machine.]
- (англ.) VXLAN Deep Dive [Архівовано 30 вересня 2015 у Wayback Machine.]
- (англ.) Fundamentals of VXLAN на YouTube
- (англ.) Application Centric Infrastructure / VxLAN на YouTube