Ein wiederverwendbarer Caddy-Snippet der aggressive Scraper, Automations-Tools und Rechenzentrums-IPs blockt — ohne legitime Suchmaschinen (Googlebot, Bingbot) auszusperren.
Standard-Caddy-Setups sind offen für alles. Das bedeutet:
- Scraper saugen deinen Content ab (für KI-Training, Content-Klau)
- Vulnerability-Scanner (zgrab, masscan) probieren pausenlos Exploits
- Rechenzentrums-Botnetze (AWS, Hetzner, DigitalOcean-Ranges) hämmern deine API
Aber: Du willst auf keinen Fall Googlebot oder Bingbot blocken — sonst verschwindet deine Site aus der Suche.
Dieser Snippet macht genau die richtige Balance: Automations-User-Agents + Datacenter-IPs raus, Suchmaschinen + echte Nutzer rein.
- Snippet in deine
Caddyfile(oder ein separates importiertes File) einfügen — siehebotblock.caddy - In jedem Site-Block wo du den Schutz willst:
import botblock
(botblock) {
# UA-Block gilt NUR für externe (öffentliche) IPs — interne Health-Checks
# (curl/python von localhost) bleiben ausgenommen.
@bad_ua {
header_regexp User-Agent "(?i)(curl/|wget/|python-requests|python-urllib|python-httpx|libwww|scrapy|go-http-client|node-fetch|axios/|okhttp|httpx|harvest|masscan|zgrab)"
not client_ip 127.0.0.0/8 ::1 10.0.0.0/8 172.16.0.0/12 192.168.0.0/16 169.254.0.0/16 fc00::/7
}
handle @bad_ua {
respond "Forbidden" 403
}
# Bekannte Datacenter-/Cloud-Ranges (AWS, GCP, Azure, DigitalOcean, Hetzner, OVH, Linode, Alibaba)
@datacenter {
client_ip 43.128.0.0/10 170.106.0.0/16 49.51.0.0/16 3.0.0.0/9 18.128.0.0/9 52.0.0.0/10 54.64.0.0/11 34.64.0.0/10 35.184.0.0/13 20.0.0.0/8 40.64.0.0/10 104.131.0.0/16 138.68.0.0/16 159.65.0.0/16 165.227.0.0/16 167.99.0.0/16 134.209.0.0/16 157.230.0.0/16 178.128.0.0/16 206.189.0.0/16 5.9.0.0/16 88.99.0.0/16 116.202.0.0/16 135.181.0.0/16 148.251.0.0/16 159.69.0.0/16 168.119.0.0/16 176.9.0.0/16 94.130.0.0/16 95.216.0.0/15 65.108.0.0/15 51.68.0.0/14 51.75.0.0/16 51.83.0.0/16 178.32.0.0/15 188.165.0.0/16 45.79.0.0/16 172.104.0.0/15
}
handle @datacenter {
respond "Forbidden" 403
}
}
example.com {
import botblock
respond "Hello, real visitor!"
}- Googlebot — der echte Googlebot nutzt keinen curl-UA, kommt also durch
- Bingbot, DuckDuckBot, echte Browser — alle mit normalem Mozilla-UA
- localhost / interne Health-Checks — explizit ausgenommen per IP-Range
| Kategorie | Beispiele |
|---|---|
| CLI-Tools | curl, wget, httpie |
| Script-Libraries | python-requests, python-httpx, node-fetch, axios, okhttp, go-http-client |
| Scraper-Frameworks | scrapy, harvest |
| Security-Scanner | masscan, zgrab |
| Datacenter-IPs | AWS, GCP, Azure, DigitalOcean, Hetzner, OVH, Linode, Alibaba Cloud |
# Sollte 200 geben (echter Browser-UA):
curl -A "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 Chrome/126.0" https://deine-site.de
# Sollte 403 geben (curl-UA):
curl https://deine-site.de
# Sollte 200 geben (Googlebot):
curl -A "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)" https://deine-site.de- UA-Spoofing: Ein Angreifer der einen Browser-UA fälscht kommt durch. Dieser Snippet stoppt die 95 % dummen Bots, nicht die gezielten Angriffe. Für die brauchst du zusätzlich Rate-Limiting + WAF (z. B. Cloudflare davor).
- Datacenter-Ranges veralten: Cloud-Anbieter fügen IP-Ranges hinzu. Die Liste hier ist Stand 2026 — für Aktualität regelmäßig gegen die offiziellen Range-Listen abgleichen (AWS:
ip-ranges.amazonaws.com/ip-ranges.json). - Legitime API-Nutzer: Wenn du eine öffentliche API anbietest die von Scripten genutzt werden soll, schließe die entsprechenden Pfade vom botblock aus (
handle /api/public/* { ... }ohneimport botblock).
Läuft produktiv auf allen Backend-Services von moersbergerit.de — u. a. 8 Web-Apps hinter Cloudflare-Tunnels.
MIT
Marvin Mörsberger — MörsbergerIT · Website-Entwicklung