Protection et filtrage des paquets DDoS
1) Pourquoi est-ce nécessaire
DDoS est la « dégradation de masse » des ressources : bande/pps, tables d'état, CPU du noyau/IRQ, pools de connexion, limites d'application. L'objectif est de dissocier la protection : éteindre le volume sur le périmètre du réseau, neutraliser les anomalies du protocole jusqu'à la pile TCP/IP, et sur L7 couper les requêtes indésirables en conservant SLO pour les utilisateurs légitimes.
2) Classes d'attaque
2. 1 L3/L4 (volumetric/protocol)
Volumetric: UDP flood, UDP-reflection/amplification (DNS/CLDAP/NTP/SSDP/memcached/mDNS), GRE flood.
Protocol/state exhaustion: SYN flood, ACK/RST flood, TCP connection-exhaustion, ICMP flood, TCP fragmentation.
Caractéristiques QUIC/UDP : fausses tempêtes initiales/Retry, source spoofed.
2. 2 L7 (application)
HTTP/1. 1 : demandes pour des itinéraires chers, header oversize/field smuggling.
HTTP/2: Rapid Reset, stream-flood, HEADERS flood, PRIORITY abuse.
HTTP/3 (QUIC) : connexions/flux non terminés, flood initial.
Slow-атаки: slowloris/slow-read/slow-POST.
gRPC/WebSocket : strimes infinies, message-flood, gros cadres.
3) Architecture de protection de base
1. Anycast + Scrubbing
Pulvériser le trafic à l'échelle mondiale et le lancer à travers les centres de scrubbing du fournisseur (coupure volumétrique/spoofing sur le bord).
2. Multi-CDN / Multi-Edge
Variez les domaines (Web, API, statique), agrégez la protection et le cache pour la charge de lecture.
3. Filtres de bas niveau sur son périmètre
ACL sur les routeurs de bord (RFC1918, bogon, ports délibérément faux).
eBPF/XDP pour early-drop par signatures et rate-limites jusqu'à contrack.
4. L7-périmètre (NGINX/Envoy/WAF)
Compression RPS par clés, challenge (captcha/PoW), cache, priorité des chemins « chers ».
5. Durabilité interne
Pools de connexion, files d'attente, circuit/timeout, isolation des services (bulkhead) et autoscaling avec « bouchons » (shedder).
4) « vannes » réseau : ce qui est allumé immédiatement
4. 1 Linux sysctl (noyau/pile)
bash
TCP SYN flood sysctl -w net. ipv4. tcp_syncookies=1 sysctl -w net. ipv4. tcp_max_syn_backlog=4096 sysctl -w net. ipv4. tcp_synack_retries=3
Conntrack/sysctl -w net tables. netfilter. nf_conntrack_max=262144 sysctl -w net. netfilter. nf_conntrack_tcp_timeout_established=300
ICMP/redirect sysctl -w net. ipv4. icmp_echo_ignore_broadcasts=1 sysctl -w net. ipv4. conf. all. accept_redirects=0 sysctl -w net. ipv4. conf. all. send_redirects=0
sysctl -w net socket resources. core. somaxconn=4096 sysctl -w net. core. netdev_max_backlog=250000 sysctl -w net. core. rmem_max=134217728 sysctl -w net. core. wmem_max=134217728
4. 2 nftables : filtres de base et ratelimit sur les paquets
nft table inet filter {
sets {
bogon { type ipv4_addr; flags interval; elements = { 0. 0. 0. 0/8, 10. 0. 0. 0/8, 100. 64. 0. 0/10,
127. 0. 0. 0/8, 169. 254. 0. 0/16, 172. 16. 0. 0/12, 192. 0. 2. 0/24, 192. 168. 0. 0/16, 198. 18. 0. 0/15, 224. 0. 0. 0/4 } }
}
chains {
input {
type filter hook input priority 0; policy drop;
ip saddr @bogon drop ct state established,related accept
UDP amplification ports - limit pps udp dport {53,123,1900,11211,389,1900,5353} limit rate over 2000/second drop
SYN rate-limit tcp flags syn tcp dport {80,443} limit rate over 2000/second drop
ICMP flood ip protocol icmp limit rate 100/second accept
}
}
}
4. 3 XDP/eBPF (idée)
Early-drop paquets avec source spoofed (uRPF sur le routeur est le bienvenu).
les hachettes pps per/32 et per/24 ; « quarantaine » dynamique des sources.
Signatures UDP-reflection : DNS response-like de connexion (filtrer hors contexte).
5) Amplification UDP : inventaire et blocs
Réflecteurs/amplificateurs fréquents : DNS (open resolvers), NTP (monlist), CLDAP, SSDP, mDNS, Memcached (UDP), Chargen.
Mesures :- Fermer/limiter les services UDP, minimiser les ports ouverts.
- Sur le périmètre, limiter le pps/bitrate pour les ports connus.
- Recommandation DNS : récursif uniquement pour ses réseaux, RRL (Response Rate Limiting), minimisation de l'ANY.
- NTP - seulement « bootstrap » à fiable, « noquery » pour public.
6) TCP state exhaustion
SYN flood : 'tcp _ syncookies = 1', élevé 'tcp _ max _ syn _ backlog', 'synack _ retries = 3', drop par pps.
ACK/RST flood : limites de bas niveau, décrochage de séquences illégitimes (nftables/ebpf).
Conntrack-less sur le border : ne pas dépenser les tables d'état là où le filtre est possible par signature stateless.
7) Attaques L7 HTTP/2/3 et « intelligentes »
HTTP/2 Rapid Reset : limite de fréquence des cadres RST et nombre de flux ouverts ; fermer la connexion en cas d'anomalies.
Stream abuse: лимит concurrent streams, headers size, max frame size.
QUIC/HTTP/3 : limiter le pps initial, activer Retry ; les brefs timates handshake.
NGINX (fragment L7)
nginx
Header/body constraint client_max_body_size 1m;
large_client_header_buffers 4 8k;
HTTP/2 limits http2_max_concurrent_streams 128;
http2_recv_buffer_size 256k;
Rate limit by IP (example)
limit_req_zone $binary_remote_addr zone=reqs:20m rate=100r/s;
limit_req zone=reqs burst=200 nodelay;
Envoy (anti-reset et limites)
yaml http2_protocol_options:
max_concurrent_streams: 128 initial_stream_window_size: 65536 max_outbound_frames: 10000 stream_error_on_invalid_http_messaging: true
8) Slow-attaques et protection des ressources
Slowloris/slow-read/slow-POST : inclure 'proxy _ request _ buffering on', bas idle-timeout, minimum acceptable 'read _ rate'.
Interrompre les connexions à un intervalle interaget long à la demande.
Sur l'application - lecture/rejet précoce du corps, limites de taille/profondeur JSON.
9) Filtrage L7 : Qui est le plus important - laissez passer
Classification du trafic : known good (partenaires mTLS/JWT), utilisateurs enregistrés, anonymes.
Priorités : itinéraires d'écriture « chers » (dépôts/conclusions) - protéger, mais manquer confirmé ; répertoires de lecture - cache + throttle.
Couche Challenge : captcha/PoW/JS Challenges pour les zones grises au pic.
10) Cache, coalescing et dégradation
Cache Edge pour les réponses statiques/quasi statiques, 'stale-while-revalidate'.
Request coalescing : coller des requêtes parallèles à une seule clé - dans le proxy et dans l'application.
Mode Degrade : désactiver les fiches mineures (personnalisation, rapports lourds), donner des pages « légères ».
11) Observation et télémétrie
Métriques (par RR/nœud/cluster) :- L3/L4: `pps_in/out`, `bps_in/out`, `drop_pps{reason}`, `syn_recv`, `conntrack_used/limit`, `xdp_drop_pps`.
- L7: `requests_total{route}`, `429_total`, `challenge_total{type}`, `h2_rst_rate`, `slow_req_total`.
- Dépendances : CPU IRQ soft/hard, NIC queue drops, run-queue length.
Logs : samplés, agrégés par/24, ASN, ports et signatures ; sans PII.
Tracing : inclure sur les listes blanches, étendre le sampling en cas d'urgence pour le débogage.
12) Plans d'intervention (runbook)
1. Détail : déclenchement des seuils de pps/bps/429/h2_rst_rate.
2. Classification : niveau (L3/4/7), protocole (UDP/TCP/h2/h3), géo/ASN.
- inclure les profils de scribbing/blackhole sur le fournisseur,
- renforcer les limites nftables/ebpf,
- abaisser les limites L7 et relever les challenges,
- Activer Retry pour QUIC (Flood Initial).
- 4. Communications : page de statut, modèles de notification aux partenaires.
- 5. Forensica : capture PCAP de 60 à 120 secondes, échantillonnage des meilleurs talkers ASNs/ports.
- 6. Rétrospective : mettre à jour les signatures, les seuils, les listes de réflecteurs.
13) Tests et exercices
Playbooks DDoS-drill trimestriel : burst synthétiques UDP/HTTP, trafic slow, reset HTTP/2.
Game day : commutation Anycast/migration entre CDN, dégradation en « mode léger ».
Vérification du fournisseur : scribbing SLA, temps de marche/arrêt des filtres, max pps/bps.
14) Anti-modèles
Ne compter que sur le L7-WAF pour une attaque volumétrique.
L'absence de uRPF/ACL sur le border et le filtrage en tête-à-tête.
Titres/corps illimités et longue keep-alive en pointe.
Région unique/RR sans Anycast/multi-edge.
Absence de stocks par NIC/IRQ/CPU et surveillance des files d'attente.
Pas de cache/coalesing - RPS supplémentaire sur le backend.
15) Spécificités iGaming/Finance
Crêtes temporelles (matchs/derby/loteries) : élargir la capacité POP à l'avance, inclure un cache à coefficients agressif, mettre des challenges canaris pour les anonymes.
Routes de paiement/de retrait : un pool d'accès séparé avec mTLS, des délais courts, des limites de concurrence ; Pas de 0-RTT.
Géo-politiques : allow-lyst régional, ASN-filtrage « hébergement », geo-basculement rapide.
Intersection avec antifrood : les limites velocity et l'API Risk se déplacent vers un profil « dur » lors d'un incident DDoS.
16) Chèque-liste prod-prêt
- Anycast или multi-edge/CDN; les canaux de scribbing ont été testés.
- Border-ACL/uRPF ; profils nftables/ebpf/XDP, filtrage contrack-less.
- Sysctl-tuning TCP/SYN, limite pps pour les ports amplificateurs UDP.
- Limites HTTP/2/3 (streams, frames, headers), slow-defense, body/header-limits.
- Limites L7 et défi ; cache et coalescing sur le périmètre.
- Dashboards pps/bps/contrack/IRQ + L7 RED ; alerte sur les anomalies du h2_rst/429.
- Runbook/playbooks, contacts du fournisseur, activation des profils.
- Enseignements : Burst, slow, HTTP/2 reset ; le rapport et l'enregistrement des améliorations.
- Pools séparés pour les routes de paiement/critiques, mTLS et limites strictes.
17) TL; DR
Dissociez la protection : Anycast + scrubbing éteint le volume, eBPF/XDP + nftables coupe la poubelle jusqu'à la pile, les limites L7/challenges/cache conservent SLA. TCP (cookies SYN, backlog), limitez les amplificateurs UDP, fixez des limites de HTTP/2/3 et de slow-protection. Ayez un runbook et entraînez-le ; pour iGaming - étendez le bord à l'avance pendant les heures de pointe et séparez les chemins de paiement avec mTLS et des limites strictes.