XDP / eBPF

SYN flood : comprendre et mitiger l'attaque avec XDP en 2026

20 septembre 2026 · 10 min de lecture
Illustration immersive du sujet : SYN flood XDP

Un SYN flood XDP constitue l'une des attaques par déni de service (DDoS) les plus répandues et les plus dévastatrices pour les serveurs Linux exposés sur Internet. En 2026, alors que les capacités de génération de trafic malveillant ont explosé avec la banalisation des botnets IoT et la disponibilité de services DDoS-as-a-Service à bas coût, la détection et le blocage au niveau kernel deviennent une nécessité pour tout hébergeur ou administrateur système soucieux de garantir la disponibilité de ses services. Cet article détaille le fonctionnement technique du SYN flood, les vulnérabilités exploitées au niveau TCP, et la façon dont XDP (eXpress Data Path) couplé à eBPF et nftables permet de stopper ces attaques avant même qu'elles n'atteignent la pile réseau du noyau.



Anatomie d'un SYN flood : pourquoi la pile TCP classique est vulnérable

Le protocole TCP repose sur un mécanisme de three-way handshake pour établir une connexion : le client envoie un paquet SYN, le serveur répond par un SYN-ACK et attend un ACK final. Durant cet intervalle, le serveur alloue des ressources (socket semi-ouvert, entrée dans la backlog queue de conntrack) pour cette connexion en cours. Un SYN flood exploite précisément cette phase : l'attaquant envoie des milliers, voire des millions de paquets SYN par seconde avec des adresses IP sources forgées ou réparties (spoofing, botnet), sans jamais renvoyer l'ACK final. Le serveur se retrouve avec une table de connexions saturée, épuisant la mémoire allouée aux sockets en attente et empêchant les clients légitimes d'établir de nouvelles connexions.

Les conséquences sont immédiates :

  • Saturation de la backlog queue : lorsque la queue atteint sa limite (définie par net.ipv4.tcp_max_syn_backlog), le noyau commence à ignorer les nouveaux SYN légitimes.
  • Épuisement des sockets : chaque connexion semi-ouverte consomme de la mémoire kernel. Sur un serveur non protégé, un flood de 500 000 pps peut saturer la RAM dédiée aux connexions en quelques secondes.
  • Overhead CPU : même avec SYN cookies activés (net.ipv4.tcp_syncookies = 1), le traitement de chaque paquet SYN dans la pile réseau consomme des cycles processeur et de la bande passante de réponse (génération de SYN-ACK).

Les mécanismes de défense traditionnels au niveau userspace (fail2ban, iptables avec --connlimit ou recent) interviennent trop tard dans la chaîne de traitement : le paquet a déjà traversé le driver réseau, la couche netfilter PREROUTING, et parfois même conntrack. En situation de flood massif (> 1 Mpps), ces outils alourdissent encore davantage la charge CPU et deviennent contre-productifs.



XDP et eBPF : intercepter et bloquer les SYN flood au plus près du hardware

XDP (eXpress Data Path) est un hook kernel introduit dans Linux 4.8 qui permet d'exécuter du code eBPF directement au niveau du driver réseau, avant même l'allocation d'un sk_buff (structure kernel représentant un paquet réseau). Cette approche offre plusieurs avantages décisifs pour contrer un SYN flood XDP :

  • Latence sub-microseconde : le programme XDP examine chaque paquet en quelques nanosecondes et décide immédiatement de l'action (XDP_DROP, XDP_PASS, XDP_TX, XDP_REDIRECT) sans attendre la pile réseau complète.
  • Stateless par design : XDP ne maintient pas d'état de connexion ; il inspecte uniquement les headers du paquet (Ethernet, IP, TCP/UDP) et consulte des BPF maps (hash tables kernel) pour appliquer des règles. Cette absence de conntrack réduit drastiquement la consommation mémoire et le coût CPU.
  • Scalabilité linéaire : grâce au support du RSS (Receive Side Scaling), chaque cœur CPU traite sa propre file de réception. Un serveur 8 cœurs peut filtrer plusieurs millions de paquets par seconde avec un impact CPU global inférieur à 5 % en charge nominale.

Exemple de règle XDP anti-SYN flood

Un programme XDP typique pour bloquer un flood de SYN sur un port spécifique (par exemple, un serveur Minecraft en 25565/TCP) inspecte les flags TCP et drop immédiatement les paquets SYN au-delà d'un seuil de pps. Voici un extrait de pseudo-code eBPF simplifié :

struct pakkt_rule {
    __u16 port;
    __u8 rule_type;    // 0 = block, 1 = rate_limit, 2 = allow_only
    __u32 max_pps;
    __u32 max_port_pps;
};

SEC("xdp")
int pakkt_engine(struct xdp_md *ctx) {
    void *data = (void *)(long)ctx->data;
    void *data_end = (void *)(long)ctx->data_end;
    struct ethhdr *eth = data;
    struct iphdr *ip = data + sizeof(*eth);
    struct tcphdr *tcp = (void *)ip + sizeof(*ip);

    if ((void *)(tcp + 1) > data_end)
        return XDP_PASS;

    __u16 dport = bpf_ntohs(tcp->dest);
    struct pakkt_rule *rule = bpf_map_lookup_elem(&pakkt_rules, &dport);

    if (rule && (tcp->syn && !tcp->ack)) {
        __u64 now = bpf_ktime_get_ns();
        // Vérification rate-limit via BPF map timestamp + compteur
        if (check_rate_limit(rule, now) == RATE_EXCEEDED)
            return XDP_DROP;
    }

    return XDP_PASS;
}

Ce type de logique, déployé via PAKKT.io, permet de filtrer les paquets SYN à la source tout en autorisant les connexions légitimes. Le moteur XDP de PAKKT supporte jusqu'à 256 règles simultanées par interface, pilotées dynamiquement depuis le panel centralisé sans redémarrage du programme eBPF.

Complémentarité avec nftables stateful

XDP est stateless par nature : il ne suit pas l'état des connexions TCP. Pour une protection complète, il est indispensable de coupler XDP avec un firewall nftables stateful en aval. Le module conntrack de nftables permet de tracker les états de connexion (NEW, ESTABLISHED, RELATED) et d'appliquer des règles plus fines, par exemple :

nft add rule inet pakkt input tcp dport 25565 ct state new limit rate 50/second accept
nft add rule inet pakkt input tcp dport 25565 tcp flags syn ct state new limit rate 30/second accept

Cette double couche (XDP drop en amont pour les floods massifs, nftables en aval pour les floods plus ciblés ou les anomalies de flags TCP) garantit une défense en profondeur sans conflit avec d'autres outils (Docker, fail2ban, iptables-persistent) grâce à l'utilisation d'une table isolée inet pakkt.



Métriques et monitoring : détecter et réagir en temps réel

Un SYN flood évolue rapidement : un botnet peut passer de 10 000 pps à 2 Mpps en quelques secondes. Pour ajuster les règles XDP et nftables de manière proactive, un monitoring précis des métriques est indispensable. Les données clés à surveiller incluent :

Métrique Signification Seuil d'alerte typique
SYN pps par port Nombre de paquets SYN reçus par seconde sur un port donné > 1000 pps pour un service moyen, > 10 000 pps pour un serveur haute disponibilité
Ratio SYN/SYN-ACK Si le serveur envoie 10x plus de SYN-ACK que de SYN reçus légitimes, il y a flood Ratio > 5:1
Drops XDP Nombre de paquets droppés par le programme eBPF Si > 10 % du trafic total, investiguer les sources
Latence conntrack Temps moyen de traitement d'une nouvelle connexion dans nftables > 1 ms en charge normale → saturation probable

Le panel PAKKT centralise ces métriques en temps réel (TimescaleDB pour les séries temporelles, GeoIP pour la localisation des attaquants) et permet de visualiser sur une carte monde les IPs sources du flood. En combinant ces données avec les logs internes de l'agent (heartbeat toutes les 30 secondes, audit log des modifications de règles), l'administrateur peut identifier les pics anormaux, blacklister automatiquement les ASN malveillants, et ajuster les seuils de rate-limit sans intervenir manuellement sur chaque serveur.

Intégration avec des panels de gestion (Pterodactyl, API publique)

Pour les hébergeurs de serveurs de jeu (Minecraft, FiveM, Rust), il est crucial que la protection XDP/nftables ne perturbe pas les workflows existants. PAKKT propose une intégration native avec Pterodactyl v1.x, permettant de créer automatiquement des règles XDP par allocation de serveur (un port = une règle). L'API publique (authentification par clé API) autorise également des scripts de provisionning automatisés, par exemple pour whitelister les IPs d'administrateurs ou ajuster les rate-limits lors d'événements à fort trafic. Ces intégrations garantissent que la défense kernel reste transparente pour les utilisateurs finaux tout en offrant une granularité de contrôle maximale.



Cas pratique : mitiger un SYN flood de 800 000 pps sur un serveur Minecraft

Prenons un scénario réaliste : un serveur Minecraft hébergé sur un dédié OVH avec une interface 1 Gbps, noyau Linux 6.1, reçoit un flood de 800 000 SYN/s ciblant le port 25565. Avant la mise en place de XDP, le serveur subit une saturation complète : backlog queue à 100 %, CPU à 95 % sur tous les cœurs, mémoire conntrack épuisée, clients légitimes incapables de se connecter.

Configuration XDP avec PAKKT

  1. Installation de l'agent PAKKT (mTLS, self-update SHA256, impact < 1 % CPU / < 5 MB RAM) :
curl -sSL https://pakkt.io/install.sh | bash
pakkt-agent --token=VOTRE_TOKEN
  1. Création d'une règle XDP via le panel PAKKT :
  • Port : 25565
  • Protocole : TCP
  • rule_type : rate_limit
  • max_port_pps : 5000 (seuil ajusté selon la capacité du serveur)
  • min_packet_size : 40 octets (un SYN pur fait 40-60 octets ; les paquets < 40 sont suspects)
  1. Ajout d'une règle nftables stateful complémentaire :
nft add rule inet pakkt input tcp dport 25565 tcp flags syn ct state new limit rate 100/second burst 200 packets accept
nft add rule inet pakkt input tcp dport 25565 ct state established,related accept
nft add rule inet pakkt input tcp dport 25565 drop
  1. Blacklist automatique des top ASN attaquants (via GeoIP PAKKT) : le panel détecte 85 % du trafic provenant de 3 ASN en Chine et Russie → ajout en masse à la BPF map pakkt_blacklist synchronisée avec nftables.

Résultat post-mitigation

Après 2 minutes de stabilisation, les métriques affichent :

  • Drops XDP : 795 000 pps (99,4 % du flood éliminé avant la pile réseau)
  • SYN pps acceptés : 4 800 pps (trafic légitime restauré)
  • CPU : 12 % en moyenne (l'essentiel du traitement est dans XDP, pas dans conntrack)
  • Latence ajoutée : < 50 µs par paquet pour les clients légitimes
  • Disponibilité : 100 % des joueurs peuvent se connecter normalement

Cette configuration reste en place de manière permanente, avec des ajustements automatiques via le marketplace de templates PAKKT (règles XDP/nft partagées par la communauté pour Minecraft, FiveM, ARK, etc.).



SYN flood XDP en 2026 : bonnes pratiques et limites

Bien que XDP et eBPF offrent une défense redoutable contre les SYN floods, quelques limites et bonnes pratiques doivent être respectées :

  • XDP stateless : il ne peut pas distinguer un client légitime d'un attaquant si le flood imite parfaitement un handshake TCP légitime. Dans ce cas, nftables avec conntrack + rate-limit par connexion reste indispensable.
  • Rate-limit en pps, pas en bytes : le moteur XDP de PAKKT est stateless ; pour du rate-limit en bande passante (Mbps), il faut s'appuyer sur nftables ou des QoS type tc (Traffic Control). PAKKT intègre des règles nftables pour cette couche complémentaire.
  • SYN cookies : activer net.ipv4.tcp_syncookies = 1 en complément de XDP permet de ne pas allouer de socket semi-ouvert tant que l'ACK final n'est pas reçu. Cette synergie réduit encore l'empreinte mémoire en cas de flood résiduel.
  • Scrubbing cloud en amont : pour des attaques volumétriques (> 10 Gbps), XDP seul ne suffira pas ; il faut un scrubbing cloud (CloudFlare, OVH VAC, etc.) en amont pour absorber la bande passante. PAKKT est complémentaire, pas une alternative à ces solutions.
  • Tuning kernel : augmenter net.core.netdev_max_backlog, net.ipv4.tcp_max_syn_backlog, et activer le BBR congestion control peut améliorer la résilience globale.

Enfin, pour une défense pérenne, il est recommandé d'automatiser les ajustements de règles via l'API publique PAKKT (déclenchement sur seuils Prometheus, intégration avec des SIEM comme Wazuh, etc.). Cela permet de réagir en quelques secondes à une attaque émergente, sans intervention manuelle.

Pour plus de détails techniques et des guides pas-à-pas, consultez le Blog PAKKT et la documentation officielle du projet XDP sur kernel.org.



Conclusion

Stopper un SYN flood XDP au niveau kernel avec eBPF et nftables représente aujourd'hui la méthode la plus efficace pour garantir la disponibilité des services exposés sur Internet. En combinant un programme XDP stateless pour éliminer le gros du flood avant la pile réseau, et un firewall nftables stateful pour affiner le filtrage au niveau connexion, les administrateurs peuvent mitiger des attaques de plusieurs millions de paquets par seconde avec un impact CPU minimal et une latence négligeable. Les outils comme PAKKT automatisent ce déploiement, offrent un monitoring temps réel géolocalisé, et s'intègrent aux workflows existants (Pterodactyl, API publique), rendant cette protection accessible même aux équipes sans expertise eBPF approfondie.



FAQ

Peut-on utiliser XDP pour bloquer un SYN flood sans nftables ?

Oui, XDP seul peut drop les paquets SYN au-delà d'un seuil de pps. Cependant, sans conntrack (fourni par nftables), vous ne pouvez pas distinguer finement les connexions légitimes déjà établies des nouvelles tentatives. En pratique, une double couche XDP (rate-limit global) + nftables (rate-limit par connexion, tracking des états TCP) offre une défense beaucoup plus robuste et granulaire.

Quel est l'impact de XDP sur la latence des paquets légitimes ?

Un programme XDP bien optimisé ajoute une latence sub-microseconde (typiquement 50 à 200 nanosecondes par paquet). Cette latence est négligeable comparée au temps de traitement dans la pile réseau classique (plusieurs microsecondes) et n'affecte pas l'expérience utilisateur, même pour des applications sensibles à la latence comme les serveurs de jeu FPS ou les services de trading haute fréquence.

Comment ajuster dynamiquement les seuils de rate-limit pendant une attaque ?

Avec PAKKT, les règles XDP et nftables sont pilotées via des BPF maps mises à jour en temps réel depuis le panel centralisé. Vous pouvez modifier le max_port_pps d'une règle XDP ou le limit rate d'une règle nftables sans recharger le programme eBPF ni interrompre le trafic légitime. L'agent synchronise les modifications en moins de 2 secondes (heartbeat 30s, mais les mises à jour de maps sont instantanées). Pour une automatisation poussée, utilisez l'API publique PAKKT couplée à des alertes Prometheus ou Grafana.

Protégez vos serveurs

Déployez PAKKT en 30 secondes

Protection kernel double couche XDP + nftables, pilotable depuis un panel centralisé. Essai gratuit 7 jours.