Project Oxygen & Ideo-LabIDEO LAB Dashboard 2026
ConnMon Guard Anti-flood dynamique & observable
ss / TCP / TLS ipset + iptables ASN / country

ConnMon Guard — Monitoring & Anti-flood dynamique (443) via ipset

ConnMon Guard — Dynamic 443 flood monitoring & auto-ban via ipset

But
Stopper l’hémorragie
Principe
Observe → Score → Ban
Sécurité
DRY-RUN (optionnel)
Rollback
ipset timeout/flush

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

ConnMon Guard is a TCP/TLS-first anti-flood tool (not just HTTP). It continuously analyzes ESTABLISHED connections to 443 (via ss), detects suspicious patterns (idle/slow TLS, /24 spray), enriches IPs with ASN + country (Cymru whois), then applies temporary bans through ipset (instant effect, easy rollback).

Ce que fait ConnMon Guard :
  • Observe le port 443 via ss et 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_ban avec un timeout (rollback naturel).
  • Journalise : /var/log/ideolab/connmon_events.jsonl (idéal pour dashboard Django).
  • Exporte des métriques Prometheus (node_exporter textfile) pour Grafana.
Pourquoi ipset plutôt que “iptables à la main” ?
ipset est fait pour gérer des listes dynamiques (rapide, scalable, timeout), sans exploser la taille de ta table iptables.
Contexte IDEO-Lab (ton cas) : Ubuntu 24.04 · iptables manuel · Nginx direct · seuil 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)

Télécharger le script (version IDEO-Lab)
Place le fichier dans /usr/local/sbin/. Le script écrit ses logs dans /var/log/ideolab/ et maintient un cache ASN dans /var/lib/ideolab/.
⬇ Télécharger connmon_guard.py

1) Dépendances

1) Dependencies

Deps
sudo apt update
                sudo apt install -y ipset jq whois fail2ban \
                netfilter-persistent iptables-persistent

2) Installer le script

2) Install the script

Install
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.jsonl

3) Créer l’ipset + brancher iptables (DROP)

3) Create ipset + attach iptables DROP

Firewall
# 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
Important : sur un serveur exposé, fais toujours ces tests depuis une session “safe” (console provider / second SSH / VPN), pour éviter un lock-out.

Étape 2 — Utilisation (manuel + vérifs)

Step 2 — Usage (manual run + checks)

Conseil : commence par exécuter le script manuellement 2-3 fois pour vérifier la détection, puis passe en service systemd.
Run
sudo /usr/local/sbin/connmon_guard.py

Vérifier l’impact (top talkers sur 443)

Verify impact (top talkers on 443)

Observe
ss -Hnt state established '( sport = :443 )' \
                | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -nr | head -n 25

Voir les bans actifs

View active bans

Bans
sudo ipset list ideolab_ban | head -n 120

Consulter les events (JSONL)

Inspect events (JSONL)

Events
tail -n 80 /var/log/ideolab/connmon_events.jsonl | jq .
Le ban est temporaire (timeout). Pour durcir : augmente 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)

Service
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
                EOF
Timer
sudo 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
                EOF
Enable
sudo systemctl daemon-reload
                sudo systemctl enable --now ideolab-connmon.timer
                sudo systemctl list-timers | grep connmon

2) Persister iptables au reboot

2) Persist iptables across reboot

Persist
sudo netfilter-persistent save
ipset : si tu veux persister la banlist entre reboots (optionnel), ajoute un restore ipset au boot. Dans la plupart des cas, ce n’est pas nécessaire : ConnMon re-bannit automatiquement si l’attaque revient.

Dashboard — Grafana (Prometheus) & Django (IDEO-Lab)

Dashboard — Grafana (Prometheus) & Django (IDEO-Lab)

A) Grafana via node_exporter (textfile collector)

ConnMon Guard peut écrire un fichier metrics .prom (format Prometheus) dans le répertoire textfile collector. Tu obtiens : connexions 443, suspects détectés, bans émis.
Metrics
# 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_connmon
Panels Grafana (PromQL)
  • ideolab_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)

Pour Django, le plus simple est d’importer 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)

Fail2ban est utile pour bannir sur des patterns logs (timeouts, invalid request line, etc.). Mais un flood TLS idle peut ne rien logguer : ConnMon (ss) reste le détecteur principal.

1) Filter

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

Action
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

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-slowtls

Sécurité & Bonnes pratiques (IDEO-Lab)

Security & best practices (IDEO-Lab)

1) Nginx : timeouts + limites (anti slow)

Nginx
# 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

Si tu suspectes un sur-blocage : ipset flush ideolab_ban (retour immédiat).

3) Allowlist pays (option “politique”)

Si tu veux aller plus loin, tu peux appliquer une policy “allowlist pays” au firewall : 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.