Protection DDoS

Comment protéger un serveur FiveM contre les attaques DDoS en 2026 ? Guide XDP complet

22 avril 2026 · 11 min de lecture

La protection DDoS FiveM est devenue un enjeu critique pour les propriétaires de serveurs GTA V Roleplay. Les attaques par déni de service visent à saturer votre serveur de paquets malveillants, rendant l'expérience injouable pour vos joueurs légitimes. Ce guide technique 2026 vous explique comment mettre en œuvre une défense kernel-level basée sur XDP/eBPF et nftables, directement sur votre machine Linux.

FiveM, le mod multijoueur de GTA V, repose sur une architecture UDP sensible aux attaques volumétriques. Un serveur non protégé peut être mis hors ligne par quelques milliers de paquets par seconde seulement. Contrairement aux solutions de scrubbing cloud (OVH VAC, CloudFlare Magic Transit) qui filtrent le trafic en amont, la protection kernel agit sur le serveur lui-même, offrant une réactivité sub-microseconde et une maîtrise totale de vos règles de filtrage.



Comprendre les attaques DDoS spécifiques aux serveurs FiveM

Les serveurs FiveM subissent trois types d'attaques principales :

  • UDP flood : saturation du port de jeu (30120 par défaut) avec des milliers de paquets UDP aléatoires ou mal formés. L'objectif est d'épuiser la bande passante et les ressources CPU du serveur.
  • SYN flood : si votre serveur expose un panel web ou une API HTTP (ports 30121, 40120), les attaquants envoient des connexions TCP incomplètes pour saturer la table de connexions.
  • Amplification DNS/NTP/SSDP : l'attaquant usurpe votre IP source et envoie des requêtes à des services publics mal configurés, qui vous répondent avec des paquets 10 à 100 fois plus gros.

Le kernel Linux standard traite chaque paquet reçu en remontant la stack réseau complète : interruption matérielle, traitement softirq, allocation de skb (socket buffer), parsing IP/UDP, passage par netfilter (iptables/nftables), puis remise au processus utilisateur. Sur une attaque à 500 000 pps, cette cascade devient le goulot d'étranglement.

XDP (eXpress Data Path) court-circuite cette stack : le programme eBPF s'exécute directement dans le driver réseau, avant même l'allocation du skb. Un paquet malveillant peut être dropé en quelques nanosecondes, sans consommer de CPU utilisateur. C'est la différence entre un serveur qui tient à 2 millions de pps et un serveur qui crash à 50 000 pps.

La protection DDoS FiveM efficace repose donc sur une double couche : XDP stateless pour le filtrage brut et ultra-rapide (DROP instantané des paquets hors whitelist ou dépassant un seuil PPS), puis nftables stateful pour les règles avancées (conntrack, rate-limit par connexion TCP, gestion des flags SYN/ACK).

[IMAGE_1: Vue rapprochée d'un rack serveur moderne dans un datacenter sombre, câbles réseau bleus et verts connectés à des switchs avec LEDs cyan clignotantes, écran LCD affichant des métriques réseau en temps réel, ambiance technique et froide, éclairage néon bleu, photoréaliste 8K]

Architecture de défense kernel : XDP + nftables pour FiveM

Couche 1 : Programme XDP pour le filtrage haute performance

Le PAKKT Engine charge un unique programme XDP par interface réseau (généralement eth0). Ce programme eBPF consulte des BPF maps pour appliquer jusqu'à 256 règles simultanées, définies depuis le panel centralisé PAKKT.io. Chaque règle spécifie :

  • Port range : 30120-30121 pour FiveM (UDP game + HTTP txAdmin).
  • Protocole : TCP, UDP, ICMP ou any.
  • Type de règle : block (DROP), rate_limit (DROP si PPS dépassé), allow_only (DROP tout sauf whitelist).
  • max_pps global : seuil de paquets par seconde sur l'ensemble du range de ports.
  • max_port_pps : seuil par port individuel (ex : 30120 UDP limité à 100 000 pps).
  • min/max packet size : rejeter les paquets trop petits (< 20 bytes) ou trop gros (> 1500 bytes si suspicion de fragmentation).

Exemple de règle appliquée via l'API ou le panel PAKKT :

{
  "port_start": 30120,
  "port_end": 30121,
  "protocol": "udp",
  "rule_type": "rate_limit",
  "max_pps": 150000,
  "max_port_pps": 80000,
  "min_packet_size": 28,
  "max_packet_size": 1400
}

Cette règle autorise jusqu'à 150 000 pps UDP sur l'ensemble du range 30120-30121, avec un plafond de 80 000 pps par port. Les paquets UDP inférieurs à 28 bytes (header UDP + au moins 8 bytes de payload) ou supérieurs à 1400 bytes sont rejetés. Le compteur PPS est réinitialisé chaque seconde par un timer eBPF.

Couche 2 : nftables stateful pour les connexions TCP et les exceptions

XDP est stateless : il ne garde aucune trace des flux. Pour gérer les connexions TCP (txAdmin sur 40120, panel web sur 30121), on déploie des règles nftables dans la table inet pakkt, isolée pour éviter tout conflit avec Docker, fail2ban ou iptables-persistent.

nft add table inet pakkt
nft add chain inet pakkt input { type filter hook input priority 0 \; policy accept \; }
nft add rule inet pakkt input ct state established,related accept
nft add rule inet pakkt input tcp dport 40120 ct state new limit rate 20/second accept
nft add rule inet pakkt input tcp dport 40120 tcp flags syn tcp flags \& \(fin\|syn\|rst\|ack\) \= syn limit rate 10/second accept

La première règle autorise le trafic des connexions déjà établies (conntrack). La deuxième limite les nouvelles connexions TCP sur le port 40120 à 20 par seconde (limite globale). La troisième filtre spécifiquement les paquets SYN pour contrer les SYN floods : maximum 10 SYN/s.

Pour un rate-limit plus granulaire, on utilise un meter nftables (rate-limit par IP source) :

nft add rule inet pakkt input tcp dport 40120 meter http_meter { ip saddr limit rate 5/second burst 10 packets } accept
nft add rule inet pakkt input tcp dport 40120 drop

Chaque IP source peut ouvrir jusqu'à 5 nouvelles connexions par seconde avec un burst de 10 paquets. Au-delà, le paquet est rejeté (dernière règle DROP).

Double couche Blacklist / Whitelist

PAKKT synchronise automatiquement les listes IP dans deux emplacements : une BPF map XDP (ipv4_blacklist, ipv4_whitelist) pour le DROP précoce, et un set nftables pour les règles stateful. Exemple d'ajout d'IP en blacklist :

bpftool map update name ipv4_blacklist key 192.0.2.42 value 1
nft add element inet pakkt blacklist_v4 { 192.0.2.42 }

L'agent PAKKT (Go, mTLS, obfuscation garble) applique ces modifications en moins de 100 ms après validation sur le panel centralisé. Le heartbeat 30s garantit la cohérence de l'état.

[IMAGE_2: Terminal Linux en gros plan sur fond noir, affichage d'une commande bpftool map dump avec des adresses IP en sortie, lignes de texte cyan et blanc, clavier mécanique rétroéclairé bleu en arrière-plan flou, ambiance de salle serveur nocturne, photoréaliste haute résolution]

Déploiement pas à pas d'une protection DDoS FiveM avec XDP

Prérequis système

Votre serveur Linux doit remplir les conditions suivantes :

  • Kernel 5.x ou supérieur avec support XDP natif (vérifiez uname -r).
  • Distribution : Ubuntu 20.04/22.04, Debian 11/12, Rocky Linux 8/9, ou toute distro récente avec systemd.
  • Driver réseau compatible XDP : la plupart des drivers modernes (ixgbe, i40e, ice, mlx5, virtio_net) supportent XDP. Vérifiez avec ethtool -i eth0 | grep driver.
  • Dépendances : clang, llvm, libbpf-dev, nftables (>= 0.9.6). Sur Ubuntu : apt install -y clang llvm libbpf-dev nftables.

Étape 1 : Installation de l'agent PAKKT

L'agent PAKKT est un binaire Go unique, sans dépendance runtime. Téléchargez-le depuis le panel après création de compte (essai gratuit 7 jours sur le premier agent) :

curl -o /usr/local/bin/pakkt-agent https://pakkt.io/download/agent/latest
chmod +x /usr/local/bin/pakkt-agent

Créez un fichier de configuration /etc/pakkt/agent.yaml avec votre clé d'agent (fournie par le panel) :

agent_key: "YOUR_AGENT_KEY_HERE"
api_endpoint: "https://api.pakkt.io"
interface: "eth0"
log_level: "info"

Lancez l'agent en service systemd :

cat > /etc/systemd/system/pakkt-agent.service <

L'agent charge automatiquement le programme XDP sur eth0 et crée la table nftables inet pakkt. Vérifiez le chargement :

ip link show eth0 | grep xdp
# Sortie attendue : prog/xdp id 123

bpftool prog show
# Vous devez voir un programme XDP type "xdp" attaché à eth0

nft list ruleset | grep "table inet pakkt"
# La table pakkt doit apparaître

Étape 2 : Configuration des règles depuis le panel

Connectez-vous au panel PAKKT. Dans l'onglet "Rules" de votre agent, ajoutez une règle pour protéger FiveM :

  • Port range : 30120-30121
  • Protocol : UDP
  • Rule type : rate_limit
  • Max PPS global : 200000
  • Max port PPS : 100000
  • Min packet size : 28
  • Max packet size : 1400

Sauvegardez. L'agent reçoit la nouvelle configuration en moins de 30 secondes (heartbeat), met à jour la BPF map et applique la règle. Aucun redémarrage de FiveM nécessaire, zéro downtime.

Étape 3 : Ajout de règles nftables complémentaires pour txAdmin

Si vous exposez txAdmin (port 40120 TCP), ajoutez manuellement une règle nftables pour limiter les connexions :

nft add rule inet pakkt input tcp dport 40120 meter txadmin_meter { ip saddr limit rate 3/minute burst 5 packets } accept
nft add rule inet pakkt input tcp dport 40120 drop

Cette règle autorise chaque IP à ouvrir maximum 3 connexions par minute avec un burst de 5 paquets. Au-delà, les paquets sont rejetés. Idéal pour contrer les attaques par bruteforce sur l'interface d'administration.

Étape 4 : Surveillance en temps réel

Le panel PAKKT affiche des métriques en temps réel : paquets droppés par règle, top IPs sources, top pays (GeoIP), graphes de trafic sur les 24 dernières heures (TimescaleDB). Vous pouvez également consulter les logs de l'agent localement :

journalctl -u pakkt-agent -f

Pour dumper les statistiques XDP directement depuis le kernel :

bpftool map dump name pakkt_stats
# Affiche les compteurs de paquets par action (XDP_DROP, XDP_PASS, XDP_ABORTED)


Optimisations avancées et intégration Pterodactyl

Whitelisting automatique des joueurs réguliers

Pour réduire la latence des joueurs légitimes, activez le mode allow_only combiné à une whitelist dynamique. Créez un script qui extrait les IPs des joueurs connectés depuis les logs FiveM, puis les ajoute automatiquement à la whitelist XDP :

#!/bin/bash
# /opt/fivem/update_whitelist.sh
LOGFILE="/opt/fivem/server-data/cache/fxserver.log"
WHITELIST_MAP="ipv4_whitelist"

grep "Authenticated player" "$LOGFILE" | awk '{print $NF}' | sort -u | while read IP; do
  bpftool map update name "$WHITELIST_MAP" key "$IP" value 1 2>/dev/null || true
done

Exécutez ce script via cron toutes les 5 minutes. Les IPs whitelistées bénéficient d'un XDP_PASS immédiat, sans passer par les seuils de rate-limit.

Intégration Pterodactyl pour la gestion centralisée

PAKKT propose une intégration native avec Pterodactyl v1.x. Depuis le panel PAKKT, liez votre instance Pterodactyl via l'API : Intégrations PAKKT (Pterodactyl, API publique). Une fois configurée, chaque serveur de jeu créé dans Pterodactyl peut hériter automatiquement d'un template de règles XDP/nftables.

Exemple : template "FiveM Production" avec rate-limit 200k pps, whitelist des IPs d'administration, blacklist des ASN connus pour héberger des botnets (AS16276, AS45090). Le template est partagé sur le marketplace PAKKT et appliqué en un clic à tous vos serveurs FiveM.

Tuning kernel pour absorber les attaques massives

Augmentez les buffers réseau pour éviter les packet drops avant même l'arrivée dans XDP :

cat >> /etc/sysctl.conf <

Pour les cartes réseau multi-queue, répartissez les interruptions RX sur plusieurs cœurs CPU :

ethtool -L eth0 combined 8
# Puis configurez irqbalance ou épinglez manuellement les IRQ

XDP peut traiter plusieurs millions de pps par cœur. Sur une machine 8 cœurs, vous absorbez facilement 10+ Mpps avant saturation.

Monitoring externe et alertes

PAKKT expose un endpoint Prometheus sur http://localhost:9090/metrics (configurable). Intégrez-le dans votre stack Grafana pour corréler les métriques XDP avec les métriques applicatives (FPS serveur, tick rate, nombre de joueurs). Configurez des alertes Telegram/Discord via le panel PAKKT lorsque le seuil de 100k pps est dépassé pendant plus de 60 secondes.



Limites de la protection kernel et complémentarité avec le scrubbing cloud

La protection DDoS FiveM au niveau kernel est extrêmement efficace contre les attaques jusqu'à plusieurs millions de pps, mais elle ne remplace pas une solution de scrubbing cloud dans tous les scénarios :

  • Saturation de la bande passante : si l'attaque dépasse la capacité du lien montant (ex : 10 Gbps d'attaque sur un lien 1 Gbps), les paquets sont droppés par le routeur de votre datacenter avant d'atteindre votre serveur. XDP ne peut rien faire. Dans ce cas, utilisez un scrubbing cloud (OVH VAC, CloudFlare Spectrum) en amont.
  • Attaques applicatives (L7) : XDP opère aux couches 2/3/4 (Ethernet, IP, TCP/UDP). Une attaque HTTP flood ou une exploitation de vulnérabilité dans FiveM lui-même nécessite une analyse applicative (WAF, IDS/IPS).
  • Attaques réfléchies (amplification) : XDP drop les paquets entrants, mais si votre IP est usurpée comme source d'une attaque par réflexion, seul un filtrage en amont (BCP38, routeur edge) peut la stopper.

La meilleure stratégie combine scrubbing cloud pour absorber les volumétriques > 1 Gbps, et PAKKT au niveau kernel pour filtrer finement les attaques < 1 Gbps et maintenir une latence optimale pour les joueurs légitimes. Les deux couches sont complémentaires, pas concurrentes.

PAKKT ne gère pas le rate-limit en bytes dans XDP (le PAKKT Engine est stateless, rate-limit par paquets uniquement). Pour un quota de bande passante strict (ex : limiter un port à 100 Mbps), utilisez nftables avec le module limit en bytes/s :

nft add rule inet pakkt input udp dport 30120 limit rate 100 mbytes/second accept
nft add rule inet pakkt input udp dport 30120 drop

Notez que ce rate-limit nftables est appliqué après XDP, donc moins performant (plusieurs milliers de pps seulement). Pour du vrai shaping L2, utilisez tc (Traffic Control) avec des qdiscs, ou déléguez au niveau switch/routeur.

Enfin, PAKKT ne supporte que Linux. Pour des serveurs Windows (rares en production FiveM, mais existants), orientez-vous vers des solutions de filtrage réseau externes ou une stack de virtualisation Linux (KVM/Proxmox) en frontal.



Conclusion

Protéger un serveur FiveM contre les attaques DDoS en 2026 exige une approche kernel-level : XDP pour le filtrage sub-microseconde, nftables pour la gestion stateful des connexions, et une orchestration centralisée pour ajuster les règles en temps réel. L'architecture PAKKT (agent Go léger + panel SaaS) vous offre cette stack clé en main, avec un impact < 1 % CPU et une tarification transparente de 3€/agent/mois. Déployez, configurez et surveillez votre protection en quelques minutes, sans compétence eBPF préalable, et garantissez une expérience fluide à vos joueurs même sous attaque.



FAQ

Quelle différence entre le rate-limit XDP (max_pps) et le rate-limit nftables (limit rate) pour FiveM ?

Le rate-limit XDP (max_pps) s'applique avant l'allocation du socket buffer, directement dans le driver réseau. Il compte les paquets par seconde et DROP instantanément les paquets excédentaires, sans consommer de CPU utilisateur. Idéal pour bloquer les floods UDP > 100k pps. Le rate-limit nftables (limit rate) s'exécute après le passage dans la stack réseau, dans le hook netfilter. Il permet des règles plus complexes (rate-limit par IP source via meter, rate-limit en bytes/s), mais moins performant (quelques milliers de pps max). Utilisez XDP pour le gros du filtrage, nftables pour les règles stateful TCP et les exceptions.

Puis-je combiner PAKKT avec fail2ban ou des règles iptables existantes ?

Oui, PAKKT crée une table nftables isolée (inet pakkt) avec une priorité de 0 dans le hook input. Elle coexiste avec iptables-legacy, iptables-nft, Docker (qui utilise la table nat), et fail2ban (qui insère des règles dans filter INPUT). Aucun conflit : les paquets traversent d'abord XDP (PAKKT Engine), puis nftables inet pakkt, puis la stack iptables/fail2ban. En revanche, si fail2ban ajoute une IP en blacklist dans iptables, elle ne sera pas remontée dans la BPF map XDP. Privilégiez l'ajout des IPs via le panel PAKKT pour bénéficier du DROP XDP (plus rapide).

Mon serveur FiveM utilise déjà un reverse proxy CloudFlare. Est-ce compatible avec la protection XDP PAKKT ?

CloudFlare ne propose pas de reverse proxy pour UDP (FiveM game sur port 30120). Si vous utilisez CloudFlare Spectrum (proxy TCP/UDP payant), le trafic arrive sur votre serveur depuis les IPs de CloudFlare, pas les IPs réelles des joueurs. Dans ce cas, désactivez le rate-limit XDP sur le port 30120 (ou passez en mode allow_only avec les ranges IP CloudFlare en whitelist), sinon vous risquez de bloquer tout le trafic légitime. Pour le port HTTP txAdmin (40120 TCP), CloudFlare proxy classique fonctionne normalement : les règles nftables PAKKT s'appliquent aux connexions TCP entre CloudFlare et votre serveur. La protection XDP PAKKT est complémentaire à CloudFlare : CloudFlare absorbe les attaques > 1 Gbps, PAKKT filtre finement les attaques < 1 Gbps et les paquets malformés que CloudFlare laisserait passer.

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.