Підтримка високонавантажених шлюзів віртуальних приватних мереж (VPN) та фабрик оверлейних мереж у центрах обробки даних потребує високих показників обробки пакетів на секунду (PPS) на багатоядерних серверах. Із переходом мережевих магістралей на інтерфейси 40GbE та 100GbE класичні тунельні протоколи мережевого рівня (Layer 3) стикаються з апаратними обмеженнями сучасного обладнання.
Традиційні підходи до інкапсуляції—зокрема IP-in-IP (IPIP, протокол IP 4), IPv6-in-IPv4 (SIT, протокол IP 41) та Generic Routing Encapsulation (GRE, протокол IP 47)—вкладають внутрішній пакет безпосередньо у зовнішній IP-заголовок. Відсутність заголовка транспортного рівня Layer 4 (UDP або TCP) породжує дві суттєві перешкоди для мережевих адаптерів і комутаторів:
- Недієздатність механізму Receive-Side Scaling (RSS): Мережеві карти (NIC) застосовують апаратні алгоритми гешування (алгоритм Тепліца) для розподілу вхідних кадрів між кількома чергами прийому (RX queues), пов'язаними з різними процесорними ядрами. Без портів L4 адаптер гешує виключно зовнішні IP-адреси. Відтак увесь потік масивного тунелю скеровується лише в одну чергу та одне ядро CPU, перевантажуючи обробку переривань softirq і спричиняючи втрату пакетів, доки решта ядер сервера простоюють.
- Дисбаланс багатошляхової маршрутизації ECMP: Магістральні комутатори архітектури Spine-Leaf балансують потоки методом Equal-Cost Multi-Path (ECMP) на основі 5 параметрів (IP-адреси, протокол, порти джерела та призначення). Не виявивши портів L4, комутатори спрямовують весь трафік тунелю в одну лінію передачі, залишаючи інші паралельні лінії незадіяними.
Для розв'язання цих проблем у ядро Linux було інтегровано підсистеми Foo-over-UDP (FOU) та Generic UDP Encapsulation (GUE, стандарт IETF RFC 8150). Завдяки загортанню різноманітних мережевих протоколів у стандартні дейтаграми UDP ядро Linux розкриває потенціал апаратного прискорення, паралелізму обчислень та гнучкої маршрутизації.
+--------------------------------------------------------------------------+
| АНАТОМІЯ ПАКЕТА: ПОРІВНЯННЯ IPIP, FOU ТА GUE (RFC 8150) |
+--------------------------------------------------------------------------+
| |
| 1. Класичний IP-in-IP: |
| +-------------------+-----------------------------------------------+ |
| | Зовнішній IP | Внутрішній IP-пакет (Корисне навантаження) | |
| | Протокол: 4 (IPIP)| (Відсутній заголовок L4 для апаратного RSS) | |
| +-------------------+-----------------------------------------------+ |
| |
| 2. Foo-over-UDP (FOU - Пряма інкапсуляція UDP без зайвих байтів): |
| +-------------------+-------------------+---------------------------+ |
| | Зовнішній IP | Заголовок UDP (8 B| Внутрішній IP-пакет | |
| | Протокол: 17 UDP | Динамічний порт | Протокол прив'язаний до | |
| | | джерела | порту призначення | |
| +-------------------+-------------------+---------------------------+ |
| |
| 3. Generic UDP Encapsulation (GUE - RFC 8150): |
| +-------------------+-------------------+-------------+-------------+ |
| | Зовнішній IP | Заголовок UDP (8 B| Заголовок | Внутрішній | |
| | Протокол: 17 UDP | Динамічний порт | GUE (4 B+) | пакет | |
| +-------------------+-------------------+-------------+-------------+ |
| |
+--------------------------------------------------------------------------+
Принципи функціонування Foo-over-UDP (FOU)
Foo-over-UDP (FOU) реалізує пряме пакування протоколів мережевого рівня всередину дейтаграми UDP без додавання проміжних полів керування. Дані внутрішнього пакета розпочинаються відразу за 8-байтовим заголовком UDP.
Динамічне гешування порту джерела UDP
Головне інженерне рішення FOU полягає у визначенні зовнішнього порту джерела (sport). Під час відправлення пакета крізь тунель FOU ядро Linux обчислює геш на основі атрибутів внутрішнього потоку (IP-адреси, протокол і порти сесії).
Це значення транслюється в діапазон ефемерних портів (зазвичай 32768–60999) та призначається як зовнішній порт UDP:
- Кожне внутрішнє з'єднання TCP чи потік UDP отримує унікальний зовнішній порт UDP.
- Проміжні комутатори обчислюють геш ECMP за зовнішнім заголовком UDP і рівномірно завантажують усі фізичні канали магістралі.
- Мережевий адаптер шлюзу призначення зчитує зовнішні 5 параметрів та апаратно розподіляє кадри між чергами RX за алгоритмом RSS, задіюючи всі доступні ядра CPU.
+--------------------------------------------------------------------------+
| БАГАТОЯДЕРНИЙ РОЗПОДІЛ RSS ЗАВДЯКИ ДИНАМІЧНИМ ПОРТАМ FOU/GUE |
+--------------------------------------------------------------------------+
| |
| Сесії клієнтів усередині тунелю VPN: |
| - Сесія A: 10.0.0.2:443 -> 10.0.0.8:5201 (Геш A -> Порт: 41205) |
| - Сесія B: 10.0.0.3:80 -> 10.0.0.9:38192 (Геш B -> Порт: 53891) |
| - Сесія C: 10.0.0.4:53 -> 10.0.0.10:53 (Геш C -> Порт: 36712) |
| │ |
| v (Передавання через один спільний тунель) |
| Прийом на мережеву карту шлюзу призначення |
| │ |
| v [Апаратний геш Тепліца за 5 параметрами] |
| ┌─────────────┼─────────────┐ |
| ▼ ▼ ▼ |
| [Черга RX 0] [Черга RX 1] [Черга RX 2] (Апаратні черги NIC) |
| │ │ │ |
| ▼ ▼ ▼ |
| Ядро CPU 0 Ядро CPU 1 Ядро CPU 2 (Контекст SoftIRQ) |
| |
| Результат: Повна ліквідація перевантаження одного процесорного ядра |
| |
+--------------------------------------------------------------------------+
Універсальна інкапсуляція GUE (RFC 8150)
Для простих з'єднань «точка-точка» FOU забезпечує максимальну продуктивність. Проте складні мультисервісні мережі VPN потребують підтримки передавання різних протоколів крізь один порт та передачі службових метаданих. Цю задачу вирішує протокол Generic UDP Encapsulation (GUE, RFC 8150).
GUE вставляє компактний заголовок розміром 4 байти безпосередньо після заголовка UDP:
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|Ver|C| Hlen | Proto/Ptype | Flags |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Додаткові поля розширення |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
Призначення полів заголовка GUE:
- Версія (
Ver, 2 біти): Значення00bзгідно зі стандартом RFC 8150. - Керування (
C, 1 біт): Відокремлює службові діагностичні кадри (C=1) від користувацьких пакетів (C=0). - Довжина заголовка (
Hlen, 5 бітів): Вказує розмір додаткових полів у 32-бітних словах. - Тип протоколу (
Proto/Ptype, 8 бітів): Ідентифікує вкладений протокол (4для IPv4,41для IPv6,47для GRE). - Прапорці розширень (16 бітів): Забезпечують винесення контрольних сум (Remote Checksum Offload), передачу ідентифікаторів віртуальних мереж (VNI) та телеметрію.
Порівняльна таблиця: FOU проти GUE
+--------------------------------------------------------------------------+
| ПОРІВНЯННЯ ТЕХНОЛОГІЙ: FOU ТА GUE (RFC 8150) |
+--------------------------------------------------------------------------+
| Характеристика | Foo-over-UDP (FOU) | GUE (RFC 8150) |
+-------------------------+------------------------+-----------------------+
| Додатковий заголовок | Рівно 8 байтів (UDP) | 12+ байтів (UDP + GUE)|
| Мультиплексування порту | 1 протокол на порт | Кілька протоколів |
| Підтримувані пакети | IPv4, IPv6, GRE | IPv4, IPv6, GRE, Eth |
| Службові повідомлення | Не підтримуються | Вбудовані кадри OAM |
| Контрольні суми | Стандартний UDP CRC | Remote Checksum (RCO) |
| Складність конфігурації | Мінімальна | Висока гнучкість |
| Основне призначення | Швидкісний магістральний| Мультитенантний |
| | транзит | оверлей |
+--------------------------------------------------------------------------+
Практичне налаштування у середовищі Linux
Підтримку FOU та GUE вбудовано в офіційне ядро Linux за допомогою модуля CONFIG_NET_FOU.
Крок 1: Завантаження модулів ядра
Перевірте наявність та активуйте потрібні модулі:
modprobe fou
modprobe ipip
modprobe ip_gre
Крок 2: Створення тунелю Foo-over-UDP (FOU)
Створення інтерфейсу FOU для обробки трафіку IPv4 на порту UDP 5555:
# Реєстрація порту FOU для обробки IPv4 (ipproto 4)
ip fou add port 5555 ipproto 4
# Створення інкапсульованого тунельного інтерфейсу
ip link add name fou0 type ipip \
remote 198.51.100.2 local 198.51.100.1 \
ttl 64 \
encap fou \
encap-sport auto \
encap-dport 5555 \
encap-csum
# Призначення адреси та запуск
ip addr add 10.200.1.1/30 dev fou0
ip link set dev fou0 up
Параметр encap-sport auto вмикає динамічне генерування портів на основі гешу сесії, що забезпечує коректну роботу RSS на стороні отримувача.
Крок 3: Створення тунелю Generic UDP Encapsulation (GUE)
Налаштування інтерфейсу GUE для роботи на порту 6666:
# Реєстрація приймача протоколу GUE
ip fou add port 6666 gue
# Створення інтерфейсу GRE з інкапсуляцією GUE
ip link add name gue0 type gre \
remote 198.51.100.2 local 198.51.100.1 \
ttl 64 \
encap gue \
encap-sport auto \
encap-dport 6666 \
encap-csum
# Активація з'єднання
ip addr add 10.200.2.1/30 dev gue0
ip link set dev gue0 up
Крок 4: Перевірка апаратного прискорення мережевої карти
Перевірте підтримку апаратного розвантаження сегментації UDP:
ethtool -k eth0 | grep -E "tx-udp_tnl|rx-udp_tunnel"
Очікувані показники:
tx-udp_tnl-segmentation: on
tx-udp_tnl-csum-segmentation: on
rx-udp_tunnel-port-offload: on
Якщо зазначені прапорці активні, сегментація пакетів та розрахунок контрольних сум виконуються апаратно на чипі мережевої карти, розвантажуючи процесор.
Архітектурна синергія з мережею RiceGuard та VPNRice
У глобальній інфраструктурі VPNRice протоколи FOU та GUE вирішують ключові завдання транзитного обміну даними:
- Масштабування між усіма ядрами CPU: Периферійні сервери консолідують трафік користувачів у магістральні канали. Завдяки інкапсуляції в UDP апаратний механізм RSS рівномірно завантажує процесорні ядра, забезпечуючи понад 40 Гбіт/с на вузол без блокування черг.
- Ефективне використання каналів Spine-Leaf: У сучасних ЦОД стійки з'єднані численними паралельними лініями 100GbE. Динамічний вибір портів дозволяє маршрутизаторам ECMP розподіляти пакети всіма фізичними лініями, запобігаючи виникненню локальних перевантажень.
- Надійна доставка крізь проміжні вузли: Традиційні протоколи без портів L4 (як чистий GRE) часто блокуються транзитними провайдерами або обладнанням CGNAT. Інкапсуляція в пакети UDP гарантує стабільне проходження будь-яких ділянок мережі.
Практичні рекомендації для робочих систем
Під час експлуатації FOU та GUE на серверах важливо враховувати такі параметри:
- Узгодження розміру MTU: Інкапсуляція додає 8 байтів (FOU) або 12 байтів (GUE), а також зовнішній заголовок IP (20 байтів для IPv4, 40 байтів для IPv6). Рекомендовано знизити MTU тунельного інтерфейсу до 1420–1440 байтів або застосувати обмеження MSS (
TCPMSS --clamp-mss-to-pmtu). - Контрольні суми в IPv6: Стандарт IPv6 вимагає обов'язкової наявності валідної контрольної суми UDP (RFC 8200). Під час роботи через IPv6 завжди вказуйте параметр
encap-csumдля запобігання втраті пакетів. - Збереження конфігурації після перезавантаження: Налаштування
ip fou addне зберігаються автоматично після перезапуску ОС. Їх слід зафіксувати у конфігураціях мережевого демона (systemd-networkd) або у системних сценаріях автозапуску.
Використання FOU та GUE разом із апаратним RSS надає серверам Linux властивості спеціалізованих маршрутизаторів зв'язку, створюючи надійний фундамент для швидких оверлейних мереж VPN.



