L'exploitation de passerelles de réseau privé virtuel (VPN) et de maillages de transit en centre de données exige des capacités de traitement par paquet (PPS) élevées sur les serveurs multicœurs modernes. Face à la généralisation des liaisons physiques à 40GbE et 100GbE, les protocoles d'encapsulation de niveau 3 (Layer 3) historiques révèlent des limitations matérielles strictes.

Les technologies traditionnelles—telles qu'IP-in-IP (IPIP, protocole IP 4), IPv6-in-IPv4 (SIT, protocole IP 41) et Generic Routing Encapsulation (GRE, protocole IP 47)—encapsulent directement le paquet de données au sein d'un en-tête IP externe. Bien que simples à implémenter, l'absence d'en-tête de transport de niveau 4 (UDP ou TCP) engendre deux pénalités matérielles majeures :

  1. Incompatibilité avec le mécanisme Receive-Side Scaling (RSS) : Les cartes réseau (NIC) s'appuient sur des moteurs de hachage matériel (algorithme Toeplitz) pour répartir les paquets entrants entre plusieurs files d'attente de réception (RX queues) reliées aux cœurs CPU. En l'absence de ports de transport L4, la carte calcule son empreinte uniquement sur les adresses IP source et destination externes. L'intégralité du trafic d'un tunnel massif se retrouve alors traitée par un seul cœur de processeur, provoquant la saturation des interruptions logicielles (softirq) et des pertes de paquets tandis que les autres cœurs restent inactifs.
  2. Déséquilibre de routage sur les matrices ECMP : Les commutateurs de dorsale (Spine-Leaf) équilibrent la charge réseau via le protocole Equal-Cost Multi-Path (ECMP) en calculant un hachage sur 5 paramètres (adresses IP, protocole, ports source et destination). Sans ports L4 externes, les commutateurs assignent l'ensemble du flux du tunnel à une unique liaison physique, sous-utilisant la bande passante globale.

Afin de lever cette contrainte, le noyau Linux intègre les technologies Foo-over-UDP (FOU) et Generic UDP Encapsulation (GUE, standardisée dans l'IETF RFC 8150). En encapsulant les protocoles réseau dans des datagrammes UDP standards, Linux permet la pleine exploitation du matériel, la distribution multicœur et un routage dynamique optimal.

+--------------------------------------------------------------------------+
|          STRUCTURE DES PAQUETS : COMPARAISON IPIP, FOU ET GUE            |
+--------------------------------------------------------------------------+
|                                                                          |
| 1. IP-in-IP traditionnel :                                               |
|    +-------------------+-----------------------------------------------+ |
|    | En-tête IP externe| Paquet IP interne (Données utiles)            | |
|    | Protocole : 4 IPIP| (Aucun port L4 visible pour le RSS matériel)  | |
|    +-------------------+-----------------------------------------------+ |
|                                                                          |
| 2. Foo-over-UDP (FOU - Encapsulation directe sans surcoût d'en-tête) :   |
|    +-------------------+-------------------+---------------------------+ |
|    | En-tête IP externe| En-tête UDP (8 o) | Paquet IP interne         | |
|    | Protocole : 17 UDP| Port source dyn.  | Protocole lié au port     | |
|    +-------------------+-------------------+---------------------------+ |
|                                                                          |
| 3. Generic UDP Encapsulation (GUE - Spécification RFC 8150) :            |
|    +-------------------+-------------------+-------------+-------------+ |
|    | En-tête IP externe| En-tête UDP (8 o) | En-tête GUE | Paquet utile| |
|    | Protocole : 17 UDP| Port source dyn.  | 4 octets (+) | IPv4/v6/Eth | |
|    +-------------------+-------------------+-------------+-------------+ |
|                                                                          |
+--------------------------------------------------------------------------+

Foo-over-UDP (FOU) : Encapsulation UDP directe

Foo-over-UDP (FOU) assure l'encapsulation directe des protocoles de couche réseau au sein d'une trame UDP standard, sans intercaler d'en-tête de protocole intermédiaire. La charge utile UDP débute immédiatement au niveau de l'en-tête IP interne.

Le mécanisme de port source dynamique

L'innovation architecturale de FOU réside dans la gestion du port source UDP externe (sport). Lors de l'émission d'un paquet à travers un tunnel FOU, le noyau Linux calcule une empreinte de hachage sur les paramètres du flux interne (adresses IP et ports de session internes).

Cette valeur est ensuite projetée dans la plage des ports éphémères (habituellement 32768–60999) pour définir le port source UDP externe :

  • Chaque connexion TCP ou flux UDP client circulant dans le tunnel hérite d'un port source UDP externe distinct.
  • Les commutateurs réseau et routeurs intermédiaires calculent leur empreinte ECMP sur l'en-tête UDP externe, distribuant équitablement le trafic sur l'ensemble des liaisons physiques.
  • La carte réseau de la passerelle de réception analyse le 5-uplet externe et répartit les paquets sur toutes les files RX matérielles par RSS, parallélisant le traitement sur les cœurs CPU.
+--------------------------------------------------------------------------+
|         RÉPARTITION RSS MULTICŒUR VIA LES PORTS DYNAMIQUES FOU/GUE       |
+--------------------------------------------------------------------------+
|                                                                          |
|   Flux clients au sein du tunnel VPN :                                   |
|   - Flux A: 10.0.0.2:443 -> 10.0.0.8:5201  (Hachage A -> Port: 41205)    |
|   - Flux B: 10.0.0.3:80  -> 10.0.0.9:38192 (Hachage B -> Port: 53891)    |
|   - Flux C: 10.0.0.4:53  -> 10.0.0.10:53   (Hachage C -> Port: 36712)    |
|                           │                                              |
|                           v (Transmis dans un unique tunnel physique)    |
|   Entrée sur la carte réseau de la passerelle réceptrice                 |
|                           │                                              |
|                           v [Hachage matériel Toeplitz sur 5 paramètres] |
|             ┌─────────────┼─────────────┐                                |
|             ▼             ▼             ▼                                |
|        [File RX 0]   [File RX 1]   [File RX 2]   (Files matérielles NIC) |
|             │             │             │                                |
|             ▼             ▼             ▼                                |
|          Cœur CPU 0    Cœur CPU 1    Cœur CPU 2  (Traitement SoftIRQ)   |
|                                                                          |
|   Résultat : Charge parfaitement équilibrée entre les processeurs        |
|                                                                          |
+--------------------------------------------------------------------------+

Generic UDP Encapsulation (GUE - RFC 8150)

Si FOU se révèle optimal pour les liaisons point-à-point statiques dédiées à un protocole unique par port, les infrastructures VPN multi-services nécessitent le transport de plusieurs protocoles et de métadonnées de contrôle. Le standard Generic UDP Encapsulation (GUE, RFC 8150) répond à ces exigences.

GUE intercale un en-tête compact de 4 octets immédiatement après l'en-tête 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              |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                 Champs d'extension optionnels                 |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

Les champs essentiels de l'en-tête GUE comprennent :

  • Version (Ver, 2 bits) : Fixée à 00b selon la norme RFC 8150.
  • Contrôle (C, 1 bit) : Distingue les paquets de données (C=0) des messages de contrôle opérationnel (C=1).
  • Longueur d'en-tête (Hlen, 5 bits) : Indique la taille des extensions optionnelles en mots de 32 bits.
  • Protocole encapsulé (Proto/Ptype, 8 bits) : Identifie le protocole interne (4 pour IPv4, 41 pour IPv6, 47 pour GRE).
  • Indicateurs et extensions (16 bits) : Prise en charge du déport de calcul de somme de contrôle (Remote Checksum Offload), des identifiants de réseau virtuel (VNI) et de la télémétrie.

Comparatif technique : FOU versus GUE

+--------------------------------------------------------------------------+
|                 COMPARAISON TECHNIQUE : FOU ET GUE (RFC 8150)            |
+--------------------------------------------------------------------------+
| Paramètre               | Foo-over-UDP (FOU)     | GUE (RFC 8150)        |
+-------------------------+------------------------+-----------------------+
| Surcoût d'en-tête       | Exactement 8 octets    | 12+ octets (UDP + GUE)|
| Multiplexage de port    | 1 protocole par port   | Multiprotocole actif  |
| Protocoles supportés    | IPv4, IPv6, GRE        | IPv4, IPv6, GRE, Eth  |
| Trames de signalisation | Non supporté           | Trames de contrôle OAM|
| Gestion des sommes CRC  | Checksum UDP classique | Déport distant (RCO)  |
| Complexité logicielle   | Très faible            | Grande flexibilité    |
| Usage de prédilection   | Transit statique direct| Réseau maillé avancé  |
+--------------------------------------------------------------------------+

Déploiement pratique sous Linux

Les technologies FOU et GUE sont intégrées nativement dans le noyau Linux au travers du module CONFIG_NET_FOU.

Étape 1 : Chargement des modules du noyau

Assurez-vous que les modules requis sont actifs :

modprobe fou
modprobe ipip
modprobe ip_gre

Étape 2 : Configuration d'un tunnel Foo-over-UDP (FOU)

Déploiement d'un tunnel FOU acheminant du trafic IPv4 sur le port UDP 5555 :

# Déclaration du port d'écoute FOU pour IPv4 (ipproto 4)
ip fou add port 5555 ipproto 4

# Création de l'interface réseau encapsulée
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

# Attribution de l'adresse et activation
ip addr add 10.200.1.1/30 dev fou0
ip link set dev fou0 up

L'option encap-sport auto instruit le noyau de générer les ports sources de manière dynamique pour garantir la distribution RSS chez l'hôte récepteur.

Étape 3 : Configuration d'un tunnel Generic UDP Encapsulation (GUE)

Mise en place d'un tunnel multiprotocole GUE sur le port 6666 :

# Déclaration du récepteur GUE
ip fou add port 6666 gue

# Création de l'interface GRE encapsulée en 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

# Activation du lien
ip addr add 10.200.2.1/30 dev gue0
ip link set dev gue0 up

Étape 4 : Vérification de l'accélération matérielle

Contrôlez la prise en charge du délestage d'encapsulation UDP par la carte réseau physique :

ethtool -k eth0 | grep -E "tx-udp_tnl|rx-udp_tunnel"

Résultat attendu :

tx-udp_tnl-segmentation: on
tx-udp_tnl-csum-segmentation: on
rx-udp_tunnel-port-offload: on

Lorsque ces options sont actives, la segmentation des paquets et le calcul des sommes de contrôle sont réalisés directement sur la puce de la carte réseau, allégeant la charge du processeur central.

Intégration au sein de l'architecture RiceGuard et VPNRice

Dans l'infrastructure globale de VPNRice, FOU et GUE constituent des composants clés de transit inter-centres de données :

  1. Montée en charge multicœur : Les nœuds périphériques concentrent le trafic chiffré des utilisateurs. Grâce à l'encapsulation UDP, le matériel répartit les flux sur tous les cœurs disponibles via le RSS, soutenant des débits supérieurs à 40 Gbit/s par serveur sans goulot d'étranglement.
  2. Exploitation optimale des matrices Spine-Leaf : La diversité des ports sources permet aux algorithmes ECMP d'exploiter uniformément l'ensemble des câbles optiques 100GbE, prévenant les encombrements localisés.
  3. Facilité de transit sur les réseaux tiers : Les paquets bruts de niveau 3 (tels que GRE sans port L4) sont souvent filtrés ou bridés par les équipements intermédiaires et passerelles CGNAT. L'encapsulation en paquets UDP assure une traversée fluide des réseaux de transit.

Bonnes pratiques pour les environnements de production

Lors du déploiement de FOU et GUE, veillez au respect des critères suivants :

  • Ajustement du MTU : L'encapsulation ajoute 8 octets (FOU) ou 12 octets (GUE), auxquels s'ajoutent les en-têtes IP externes (20 octets en IPv4, 40 octets en IPv6). Configurez le MTU du tunnel aux alentours de 1420 à 1440 octets ou activez l'ajustement automatique du MSS (TCPMSS --clamp-mss-to-pmtu).
  • Somme de contrôle sous IPv6 : La norme IPv6 impose des sommes de contrôle UDP valides (RFC 8200). Activez systématiquement encap-csum lors de l'exécution sur un réseau sous-jacent IPv6 pour prévenir les rejets silencieux de paquets.
  • Persistance logicielle : Les commandes ip fou add ne persistent pas après redémarrage. Inscrivez les paramètres dans la configuration réseau du système (systemd-networkd) ou dans des scripts de démarrage automatisés.

L'association de FOU, GUE et du hachage RSS matériel confère aux serveurs Linux une robustesse digne d'équipements de télécommunication spécialisés, offrant un socle solide aux réseaux VPN modernes.