In een eerder artikel hebben we gekeken naar Nginx Proxy Manager: een handige manier om meerdere selfhosted services bereikbaar te maken via nette domeinnamen en HTTPS.
Maar zodra je services vanaf internet bereikbaar maakt, krijg je ook ongewenst bezoek.
Denk aan bots die zoeken naar kwetsbare WordPress-installaties, scanners die willekeurige URL’s proberen, brute-forcepogingen op loginpagina’s of IP-adressen die duizenden requests doen om te kijken wat er achter je domein hangt.
Daarom is het verstandig om je reverse proxy niet alleen te gebruiken als doorgeefluik, maar ook als eerste verdedigingslaag.
Een populaire tool daarvoor is CrowdSec.
Wat is CrowdSec?
CrowdSec is een beveiligingstool die logs analyseert en verdacht gedrag herkent.
In plaats van alleen te kijken naar één losse request, kijkt CrowdSec naar patronen. Bijvoorbeeld:
- Een IP-adres dat heel veel niet-bestaande pagina’s probeert
- Een bot die agressief je website crawlt
- Herhaalde loginpogingen
- Scans naar bekende kwetsbaarheden
- Verkeer van IP-adressen met een slechte reputatie
Als CrowdSec zo’n patroon herkent, kan het een beslissing nemen: dit IP-adres moet tijdelijk of permanent geblokkeerd worden.
Dat blokkeren gebeurt via een zogenaamde bouncer. De CrowdSec-agent analyseert dus het gedrag, en de bouncer voert de blokkade uit.
Waarom CrowdSec bij Nginx Proxy Manager?
Nginx Proxy Manager staat vaak direct achter je router en vóór al je selfhosted applicaties.
Dat betekent dat vrijwel al het externe webverkeer eerst langs NPM komt:
Internet → Router → Nginx Proxy Manager → Interne services
Dat maakt NPM een goede plek om aanvallen vroeg te signaleren.
Als iemand bijvoorbeeld probeert om twintig verschillende loginpagina’s, WordPress-paden of bekende exploit-URL’s te openen, dan zie je dat terug in de logs van Nginx Proxy Manager.
CrowdSec kan die logs lezen en herkennen dat dit geen normaal bezoek is.
Wat bescherm je hiermee?
CrowdSec maakt je setup niet ineens onkwetsbaar, maar het helpt wel tegen veel ruis en automatische aanvallen.
Voorbeelden van verkeer dat je hiermee beter kunt afvangen:
/wp-admin
/xmlrpc.php
/.env
/admin
/phpmyadmin
/cgi-bin/
/vendor/phpunit/
Veel van dit soort requests zijn niet gericht op jouw specifieke server. Het zijn geautomatiseerde bots die grote delen van het internet scannen.
Heb je geen WordPress, phpMyAdmin of Laravel-applicatie draaien? Dan zijn dit soort requests vooral rommel. Maar ze belasten wel je server en ze kunnen gevaarlijk worden als je later per ongeluk wél iets kwetsbaars publiceert.
CrowdSec helpt om dit soort gedrag automatisch te herkennen.
Agent, collection en bouncer
Bij CrowdSec kom je meestal drie begrippen tegen:
Agent
De agent is het deel van CrowdSec dat logs leest en analyseert.
Bij Nginx Proxy Manager kijkt de agent bijvoorbeeld naar de access- en errorlogs van Nginx.
Collection
Een collection is een pakket met parsers en detectieregels.
Voor Nginx gebruik je bijvoorbeeld een Nginx-collection. Die helpt CrowdSec begrijpen hoe Nginx-logs eruitzien en welk gedrag verdacht is.
Bouncer
Een bouncer voert de actie uit.
Als CrowdSec besluit dat een IP-adres geblokkeerd moet worden, zorgt de bouncer ervoor dat dit IP-adres geen toegang meer krijgt.
Afhankelijk van je setup kan dat bijvoorbeeld via:
- Firewallregels
- Een Nginx-bouncer
- Een Cloudflare-bouncer
- Een andere integratie
De agent detecteert dus het probleem. De bouncer doet er iets mee.
Hoe werkt dit in combinatie met NPM?
Bij Nginx Proxy Manager draait Nginx meestal in een Docker-container. De logs staan dan vaak in een map zoals:
./data/logs/
Of op de host bijvoorbeeld:
/opt/npm/appdata/npm/logs/
CrowdSec moet deze logs kunnen lezen.
Daarna kan CrowdSec scenario’s toepassen op wat er binnenkomt. Denk aan:
- HTTP-scans
- Te veel 404-fouten
- Verdachte crawlers
- Bekende aanvalspatronen
- Brute-forcepogingen
Wanneer een IP-adres over de grens gaat, wordt er een beslissing aangemaakt. De bouncer gebruikt die beslissing om verkeer vanaf dat IP-adres te blokkeren.
Belangrijk: CrowdSec is geen vervanging voor goede beveiliging
CrowdSec is nuttig, maar het is geen excuus om onveilige services online te zetten.
Je moet nog steeds kritisch blijven op wat je publiceert.
Zet liever niet zomaar deze dingen open op internet:
- Proxmox
- Portainer
- Grafana
- Routerbeheer
- Nginx Proxy Manager admininterface
- Databases
- Interne dashboards
- Onbeschermde testapplicaties
Voor beheerinterfaces is een VPN meestal beter. Denk aan WireGuard, Tailscale of toegang via een apart beheernetwerk.
CrowdSec is een extra laag, geen wondermiddel.
Waarom niet alleen fail2ban?
Fail2ban is al jaren populair en werkt prima voor eenvoudige scenario’s, zoals SSH-bruteforce.
CrowdSec lijkt daar deels op, maar werkt moderner en breder.
Het verschil zit vooral in:
- Meer kant-en-klare scenario’s
- Community intelligence
- Makkelijker uitbreiden met collections
- Integraties met meerdere soorten bouncers
- Betere focus op gedragspatronen in plaats van alleen simpele regex-matches
Voor simpele setups is fail2ban nog steeds bruikbaar. Maar als je meerdere webservices via een reverse proxy publiceert, is CrowdSec vaak interessanter.
Waar moet je op letten?
Bij Nginx Proxy Manager en CrowdSec zijn er een paar aandachtspunten.
1. De logs moeten bereikbaar zijn
CrowdSec kan alleen analyseren wat het kan lezen.
Draait NPM in Docker en CrowdSec op de host? Dan moet de host toegang hebben tot de NPM-logbestanden.
Draait CrowdSec ook in Docker? Dan moet je de juiste logmap als volume mounten.
2. Het echte client-IP moet zichtbaar zijn
Als je nog een extra proxylaag gebruikt, zoals Cloudflare, dan ziet NPM mogelijk niet het echte IP-adres van de bezoeker, maar alleen het IP-adres van Cloudflare.
Dan moet je je headers en trusted proxies goed instellen. Anders blokkeer je mogelijk de verkeerde adressen of ziet CrowdSec alleen je proxy.
3. Blokkeer niet blind je eigen beheer-IP
Bij testen kun je jezelf buitensluiten als je expres verkeerde requests gaat doen.
Zorg daarom dat je weet hoe je een blokkade kunt opheffen en overweeg je eigen beheernetwerk of VPN-IP op een allowlist te zetten.
4. Kies de juiste bouncer
Niet elke bouncer past bij elke installatie.
Soms is een firewall-bouncer logisch. Soms is een Nginx-bouncer beter. Gebruik je Cloudflare voor je DNS en proxy, dan kan een Cloudflare-bouncer interessant zijn.
De beste keuze hangt af van waar je het verkeer wilt blokkeren: op je server, in Nginx, of al vóór je server.
Praktisch voorbeeld
Stel dat je de volgende services via Nginx Proxy Manager publiceert:
https://cloud.jouwdomein.nl
https://media.jouwdomein.nl
https://wiki.jouwdomein.nl
https://recipes.jouwdomein.nl
Een bot probeert vervolgens:
https://cloud.jouwdomein.nl/wp-admin
https://media.jouwdomein.nl/.env
https://wiki.jouwdomein.nl/phpmyadmin
https://recipes.jouwdomein.nl/xmlrpc.php
Normaal gesproken levert dat vooral 404’s op. Maar als hetzelfde IP-adres dit snel en vaak genoeg doet, kan CrowdSec herkennen dat dit verdacht gedrag is.
Daarna kan het IP-adres automatisch geblokkeerd worden.
Dat scheelt rommel in je logs en vermindert de kans dat een bot uiteindelijk iets vindt dat wél kwetsbaar is.
Past dit bij een homelab?
Ja, juist bij een homelab is CrowdSec interessant.
Veel homelabbers draaien meerdere applicaties achter één reverse proxy. Daardoor wordt Nginx Proxy Manager een centrale plek waar veel verkeer samenkomt.
Dat maakt het een logisch punt om beveiliging toe te voegen.
Een nette basisopzet is:
Router
↓
Nginx Proxy Manager
↓
Selfhosted services
CrowdSec leest NPM-logs
CrowdSec herkent verdacht gedrag
Bouncer blokkeert slechte IP’s
Daarmee blijft je setup overzichtelijk en voeg je toch een serieuze extra beveiligingslaag toe.
Wat komt er in een installatiehandleiding?
In een aparte handleiding kun je daarna stap voor stap laten zien hoe je dit installeert.
Bijvoorbeeld:
- CrowdSec installeren
- NPM-logmap koppelen
- Nginx-collection installeren
- Bouncer kiezen
- Configuratie testen
- Beslissingen bekijken
- Een blokkade handmatig verwijderen
- Je eigen IP-adres allowlisten
- Logs controleren
Dat is bewust niet allemaal in dit artikel uitgewerkt. Dit artikel is vooral bedoeld om het concept duidelijk te maken: waarom zou je CrowdSec gebruiken bij Nginx Proxy Manager, en wat voegt het toe?
Conclusie
Nginx Proxy Manager maakt het makkelijk om selfhosted services via HTTPS beschikbaar te maken. Maar alles wat je publiceert, wordt vroeg of laat bezocht door bots, scanners en brute-forcepogingen.
CrowdSec helpt om dat verkeer slimmer te herkennen en automatisch te blokkeren.
Het is geen vervanging voor sterke wachtwoorden, updates, VPN-toegang en gezond verstand. Maar als extra beveiligingslaag vóór je selfhosted services is het een hele nuttige toevoeging.
Voor iedereen die meerdere diensten via Nginx Proxy Manager publiceert, is CrowdSec daarom zeker het bekijken waard.