nas-runbooks/hermes-perso/security/crowdsec-dsm.md

2.4 KiB

CrowdSec sur DSM 7 - Bouncer custom ipset

Auteur : hermes-perso | Date : 2026-06-12 | Statut : valide Tags : securite, ssh, crowdsec, iptables, ipset, dsm

Probleme

Blocage dynamique d IPs malveillantes sur DS920+. Ancien systeme (liste statique) insuffisant.

Contexte DSM

  • Kernel Linux 4.4.302+ (DSM 7.x)
  • Pas de systemd (upstart/init)
  • iptables disponible, nftables absent
  • ipset disponible nativement

Ce qui NE fonctionne PAS

Tentative Raison echec
Bouncer Go officiel crowdsec-firewall-bouncer Binaire compile kernel 5.x+ — incompatible kernel DSM 4.4
Installation package CrowdSec officiel Depend systemd absent sur DSM
Backend nftables Commande absente sur DSM 7 kernel 4.4

Solution validee

Container Docker crowdsec-firewall-bouncer custom avec sync.sh : wget vers API CrowdSec /v1/decisions + ipset CLI. Sync toutes les 10s.

Chaine iptables CROWDSEC_CHAIN branchee dans INPUT. ipset crowdsec-blacklist alimente par sync.sh. IPs privees RFC1918 whitelistees dans config CrowdSec.

Verification

Test : cscli decisions add --ip 10.99.99.99 Attendu : IP presente dans ipset list crowdsec-blacklist ET regle DROP active dans iptables -L CROWDSEC_CHAIN

Pieges DSM

  • Bouncer Go officiel = toujours incompatible kernel 4.4
  • ipset ne persiste pas au redemarrage : creer tache planifiee DSM pour recreer au boot
  • Utiliser wget (et non curl) dans sync.sh pour compatibilite maximale DSM

References


BUG CRITIQUE — sync.sh O(n2) CPU 109pct (resolu 2026-06-29)

Symptome

crowdsec-firewall-bouncer consomme +100pct CPU en continu.

Cause

Double boucle for IP in NEW_IPS grep-qxF dans CURRENT_IPS : O(n2) grep-forks toutes les 10 secondes. 50+ IPs = 2500 forks/cycle.

Cause restart loop (v2 echec)

set -e dans script ash : commandes || chaines sans || true final = exit 1 immediat. pipe cmd | while read ; do condition && cmd ; done retourne exit 1 si condition fausse.

Fix v3 valide

  • set -e supprime (poison pour daemon ash)
  • comm -23 / comm -13 sur fichiers tries : O(n log n), zero fork imbrique
  • while read < file au lieu de cmd | while read (pas de subshell, exit code propre)
  • || true systematique sur toutes les commandes externes
  • Resultat : 0.1pct CPU stable, zero restart

Source rebuild

/volume1/docker/crowdsec/bouncer-sync/sync.sh + Dockerfile Image : crowdsec-sync:dsm