Project Oxygen & Ideo-LabIDEO LAB Dashboard 2026

Nginx ConnWatch

Script de surveillance Linux pour détecter une montée anormale des connexions sur 443 (ESTABLISHED, top IP, seuils), avec logs et alertes e-mail optionnelles.

Télécharger Lien direct Version 1.0 Bash ss / awk /usr/local/bin/
Ce que fait ConnWatch
  • Mesure toutes les X secondes : total TCP sur 443, ESTABLISHED, SYN-RECV, TIME-WAIT.
  • Calcule le Top IP (IP qui maintiennent le plus de connexions).
  • Écrit un log structuré (timestamp + métriques).
  • Déclenche des alertes sur seuils (anti-spam : cooldown).
  • Optionnel : envoi e-mail via mail ou sendmail.
Cas d’usage : détecter un empilement de connexions idle (keep-alive / HTTP2) ou un emballement de sessions, avant saturation (FD, conntrack, workers).
Prérequis
  • Linux (Ubuntu/Debian recommandé)
  • iproute2 (commande ss)
  • Accès root (lecture socket + écriture logs)
  • Optionnel : screen ou systemd
  • Optionnel : mailutils pour alertes e-mail
Important : ConnWatch ne bloque rien tout seul. Il surveille et alerte. Les actions (Nginx limit/keepalive, WAF, etc.) restent sous votre contrôle.
Fichiers utilisés

Chemins par défaut (recommandés) :

Script : /usr/local/bin/nginx_connwatch.sh
Log : /var/log/nginx-connwatch.log
State : /var/lib/nginx-connwatch/
Installation

Installation simple : copier le script, rendre exécutable, créer le dossier state.

1) Télécharger le script
Terminal
cd /tmp
curl -L -O https://www.ideo-lab.com/static/toolbox/nginx_connwatch.sh
2) Installer au bon emplacement
Terminal
sudo mv /tmp/nginx_connwatch.sh /usr/local/bin/nginx_connwatch.sh
sudo chmod +x /usr/local/bin/nginx_connwatch.sh
sudo mkdir -p /var/lib/nginx-connwatch
Vérification : ls -l /usr/local/bin/nginx_connwatch.sh doit afficher le bit exécutable.
Lancement (manuel)

Idéal pour tester et valider les seuils sur une courte période.

1) Lancer en foreground
Terminal
sudo /usr/local/bin/nginx_connwatch.sh
2) Suivre le log
Terminal
sudo tail -f /var/log/nginx-connwatch.log
Note : en foreground, le script tourne indéfiniment. Pour un usage long terme, privilégier systemd (onglet dédié).
Installation en service systemd (recommandé)

Lancement automatique au boot + redémarrage auto en cas de crash.

1) Créer l’unité systemd
/etc/systemd/system/nginx-connwatch.service
[Unit]
Description=Nginx connection watcher
After=network.target

[Service]
Type=simple
Environment=MAIL_TO=
ExecStart=/usr/local/bin/nginx_connwatch.sh
Restart=always
RestartSec=3

[Install]
WantedBy=multi-user.target
2) Activer et démarrer
Terminal
sudo systemctl daemon-reload
sudo systemctl enable --now nginx-connwatch.service
sudo systemctl status nginx-connwatch.service --no-pager
3) Logs systemd (optionnel)
Terminal
sudo journalctl -u nginx-connwatch.service -f
OK : le log applicatif principal reste /var/log/nginx-connwatch.log. Le journal systemd sert au diagnostic du service.
Alertes e-mail (optionnel)

Deux options : mail (mailutils) ou sendmail. L’alerte s’envoie uniquement si MAIL_TO est défini.

1) Installer mailutils (simple)
Terminal
sudo apt-get update
sudo apt-get install -y mailutils
2) Définir le destinataire pour le service

Méthode propre : surcharger uniquement la variable MAIL_TO via un override systemd.

Terminal
sudo systemctl edit nginx-connwatch.service
Override
[Service]
Environment=MAIL_TO=ton.email@domaine.tld
3) Recharger et redémarrer
Terminal
sudo systemctl daemon-reload
sudo systemctl restart nginx-connwatch.service
Remarque : l’envoi d’e-mails dépend de la capacité du serveur à émettre (Postfix/SMTP). Si l’e-mail ne part pas, le script continue à logger localement.
Seuils & réglages

Les seuils sont définis en haut du script. Vous pouvez ajuster selon votre trafic réel.

Paramètres clés
  • INTERVAL : fréquence de mesure (ex. 30 secondes)
  • THRESH_TOTAL : alerte si connexions total > seuil
  • THRESH_ESTAB : alerte si ESTABLISHED > seuil
  • THRESH_TOPIP : alerte si une IP conserve > seuil connexions
  • LOG : chemin du log (par défaut /var/log/nginx-connwatch.log)
  • STATE : dossier de cooldown anti-spam (par défaut /var/lib/nginx-connwatch)
Recommandation : démarrez “large”, observez 24h, puis réduisez les seuils progressivement pour limiter les faux positifs.
Exemple : ajuster les seuils
Éditer le script
sudo nano /usr/local/bin/nginx_connwatch.sh
Après modification : si vous utilisez systemd, redémarrez le service : sudo systemctl restart nginx-connwatch.service
Dépannage

Points fréquents : permissions, commandes absentes, logs Nginx non lisibles, e-mail non configuré.

1) Le script ne tourne pas
  • Vérifier le droit exécutable : ls -l /usr/local/bin/nginx_connwatch.sh
  • Vérifier ss : ss -h (sinon installer iproute2)
  • Vérifier systemd : sudo systemctl status nginx-connwatch.service
2) Le log ne s’écrit pas
  • Vérifier : sudo touch /var/log/nginx-connwatch.log
  • Relancer en root : sudo /usr/local/bin/nginx_connwatch.sh
3) Les e-mails ne partent pas
  • Tester : echo test | mail -s "test" ton.email@domaine.tld
  • Vérifier que MAIL_TO est défini dans le service systemd
  • Configurer Postfix/SMTP si nécessaire (selon votre politique infra)
Bon réflexe : même sans e-mail, ConnWatch fournit un log exploitable et un top IP (base fiable pour déclencher une action côté Nginx/WAF).