67 lines
2.4 KiB
Markdown
67 lines
2.4 KiB
Markdown
# 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
|
|
- https://docs.crowdsec.net
|
|
|
|
|
|
---
|
|
|
|
## 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
|