Een brede DDos webserver aanval automatisch analyseren en blokkeren

Een brede server aanval automatisch analyseren en blokkeren

De laatste dagen hebben we onze open-source firewall tooling stevig uitgebreid om een uitzonderlijk brede aanval op een netwerk van niche jobsites te kunnen evalueren en automatisch te mitigeren.

Wat er gebeurde

We zagen een aanval die niet leek op de klassieke brute-force of scraper van een paar herkenbare IP-ranges. De druk kwam uit een zeer brede pool van IP-adressen, verdeeld over veel landen, providers en subnets. Apache /server-status liet honderden gelijktijdige requests zien. Zelfs na het blokkeren van veel /24 ranges kwamen er nieuwe verbindingen binnen uit andere stukken van dezelfde brede pool.

Ik heb dergelijke aanval nog niet vaak gezien. Het patroon leek sterk op een geautomatiseerde, mogelijk AI-gestuurde crawler of agent die bewust over veel netwerken spreidt om klassieke blokkering te ontwijken. Zeker is dat niet zonder forensisch bewijs, maar operationeel voelde het wel zo: een lastige service die gebouwd lijkt om websites onder druk te zetten zonder eenvoudig op een paar IP's te vangen.

Waarom /24 niet genoeg was

Aanvankelijk gebruikten we vooral /24 subnetten. Dat is relatief voorzichtig: je blokkeert 256 adressen tegelijk. Voor normale abuse is dat vaak goed genoeg. Maar bij deze aanval kwam bijna elk actief IP uit een ander /24. Daardoor bleef de aanval doorgaan, terwijl we wel veel kleine regels toevoegden.

In deze specifieke situatie bleek /16 de meest effectieve noodrem. Een /16 blokkeert 65.536 adressen tegelijk. Dat is agressief en moet je niet blind gebruiken voor alle verkeer, maar bij een breed gedistribueerde aanval kan het juist de snelste manier zijn om de druk van de server te halen.

De les: /24 is veiliger en smaller, maar bij een echte brede request-pool kan het te weinig effect hebben. /16 moet je voorzichtig toepassen, met allowlists en landbescherming, maar het kan de juiste keuze zijn om een incident snel te stoppen.

Wat we hebben gebouwd

De tooling staat open-source op GitHub: OnlineSolutionsGroupBV/DropIPsByCountry .

De voorbije dagen hebben we onder andere toegevoegd:

  • Analyse van Apache /server-status snapshots.
  • Geo-cache per uniek IP-adres in geo_data.json.
  • Per-land statistieken: welke landen worden geblokkeerd en welke blijven toegestaan.
  • Beschermde landen zoals BE, DE, FR en NL.
  • Allowlist checks voor Google, Bing/Microsoft, OpenAI en andere crawler-ranges.
  • Policy-mode met per-land prefixkeuze.
  • Een noodmodus met POLICY_MODE=0 TARGET_PREFIX=16 MIN_HITS=1.
  • UFW audit scripts om bestaande regels te controleren.
  • Run snapshots zodat elke firewall-run later te analyseren is.
  • Een cron-monitor die elke 30 minuten kijkt of Apache boven een drempel zit.

De huidige automatische flow

De monitor haalt periodiek /server-status op. Als Apache bijvoorbeeld meer dan 200 requests tegelijk verwerkt, wordt de volledige status-response opgeslagen als input.txt. Daarna loopt de bestaande block-flow:

PYTHON=python2 ./run_prepare_generiek_blocks.sh

De cronjob draait elke 30 minuten en gebruikt een lock, zodat twee runs niet tegelijk dezelfde UFW-regels proberen te wijzigen.

*/30 * * * * cd /home/downloads/DropIPsByCountry && PYTHON=python2 /usr/bin/python2 monitor_server_status_blocks.py --threshold 200 >> monitor_server_status_blocks.log 2>&1

De noodrem

Voor deze specifieke aanval is de meest directe noodrem:

PYTHON=python2 POLICY_MODE=0 TARGET_PREFIX=16 MIN_HITS=1 APPLY=0 ./run_prepare_generiek_blocks.sh

Eerst dry-run, daarna pas toepassen:

PYTHON=python2 POLICY_MODE=0 TARGET_PREFIX=16 MIN_HITS=1 APPLY=1 ./run_prepare_generiek_blocks.sh

Belangrijk: dit blijft gecombineerd met beschermde landen en crawler allowlists. Het doel is niet om willekeurig internet te blokkeren, maar om onder hoge druk snel de brede aanvalspool uit te schakelen.

Codex als incident-assistent

Een belangrijk deel van het werk is versneld met Codex van OpenAI. Codex hielp om de data te analyseren, scripts te schrijven, edge cases te vinden, tests toe te voegen en de firewall-flow stap voor stap veiliger te maken.

Dat is interessant: als aanvallen steeds meer geautomatiseerd en mogelijk AI-gestuurd worden, dan heb je aan de verdedigende kant ook betere automatisering nodig. In dit geval heeft een coder agent in onze handen veel tijd bespaard. Niet door blind regels te genereren, maar door snel patronen te vergelijken: actuele IP's tegen UFW, gegenereerde subnets tegen geo-data, en oude historische providerdata tegen de huidige snapshot.

Van script naar product

Wat begon als een handmatig script om IP's per land te blokkeren, is nu een klein operationeel systeem geworden. Het kijkt actief naar de serverstatus, beslist op basis van een drempel, bewaart bewijs in files, analyseert landen en subnets, en grijpt automatisch in wanneer dat nodig is.

Het is nog steeds pragmatische tooling, geen magisch securityproduct. Maar het begint wel op een echt product te lijken: meetbaar, herhaalbaar, auditeerbaar en automatisch genoeg om een aanval niet telkens volledig handmatig te moeten bestrijden.

Open source

De code staat hier: https://github.com/OnlineSolutionsGroupBV/DropIPsByCountry .

Wie met vergelijkbare brede bot- of crawlerdruk te maken krijgt, kan de scripts gebruiken als vertrekpunt. Controleer altijd je eigen allowlists, lokale landen, server-IP's en crawler-ranges voordat je agressieve /16 blokkering toepast.  

Company links

https://ats.work/

https://onlinesolutionsgroup.website/

 

Reacties