Project Oxygen & Ideo-LabIDEO LAB Dashboard 2026

Toolbox Dev — Ideo-Lab

Fail2Ban + iptables — Protection SYN Flood HTTPS (443)

Détection automatique via logs iptables (F2B-HTTPS) → ban Fail2Ban → drop au firewall.

Guide Ops / Sécu  •  Ubuntu  •  iptables + fail2ban

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.

Contexte (version “LinkedIn”) :
  • 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).
Infographie - Défense SYN Flood HTTPS 443 (Fail2Ban + iptables)

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.

Approche robuste :
  • iptables applique un rate-limit SYN par IP (hashlimit)
  • au-delà d’un seuil : LOG (préfixe F2B-HTTPS) + DROP
  • Fail2Ban lit /var/log/syslog et 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).

SYN rate-limit LOG + DROP Fail2Ban ban Kernel-level

Points à connaître

  • Les logs iptables partent souvent dans /var/log/syslog (Ubuntu)
  • fail2ban-regex sur tout syslog peut être long (gros fichier)
  • Pour tester vite : extraire un petit fichier de logs (grep F2B-HTTPS)

Ce que tu obtiens

ComposantRôleFichier / commande
iptablesDéclenche LOG + DROP sur SYN floodiptables -I INPUT ... hashlimit ...
syslogCollecte lignes kernel: F2B-HTTPS ... SRC=.../var/log/syslog
Fail2BanLit 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 hping3

Sanity check

sudo systemctl enable fail2ban
                    sudo systemctl restart fail2ban
                    sudo systemctl status fail2ban --no-pager -l

Durcissement 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
Persistant : le script fourni crée /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.

Télécharger le script (setup_f2b_https_synflood.sh)

/static/toolbox/setup_f2b_https_synflood.sh

Exécution

chmod +x setup_f2b_https_synflood.sh
            sudo ./setup_f2b_https_synflood.sh
Ce que le script crée :
  • /etc/fail2ban/filter.d/iptables-https.conf (regex F2B-HTTPS)
  • /etc/fail2ban/jail.d/iptables-https.conf (logpath /var/log/syslog)
  • Règles iptables en tête de chaîne INPUT : LOG puis DROP
  • /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 DROP

Tests (mise en route)

Important : on évite les tests “longs” en prod. Le but est juste de vérifier : iptables LOGsyslogfail2banban.

1) Vérifier que les règles iptables sont en place

sudo iptables -vnL INPUT --line-numbers | head -n 12
Attendu →règles LOG/DROP en lignes 1 et 2

2) Vérifier que syslog reçoit les logs F2B-HTTPS

sudo grep "F2B-HTTPS" /var/log/syslog | tail -n 10
Attendu →lignes "kernel: F2B-HTTPS ... SRC=x.x.x.x"

3) Vérifier l’état Fail2Ban & la jail

sudo fail2ban-client status
            sudo fail2ban-client status iptables-https

4) 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.13

5) 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.conf
Attendu →Failregex: X total (X > 0)

Mode test “ban immédiat” (uniquement si tu veux valider le ban)

Le script propose un mode test interactif. Sinon, tu peux temporairement mettre 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-https

Débannir une IP

sudo fail2ban-client set iptables-https unbanip 34.45.7.206

Suivre 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ètreValeur par défautQuand ajuster ?
hashlimit-above30/secondSi faux positifs (clients NAT), augmente (ex: 60/second)
hashlimit-burst60Autorise un pic court (handshakes légitimes) avant sanction
maxretry5Plus bas = ban plus rapide (risque FP), plus haut = plus tolérant
bantime86400 (24h)Augmente si attaques récurrentes
Bon réflexe : garde une règle “hard block” pour les IP ultra abusives (ex: /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
Vérifie les erreurs de config dans /etc/fail2ban/jail.d/*.conf :
  • doublons (ex: maxretry dé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 12

Si 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.conf
Vérifie :
  • ignoreip (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.conf

Cheat sheet commandes

ActionCommande
Status généralsudo fail2ban-client status
Status jailsudo fail2ban-client status iptables-https
Logssudo grep "F2B-HTTPS" /var/log/syslog | tail
Top rulessudo iptables -vnL INPUT --line-numbers | head -n 12
Unbansudo fail2ban-client set iptables-https unbanip X.X.X.X