Эксплуатация высоконагруженных шлюзов виртуальных частных сетей (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) создает критические проблемы для современного сетевого оборудования:

  1. Отказ аппаратного механизма Receive-Side Scaling (RSS): Сетевые адаптеры (NIC) используют аппаратные хеш-функции (алгоритм Теплица) для распределения входящих кадров по нескольким аппаратным очередям приема (RX queues), привязанным к разным ядрам CPU. При отсутствии портов L4 адаптер вычисляет хеш только по внешним IP-адресам источника и назначения. В итоге весь огромный поток туннеля обрабатывается единственным ядром процессора, вызывая перегрузку softirq и потерю пакетов, пока остальные ядра простаивают.
  2. Дисбаланс многопутевой маршрутизации ECMP: Коммутаторы фабрик Spine-Leaf и магистральные маршрутизаторы распределяют нагрузку методом Equal-Cost Multi-Path (ECMP) на основе 5 параметров (IP источника, IP назначения, протокол, порт источника, порт назначения). Не имея портов L4, промежуточные коммутаторы направляют весь трафик туннеля в один физический оптический канал, создавая заторы в сетевой фабрике.

Для устранения этих архитектурных барьеров в ядро Linux были внедрены механизмы Foo-over-UDP (FOU) и Generic UDP Encapsulation (GUE, стандарт IETF RFC 8150). Упаковывая сетевые протоколы в стандартные дейтаграммы UDP, Linux обеспечивает аппаратное ускорение, параллельную обработку на всех ядрах CPU и предсказуемую маршрутизацию.

+--------------------------------------------------------------------------+
|          СТРУКТУРА ПАКЕТОВ: СРАВНЕНИЕ IPIP, FOU И GUE (RFC 8150)         |
+--------------------------------------------------------------------------+
|                                                                          |
| 1. Классический IP-in-IP:                                                |
|    +-------------------+-----------------------------------------------+ |
|    | Внешний заголовок | Внутренний IP-пакет (Полезная нагрузка)       | |
|    | Протокол: 4 IPIP  | (Порты L4 отсутствуют для аппаратного RSS)    | |
|    +-------------------+-----------------------------------------------+ |
|                                                                          |
| 2. Foo-over-UDP (FOU - Прямая инкапсуляция UDP без накладных расходов):  |
|    +-------------------+-------------------+---------------------------+ |
|    | Внешний заголовок | Заголовок UDP (8 B| Внутренний IP-пакет       | |
|    | Протокол: 17 UDP  | Динамический порт | Протокол привязан к порту | |
|    +-------------------+-------------------+---------------------------+ |
|                                                                          |
| 3. Generic UDP Encapsulation (GUE - RFC 8150):                           |
|    +-------------------+-------------------+-------------+-------------+ |
|    | Внешний заголовок | Заголовок UDP (8 B| Заголовок   | Внутренний  | |
|    | Протокол: 17 UDP  | Динамический порт | GUE (4 B+)  | пакет IPv4/6| |
|    +-------------------+-------------------+-------------+-------------+ |
|                                                                          |
+--------------------------------------------------------------------------+

Принципы работы Foo-over-UDP (FOU)

Foo-over-UDP (FOU) осуществляет прямую упаковку протоколов Layer 3 в стандартную оболочку UDP без добавления промежуточных служебных байтов. Полезная нагрузка UDP начинается непосредственно с заголовка внутреннего пакета.

Динамическое вычисление порта источника UDP

Главным архитектурным преимуществом FOU является формирование внешнего порта источника (sport). При отправке пакета через туннель FOU ядро Linux вычисляет хеш по атрибутам внутреннего потока (IP-адреса источника и назначения, протокол и внутренние порты сессии).

Полученное хеш-значение проецируется в диапазон динамических портов (обычно 32768–60999) и назначается в качестве внешнего порта источника UDP:

  • Каждое клиентское TCP-соединение или поток данных внутри туннеля получает индивидуальный внешний порт 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] (Аппаратные очереди) |
|             │             │             │                                |
|             ▼             ▼             ▼                                |
|          Ядро CPU 0    Ядро CPU 1    Ядро CPU 2    (Контекст SoftIRQ)    |
|                                                                          |
|   Результат: Полное устранение перегрузки одного ядра процессора         |
|                                                                          |
+--------------------------------------------------------------------------+

Универсальная инкапсуляция GUE (RFC 8150)

Если FOU оптимален для статических соединений «точка-точка» с одним протоколом на порт, то мультисервисные оверлейные сети требуют передачи разнородных протоколов и метаданных управления. Эту задачу решает 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)

Настройка туннеля для передачи 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

При включенных флагах сегментация пакетов и расчет контрольных сумм выполняются на уровне чипа сетевой карты, освобождая ресурсы центрального процессора.

Архитектурные преимущества для инфраструктуры VPNRice

В глобальной сети VPNRice механизмы FOU и GUE применяются для междатацентрового транзита:

  1. Многоядерное масштабирование: Граничные концентраторы объединяют зашифрованный трафик пользователей в магистральные каналы. Инкапсуляция в UDP позволяет аппаратному механизму RSS распределять нагрузку по всем ядрам серверов, сохраняя пропускную способность свыше 40 Гбит/с на узел.
  2. Сбалансированная фабрика Spine-Leaf: В современных дата-центрах стойки объединены множеством параллельных линий 100GbE. Случайный выбор внешнего порта UDP позволяет алгоритмам ECMP равномерно заполнять все физические оптические линии без образования локальных заторов.
  3. Совместимость с промежуточными сетями: Традиционные протоколы без L4-портов (такие как чистый GRE) часто блокируются промежуточными экранами и шлюзами CGNAT. Оболочка UDP гарантирует надежную доставку трафика через сложные участки сети.

Рекомендации для производственных контуров

При развертывании FOU и GUE на промышленных серверах следует учитывать следующие правила:

  • Корректировка MTU: Инкапсуляция добавляет 8 байт заголовка UDP (для 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.