Infographie — SYN Flood sur HTTPS (443)
Cette infographie résume la logique du script setup_f2b_https_synflood.sh : on bloque un flood SYN au niveau firewall (iptables), on loggue les dépassements (F2B-HTTPS) dans /var/log/syslog, puis Fail2Ban bannit automatiquement l’IP source.
- Un SYN flood sur 443 génère souvent peu/pas de requêtes HTTP → NGINX peut ne rien voir.
- On traite donc au niveau kernel/firewall : rate-limit SYN par IP, LOG + DROP.
- Fail2Ban lit ensuite les logs (syslog) et applique un ban automatique (durée configurable).
Astuce : cette image est prévue pour être visible “plein cadre” en haut du guide. Tu peux la remplacer par une version 16:9 (LinkedIn) ou 4:3 (doc interne).
Objectif & principe
Quand tu subis un SYN flood sur le port 443, beaucoup de connexions restent bloquées au stade SYN_SENT / SYN_RECV. NGINX ne voit souvent rien (pas de requête HTTP), donc un fail2ban basé sur /var/log/nginx/error.log peut être aveugle.
- iptables applique un rate-limit SYN par IP (hashlimit)
- au-delà d’un seuil : LOG (préfixe
F2B-HTTPS) + DROP - Fail2Ban lit
/var/log/sysloget bannit automatiquement l’IP
Schéma de fonctionnement
Pipeline simple : paquet SYN → iptables → syslog → fail2ban → ban.
[Internet] --SYN--> [iptables hashlimit]
if above threshold:
LOG prefix "F2B-HTTPS"
DROP packet
/var/log/syslog <-- "kernel: F2B-HTTPS ... SRC=x.x.x.x ..."
|
Fail2Ban jail (iptables-https)
|
iptables ban rule (DROP source IP)Pourquoi hashlimit ?
hashlimit limite un débit de paquets (SYN) par IP source. C’est plus adapté que connlimit pour les floods (et plus stable en pratique).
Points à connaître
- Les logs iptables partent souvent dans
/var/log/syslog(Ubuntu) fail2ban-regexsur tout syslog peut être long (gros fichier)- Pour tester vite : extraire un petit fichier de logs (
grep F2B-HTTPS)
Ce que tu obtiens
| Composant | Rôle | Fichier / commande |
|---|---|---|
| iptables | Déclenche LOG + DROP sur SYN flood | iptables -I INPUT ... hashlimit ... |
| syslog | Collecte lignes kernel: F2B-HTTPS ... SRC=... | /var/log/syslog |
| Fail2Ban | Lit syslog → bannit IP automatiquement | /etc/fail2ban/jail.d/iptables-https.conf |
Installation
Pré-requis
- Ubuntu / Debian (adaptable ailleurs)
- Accès root
- Port HTTPS :
443
Paquets nécessaires
Fail2Ban + support iptables persistant + outil test (optionnel).
sudo apt update
sudo apt install -y fail2ban iptables-persistent hping3Sanity check
sudo systemctl enable fail2ban
sudo systemctl restart fail2ban
sudo systemctl status fail2ban --no-pager -lDurcissement noyau (recommandé)
Ces réglages aident à absorber les floods TCP (complémentaires à iptables/fail2ban).
sudo sysctl -w net.ipv4.tcp_syncookies=1
sudo sysctl -w net.ipv4.tcp_max_syn_backlog=8192
sudo sysctl -w net.ipv4.tcp_synack_retries=2
sudo sysctl -w net.ipv4.tcp_syn_retries=3/etc/sysctl.d/99-https-synflood.conf et applique sysctl --system.Script complet (installation + setup + checks)
Ce script automatise tout : packages, sysctl, iptables hashlimit SYN, filtre/jail Fail2Ban, redémarrage + vérification, et un mode test optionnel.
/static/toolbox/setup_f2b_https_synflood.sh
Exécution
chmod +x setup_f2b_https_synflood.sh
sudo ./setup_f2b_https_synflood.sh/etc/fail2ban/filter.d/iptables-https.conf(regexF2B-HTTPS)/etc/fail2ban/jail.d/iptables-https.conf(logpath/var/log/syslog)- Règles iptables en tête de chaîne INPUT :
LOGpuisDROP /etc/sysctl.d/99-https-synflood.conf
Règles iptables installées (exemple)
# LOG si au-delà de 30 SYN/sec (burst 60), puis DROP
sudo iptables -I INPUT 1 -p tcp --syn --dport 443 \
-m hashlimit --hashlimit-name https-syn --hashlimit-above 30/second --hashlimit-burst 60 \
--hashlimit-mode srcip --hashlimit-srcmask 32 \
-j LOG --log-prefix "F2B-HTTPS " --log-level 4
sudo iptables -I INPUT 2 -p tcp --syn --dport 443 \
-m hashlimit --hashlimit-name https-syn --hashlimit-above 30/second --hashlimit-burst 60 \
--hashlimit-mode srcip --hashlimit-srcmask 32 \
-j DROPTests (mise en route)
iptables LOG → syslog → fail2ban → ban.1) Vérifier que les règles iptables sont en place
sudo iptables -vnL INPUT --line-numbers | head -n 122) Vérifier que syslog reçoit les logs F2B-HTTPS
sudo grep "F2B-HTTPS" /var/log/syslog | tail -n 103) Vérifier l’état Fail2Ban & la jail
sudo fail2ban-client status
sudo fail2ban-client status iptables-https4) Test rapide (optionnel, court)
Si tu veux déclencher quelques logs (sans attendre un vrai flood), tu peux envoyer un burst SYN très court. À utiliser avec prudence. Sur une VM, privilégie 1–2 secondes max.
# Remplace par ton IP locale si besoin (ex: 172.31.18.13)
sudo timeout 2s hping3 -S -p 443 --flood 172.31.18.135) Vérifier que Fail2Ban matche bien le regex
Évite d’analyser tout syslog (gros). On extrait seulement les dernières lignes pertinentes.
sudo grep "F2B-HTTPS" /var/log/syslog | tail -n 50 > /tmp/f2b-test.log
sudo fail2ban-regex /tmp/f2b-test.log /etc/fail2ban/filter.d/iptables-https.confMode test “ban immédiat” (uniquement si tu veux valider le ban)
maxretry=1 dans la jail et relancer un petit burst SYN, puis remettre maxretry=5.Exploitation (prod)
Voir les IP bannies
sudo fail2ban-client status iptables-httpsDébannir une IP
sudo fail2ban-client set iptables-https unbanip 34.45.7.206Suivre les logs (en direct)
sudo tail -f /var/log/syslog | grep --line-buffered "F2B-HTTPS"Vérifier les compteurs iptables (si attaque)
watch -n 1 "sudo iptables -vnL INPUT --line-numbers | head -n 12"Paramètres à ajuster (selon ton trafic)
| Paramètre | Valeur par défaut | Quand ajuster ? |
|---|---|---|
hashlimit-above | 30/second | Si faux positifs (clients NAT), augmente (ex: 60/second) |
hashlimit-burst | 60 | Autorise un pic court (handshakes légitimes) avant sanction |
maxretry | 5 | Plus bas = ban plus rapide (risque FP), plus haut = plus tolérant |
bantime | 86400 (24h) | Augmente si attaques récurrentes |
/24 cloud), en plus de Fail2Ban, si tu constates du scanning constant.Dépannage (les classiques)
1) Fail2Ban ne démarre pas / pas de socket
sudo systemctl status fail2ban --no-pager -l
sudo journalctl -u fail2ban --no-pager -n 120/etc/fail2ban/jail.d/*.conf :- doublons (ex:
maxretrydéfini deux fois) - mauvaise section
[jail-name] - logpath incorrect
2) Les logs F2B-HTTPS n’apparaissent pas
sudo grep "F2B-HTTPS" /var/log/syslog | tail -n 20
sudo iptables -vnL INPUT --line-numbers | head -n 12Si les compteurs LOG/DROP restent à 0, c’est que le seuil n’est pas dépassé (normal hors flood). En cas de flood réel, les compteurs montent immédiatement.
3) Fail2Ban voit les logs mais ne bannit pas
sudo fail2ban-client status iptables-https
sudo fail2ban-regex /tmp/f2b-test.log /etc/fail2ban/filter.d/iptables-https.confignoreip(localhost ignoré par défaut)- seuils :
maxretry+findtime - regex : doit matcher
SRC=
4) “fail2ban-regex” trop long sur syslog
Analyse tout syslog peut durer longtemps. Utilise un extrait ciblé :
sudo grep "F2B-HTTPS" /var/log/syslog | tail -n 200 > /tmp/f2b-test.log
sudo fail2ban-regex /tmp/f2b-test.log /etc/fail2ban/filter.d/iptables-https.confCheat sheet commandes
| Action | Commande |
|---|---|
| Status général | sudo fail2ban-client status |
| Status jail | sudo fail2ban-client status iptables-https |
| Logs | sudo grep "F2B-HTTPS" /var/log/syslog | tail |
| Top rules | sudo iptables -vnL INPUT --line-numbers | head -n 12 |
| Unban | sudo fail2ban-client set iptables-https unbanip X.X.X.X |
