ConnMon Guard — Monitoring & Anti-flood dynamique (443) via ipset
ConnMon Guard — Dynamic 443 flood monitoring & auto-ban via ipset
ConnMon Guard est un outil “anti-flood” orienté TCP/TLS (pas seulement HTTP). Il analyse en continu les connexions ESTABLISHED vers 443 (via ss), détecte les comportements suspects (ex: connexions idle, slow TLS, spray /24), enrichit chaque IP avec son ASN et pays (whois Cymru), puis applique un ban temporaire via ipset (effet immédiat, rollback facile).
- Observe le port
443viasset calcule les “top talkers” (connexions par IP). - Score le risque : volume, “idle pattern” (queues nulles), hints keepalive/timer, densité par
/24. - Enrichit : ASN, AS Name, Country (whois.cymru) + cache local.
- Ban dynamique : ajoute l’IP à
ipset ideolab_banavec untimeout(rollback naturel). - Journalise :
/var/log/ideolab/connmon_events.jsonl(idéal pour dashboard Django). - Exporte des métriques Prometheus (node_exporter textfile) pour Grafana.
ipset est fait pour gérer des listes dynamiques (rapide, scalable, timeout), sans exploser la taille de ta table iptables.
50 conn/IP · pays autorisés : FR ES GB US DE IT.Étape 1 — Installation sur le serveur (Ubuntu 24.04)
Step 1 — Install on the server (Ubuntu 24.04)
/usr/local/sbin/. Le script écrit ses logs dans /var/log/ideolab/ et maintient un cache ASN dans /var/lib/ideolab/.1) Dépendances
1) Dependencies
sudo apt update
sudo apt install -y ipset jq whois fail2ban \
netfilter-persistent iptables-persistent2) Installer le script
2) Install the script
sudo mkdir -p /usr/local/sbin
sudo cp connmon_guard.py /usr/local/sbin/connmon_guard.py
sudo chmod +x /usr/local/sbin/connmon_guard.py
sudo mkdir -p /var/log/ideolab /var/lib/ideolab
sudo touch /var/log/ideolab/connmon_events.jsonl3) Créer l’ipset + brancher iptables (DROP)
3) Create ipset + attach iptables DROP
# 1) ipset (banlist dynamique)
sudo ipset create ideolab_ban hash:ip timeout 0 -exist
# 2) drop immédiat des IP bannies (au top de INPUT)
sudo iptables -I INPUT 1 -m set --match-set ideolab_ban src -j DROPÉtape 2 — Utilisation (manuel + vérifs)
Step 2 — Usage (manual run + checks)
sudo /usr/local/sbin/connmon_guard.pyVérifier l’impact (top talkers sur 443)
Verify impact (top talkers on 443)
ss -Hnt state established '( sport = :443 )' \
| awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -nr | head -n 25Voir les bans actifs
View active bans
sudo ipset list ideolab_ban | head -n 120Consulter les events (JSONL)
Inspect events (JSONL)
tail -n 80 /var/log/ideolab/connmon_events.jsonl | jq .BAN_SECONDS. Pour réduire les faux positifs : augmente TH_CONN_IP.Étape 3 — Service systemd & persistance (prod)
Step 3 — systemd service & persistence (prod)
1) Créer le service + timer (toutes les 30s)
1) Create service + timer (every 30s)
sudo tee /etc/systemd/system/ideolab-connmon.service >/dev/null <<'EOF'
[Unit]
Description=IDEOlab ConnMon Guard (monitor + ipset ban)
After=network.target
[Service]
Type=oneshot
ExecStart=/usr/local/sbin/connmon_guard.py
EOFsudo tee /etc/systemd/system/ideolab-connmon.timer >/dev/null <<'EOF'
[Unit]
Description=Run IDEOlab ConnMon Guard frequently
[Timer]
OnBootSec=30
OnUnitActiveSec=30
AccuracySec=1s
[Install]
WantedBy=timers.target
EOFsudo systemctl daemon-reload
sudo systemctl enable --now ideolab-connmon.timer
sudo systemctl list-timers | grep connmon2) Persister iptables au reboot
2) Persist iptables across reboot
sudo netfilter-persistent saveDashboard — Grafana (Prometheus) & Django (IDEO-Lab)
Dashboard — Grafana (Prometheus) & Django (IDEO-Lab)
A) Grafana via node_exporter (textfile collector)
.prom (format Prometheus) dans le répertoire textfile collector. Tu obtiens : connexions 443, suspects détectés, bans émis.# Exemple (si node_exporter installé)
cat /var/lib/node_exporter/textfile_collector/ideolab_connmon.prom
# Vérifier l'exposition
curl -s localhost:9100/metrics | grep ideolab_connmonideolab_connmon_established_443— gauge (volume)ideolab_connmon_suspect_ips— gauge (détection)increase(ideolab_connmon_bans_total[5m])— rate bans
B) Dashboard Django (IDEO-Lab)
connmon_events.jsonl dans une table (ConnmonEvent) puis d’afficher : “Derniers bans”, “Top ASN”, “Top /24”, “Countries”.Fail2ban — complément “log-based” (Nginx error.log)
Fail2ban — optional log-based complement (Nginx error.log)
1) Filter
sudo tee /etc/fail2ban/filter.d/nginx-ideolab-slowtls.conf >/dev/null <<'EOF'
[Definition]
failregex = ^\s*\d{4}/\d{2}/\d{2}\s+\d{2}:\d{2}:\d{2}\s+\[error\]\s+\d+#\d+:\s+\*\d+\s+(?:client timed out|recv\(\) failed|client prematurely closed connection|invalid request line).*client:\s*,.*$
ignoreregex =
EOF 2) Action ipset
sudo tee /etc/fail2ban/action.d/ipset.conf >/dev/null <<'EOF'
[Definition]
actionstart = ipset create hash:ip timeout 0 -exist
actioncheck = ipset list >/dev/null 2>&1
actionban = ipset add timeout -exist
actionunban = ipset del 2>/dev/null || true
EOF 3) Jail
sudo tee /etc/fail2ban/jail.d/nginx-ideolab-slowtls.local >/dev/null <<'EOF'
[nginx-ideolab-slowtls]
enabled = true
filter = nginx-ideolab-slowtls
logpath = /var/log/nginx/error.log
findtime = 300
maxretry = 15
bantime = 3600
action = ipset[name=ideolab_ban, port="443", protocol=tcp]
EOF
sudo systemctl restart fail2ban
sudo fail2ban-client status nginx-ideolab-slowtlsSécurité & Bonnes pratiques (IDEO-Lab)
Security & best practices (IDEO-Lab)
1) Nginx : timeouts + limites (anti slow)
# anti slowloris / slow headers
client_header_timeout 10s;
client_body_timeout 10s;
send_timeout 10s;
keepalive_timeout 10s;
reset_timedout_connection on;
# limites
limit_conn_zone $binary_remote_addr zone=perip:10m;
limit_req_zone $binary_remote_addr zone=reqip:10m rate=10r/s;
limit_conn perip 50;
limit_req zone=reqip burst=40 nodelay;2) Règle d’or : rollback immédiat disponible
ipset flush ideolab_ban (retour immédiat).3) Allowlist pays (option “politique”)
FR ES GB US DE IT. Cela coupe énormément de bruit “monde”.À propos
About
Positionnement
ConnMon Guard est l’équivalent “automatisé/continu” d’un outil de crise type Panic Guard : il tourne en boucle, observe et bannit temporairement sans ajouter des milliers de règles iptables.
Emplacements (par défaut)
- Script :
/usr/local/sbin/connmon_guard.py - Events :
/var/log/ideolab/connmon_events.jsonl - Cache :
/var/lib/ideolab/connmon_cache.sqlite3 - ipset :
ideolab_ban
Licence
Usage interne IDEO-Lab (toolbox). Packagable si tu veux.
