VXLAN
VXLAN (Virtual Extensible LAN, RFC 7348) — инкапсуляция Ethernet-фреймов в UDP. Позволяет строить L2-сегменты поверх L3-инфраструктуры и иметь 16 миллионов VLAN'ов вместо 4094. Стандарт для облачных ДЦ, Kubernetes CNI (Flannel, Weave, Calico), OpenStack, VMware NSX.
Формат
┌────────────┐
│ Outer L2 │ ← Ethernet между VTEP'ами
├────────────┤
│ Outer IP │
├────────────┤
│ Outer UDP │ ← dst port 4789
├────────────┤
│ VXLAN hdr │ ← 8 байт, VNI 24 бита
├────────────┤
│ Inner L2 │ ← оригинальный Ethernet-фрейм
│ Inner IP │ (для гостей / контейнеров)
│ payload │
└────────────┘
VXLAN header
| Поле | Байт | Значение |
|---|---|---|
| Flags | 1 | Обычно 0x08 — I-flag установлен (VNI валиден) |
| Reserved | 3 | 0 |
| VNI (VXLAN Network Identifier) | 3 | 24 бита, 0-16777215. Аналог VLAN ID |
| Reserved | 1 | 0 |
VTEP
VTEP (VXLAN Tunnel Endpoint) — точка инкапсуляции. Это может быть:
- Гипервизор (KVM, VMware ESXi) — оборачивает трафик виртуалок.
- Свитч с VXLAN-поддержкой (Cisco Nexus, Arista) — hardware VTEP.
- Kubernetes node — Linux с vxlan interface.
Как передаётся broadcast
Проблема: VXLAN — точка-точка, но L2 требует broadcast (ARP, DHCP). Три подхода:
- Multicast. Каждый VNI мапится на IP-multicast группу. VTEP'ы шлют broadcast в multicast, все получают. Красиво, но требует multicast-routing.
- Unicast head-end replication. VTEP-отправитель сам делает копии для всех известных VTEP'ов и шлёт unicast'ом. Проще, но плохо масштабируется.
- EVPN control plane. BGP-EVPN распространяет MAC-address learning явно, broadcast почти не нужен. Промышленный стандарт для ДЦ.
Linux VXLAN пример
# На node A (10.0.0.1)
ip link add vxlan10 type vxlan \
id 100 \
dstport 4789 \
remote 10.0.0.2 \
dev eth0
ip addr add 192.168.100.1/24 dev vxlan10
ip link set vxlan10 up
# На node B (10.0.0.2)
ip link add vxlan10 type vxlan \
id 100 dstport 4789 \
remote 10.0.0.1 \
dev eth0
ip addr add 192.168.100.2/24 dev vxlan10
ip link set vxlan10 up
# Теперь пинг между 192.168.100.1 и 192.168.100.2 идёт через VXLAN
node-a$ ping 192.168.100.2
Multicast режим
ip link add vxlan10 type vxlan \
id 100 \
group 239.1.1.1 \
dstport 4789 \
dev eth0
Все VTEP'ы с тем же VNI подписываются на 239.1.1.1 (IGMP), получают broadcast'ы друг друга.
Проблемы
- Overhead. +50 байт (14 Ethernet + 20 IP + 8 UDP + 8 VXLAN). MTU inner = 1450 если outer 1500. Решение — jumbo frames 9000.
- Отсутствие шифрования. VXLAN сам не шифрует. В облаках — IPsec или MACsec сверху.
- MTU discovery. Не всегда работает через инкапсуляцию — проблемы с фрагментацией (PMTUD может ломаться).
Аналоги
| VXLAN | GENEVE | NVGRE | GRE | |
|---|---|---|---|---|
| Транспорт | UDP:4789 | UDP:6081 | GRE (IP proto 47) | GRE |
| Segment ID | 24 бита | 24 бита | 24 бита | 32 бита (Key) |
| Расширяемость | Нет | Опции TLV | Нет | — |
| Продвигают | VMware, Cisco | Red Hat, Intel | Microsoft | Cisco (старый) |
| Kubernetes CNI | Flannel, Weave | OVN, OVS | Hyper-V | — |
EVPN — control plane для VXLAN
BGP-EVPN (RFC 8365) распространяет MAC/IP-адреса через BGP. Каждый VTEP объявляет «за мной эти MAC'и». Другие VTEP'ы обновляют forwarding-таблицы без broadcast learning. Стандарт де-факто для новых ДЦ.