GeoIP Shop Blocker Manager - DACH & Eurozone Version
PHP-basiertes System für temporäres GeoIP-Blocking und Bot-Rate-Limiting auf Plesk-Servern
Dieses Tool ermöglicht es, einzelne oder alle Shops auf einem Plesk-Server temporär für alle Zugriffe außerhalb der konfigurierten Region zu sperren, oder Bots nach Bot-Typ zu rate-limitieren.
🎯 Features
- ✅ Flexible Regionen: DACH (DE, AT, CH) oder Eurozone+GB (22 Länder)
- ✅ Bot-Rate-Limiting nach Bot-Typ: Alle Requests eines Bot-Typs teilen sich EIN Limit
- ✅ Umfangreiche Bot-Erkennung: 321 bekannte Bot-Patterns + 32 generische Fallback-Patterns
- ✅ Präzises Blocking: PHP prüft gegen vollständige IP-Ranges (keine Fehlblockierungen)
- ✅ Zwei Modi: GeoIP-Blocking oder Bot-Rate-Limiting
- ✅ Multi-Shop-Management: Verwaltung mehrerer Shops auf einem Server
- ✅ Bulk-Operationen: Alle Shops gleichzeitig aktivieren/deaktivieren
- ✅ Link11-Erkennung: Automatische Erkennung ob Shop hinter Link11 CDN steht
- ✅ Nur direkte Shops: Option um nur Shops ohne CDN-Schutz zu aktivieren
- ✅ Gesamtübersicht: Logs und Statistiken über alle Shops hinweg
- ✅ Auto-Deaktivierung: Blocking läuft nach 72 Stunden automatisch ab
- ✅ Sauberes Cleanup: Vollständige Deinstallation bei Deaktivierung
- ✅ Plesk-kompatibel: Funktioniert mit Plesk-verwalteten Shops
- ✅ CDN-kompatibel: Funktioniert mit Link11, Cloudflare & Co.
- ✅ Fail-Open: Bei Cache-Fehlern wird Traffic durchgelassen (keine Ausfälle)
🏗️ Architektur
Modus 1: GeoIP-Blocking 🌍
- PHP-Script wird in die
index.phpdes Shops integriert - Lädt IP-Ranges von ipdeny.com (konfigurierte Länder)
- Prüft jede Anfrage gegen diese Ranges
- Blockt nicht-erlaubte IPs sofort mit HTTP 403
- Loggt alle Blocks
Modus 2: Bot-Rate-Limiting 🤖
- Shop bleibt weltweit erreichbar
- Erkennt Bots anhand von User-Agent Patterns
- Rate-Limit gilt PRO BOT-TYP (nicht pro IP!)
- Alle Googlebot-Requests teilen sich EIN Limit
- Bei Überschreitung: Gesamter Bot-Typ wird temporär gebannt
🚦 Rate-Limiting (Bot-Only Modus)
Funktionsweise
Bot-Request kommt rein
│
▼
┌───────────────────┐
│ Bot-Typ gebannt? │──── Ja ───▶ 403 + Exit (sofort)
└───────────────────┘
│ Nein
▼
┌───────────────────┐
│ Bot erkannt? │──── Nein ──▶ Weiter (normaler Traffic)
└───────────────────┘
│ Ja
▼
┌───────────────────┐
│ Bot-Typ Counter │
│ erhöhen │
│ Limit erreicht? │──── Ja ───▶ Bot-Typ bannen + 403
└───────────────────┘
│ Nein
▼
Log + Weiter ✅
(Bot darf durch!)
Wichtig: Rate-Limit pro Bot-Typ
Alle Requests eines Bot-Typs teilen sich EINEN Zähler, unabhängig von:
- Der IP-Adresse
- Der genauen User-Agent Variante
Beispiel mit Limit 30 req/min:
| Request | IP | User-Agent | Bot-Typ | Zähler |
|---|---|---|---|---|
| 1 | 1.1.1.1 | Googlebot/2.1 | Googlebot | 1/30 |
| 2 | 2.2.2.2 | Googlebot/2.1 (+http...) | Googlebot | 2/30 |
| 3 | 3.3.3.3 | Googlebot-Image/1.0 | Googlebot-Image | 1/30 |
| ... | ... | ... | ... | ... |
| 31 | 99.99.99.99 | Googlebot/2.1 | Googlebot | 31/30 → BAN |
Nach dem Ban werden ALLE Googlebot-Requests geblockt (egal welche IP).
Konfiguration bei Aktivierung
🚦 Rate-Limit Konfiguration:
(0 = Bots sofort bannen, kein Rate-Limiting)
⚠️ ACHTUNG: Limit gilt pro Bot-TYP, nicht pro IP!
Requests pro Minute bevor Ban [30]:
Ban-Dauer in Minuten [5]:
✅ Rate-Limit: 30 req/min pro Bot-Typ
✅ Ban-Dauer: 5 Minuten
Technische Details
- Identifier: MD5-Hash des erkannten Bot-Namens (z.B.
md5("Googlebot")) - Speicherung: File-basiert in
geoip_ratelimit/Verzeichnis - Ban-Format:
timestamp|botname(ermöglicht Anzeige des Bot-Namens) - Cleanup: Probabilistisch (1% der Requests) um Overhead zu minimieren
- Atomare Operationen: File-Locking verhindert Race Conditions
Verzeichnisstruktur
httpdocs/
├── geoip_ratelimit/
│ ├── bans/
│ │ └── {bot_hash}.ban # Format: unix_timestamp|bot_name
│ └── counts/
│ └── {bot_hash}.count # Format: window_start|count
🤖 Erkannte Bot-Patterns
Das System erkennt 321 verschiedene Bots in 12 Kategorien, plus 32 generische Fallback-Patterns für unbekannte Bots.
Bot-Kategorien
| Kategorie | Anzahl | Beispiele |
|---|---|---|
| AI/LLM Services | 61 | ChatGPT-User, GPTBot, ClaudeBot, Anthropic, PerplexityBot, Gemini-Deep-Research, Google-NotebookLM, Cohere, MistralAI, DeepSeekBot, Bytespider, HuggingFace, Diffbot, BedrockBot, Firecrawl, Crawl4AI |
| Suchmaschinen | 36 | Googlebot, Googlebot-Image/Video/News, Google-Extended, Bingbot, BingPreview, MSNBot, Baiduspider, YandexBot, DuckDuckBot, Applebot, Yahoo Slurp, Sogou, NaverBot, BraveBot, QwantBot, PetalBot |
| SEO & Marketing | 15 | AhrefsBot, SemrushBot, MJ12Bot, DotBot, RogerBot, Screaming Frog, BLEXBot, DataForSEOBot, Linkdex, SearchmetricsBot |
| Social Media | 21 | FacebookBot, Meta-ExternalAgent, Twitterbot, Instagram, LinkedInBot, Pinterestbot, WhatsApp, TelegramBot, DiscordBot, Slackbot, RedditBot, Snapchat |
| E-Commerce | 15 | Amazonbot, Amazon-Kendra, AmazonBuyForMe, Shopify, Idealo, Billiger.de, Guenstiger.de, Ladenzeile, Kelkoo, PriceRunner, PriceGrabber |
| Archiv & Research | 6 | Archive.org Bot, Internet Archive, Wayback Machine, Heritrix, Apache Nutch, Common Crawl |
| Monitoring & Uptime | 9 | UptimeRobot, Pingdom, StatusCake, Site24x7, NewRelic, Datadog, GTmetrix, PageSpeed Insights, Chrome Lighthouse |
| Download & Scraper | 48 | HTTrack, Teleport Pro, WebCopier, SiteSucker, ScrapeBox, Xenu, Grabber, Harvest, Collector, WebZIP, BlackWidow |
| HTTP Libraries | 32 | Python-Requests, Python-urllib, cURL, Wget, Go-HTTP-Client, Axios, Node-Fetch, Scrapy, OkHttp, Guzzle, libwww-perl, Mechanize |
| Security Scanner | 11 | Nessus, SQLMap, Netsparker, Nikto, Acunetix, Burp Suite, OWASP ZAP, OpenVAS, Nmap, Masscan, WPScan |
| Headless & Automation | 7 | PhantomJS, Headless Chrome, Selenium, Puppeteer, Playwright, Cypress |
| Feed Reader & RSS | 5 | FeedFetcher, FeedParser, Feedly, Inoreader, NewsBlur |
| Weitere Bots | 55 | OmgiliBot, Webzio, Linguee, QuillBot, TurnitinBot, Brandwatch, Meltwater, BitlyBot, Mail.ru Bot, und viele mehr |
Generische Fallback-Patterns
Falls ein Bot nicht in der spezifischen Liste ist, wird er trotzdem erkannt wenn sein User-Agent eines dieser Schlüsselwörter enthält:
bot, crawler, spider, scraper, fetch, scan, check, monitor, probe, index,
archive, capture, reader, download, mirror, ripper, collector, extractor,
siphon, copier, sucker, bandit, stripper, whacker, reaper, robot, agent,
seeker, finder, walker, roam, snagger
Diese werden dann als Bot (crawler), Bot (spider), etc. angezeigt.
📋 Voraussetzungen
- Betriebssystem: Ubuntu Server (getestet auf 24.04)
- Webserver: Apache mit mod_rewrite (oder nginx)
- PHP: Version 8.0 oder höher
- Python: Version 3.8 oder höher
- Plesk: Optional, aber empfohlen
- Root-Zugriff: Erforderlich für Installation und Verwaltung
🚀 Installation
1. Script herunterladen
# Als root
cd /root
wget https://git.jtl-hosting.de/thomasciesla/geoip_shop_manager/raw/branch/main/geoip_shop_manager.py
chmod +x geoip_shop_manager.py
2. Script ausführen
python3 geoip_shop_manager.py
Das war's! Das Script ist vollständig selbstverwaltend.
📖 Verwendung
Hauptmenü
============================================================
GeoIP Shop Blocker Manager v4.0.0
🇩🇪🇦🇹🇨🇭 DACH | 🇪🇺 Eurozone+GB | 🤖 Bot-Rate-Limiting
🛡️ Mit Cache-Validierung und Fail-Open
🚦 Rate-Limiting nach BOT-TYP (nicht IP)
============================================================
[1] Aktivieren (einzeln)
[2] Deaktivieren (einzeln)
[3] Logs anzeigen
[4] Status
────────────────────────────────────────
[5] 🚀 ALLE aktivieren
[6] 🛑 ALLE deaktivieren
[7] 🎯 Nur DIREKTE aktivieren (ohne Link11)
────────────────────────────────────────
[0] Beenden
Modus-Auswahl
Bei jeder Aktivierung wird nach dem Modus gefragt:
🔧 Wähle den Blocking-Modus:
[1] 🌍 GeoIP-Blocking (nur erlaubte Regionen)
[2] 🤖 Bot-Rate-Limiting (weltweit erreichbar, Bots limitiert)
Modus wählen [1/2]:
Wann welchen Modus wählen?
| Situation | Empfohlener Modus |
|---|---|
| Nur bestimmte Länder erlauben | GeoIP-Blocking 🌍 |
| Weltweit erreichbar bleiben, nur Bots bremsen | Bot-Rate-Limiting 🤖 |
| Aggressive Bots stoppen (verteilt über viele IPs) | Bot-Rate-Limiting 🤖 |
Geo-Region wählen (nur GeoIP-Modus)
🌍 Wähle die Geo-Region:
[1] 🇩🇪🇦🇹🇨🇭 DACH - Deutschland, Österreich, Schweiz
[2] 🇪🇺 Eurozone+GB - 22 Länder
Region wählen [1/2]:
Beispielausgabe: Bot-Only Aktivierung
🔧 Aktiviere 🤖 Bot-Only für: shop.example.com
Modus: Bot-Rate-Limiting nach Bot-Typ (weltweit erreichbar)
Rate-Limit: 30 req/min pro Bot-Typ, Ban: 5 min
============================================================
[1/3] Aktiviere PHP-Blocking...
✅ PHP-Blocking aktiviert
[2/3] Cache-Generierung nicht erforderlich (Bot-Only)
[3/3] Registriere Shop...
============================================================
✅ 🤖 Bot-Only aktiviert
Shop: shop.example.com
Modus: Bot-Rate-Limiting 🤖
🤖 321 Bot-Patterns + 32 generische Patterns
🚦 Rate-Limit: 30 req/min PRO BOT-TYP
⏱️ Ban-Dauer: 5 min
ℹ️ Alle Googlebot-Requests teilen sich EIN Limit!
Gültig bis: 2025-12-19 19:30:00 CET
============================================================
Logs anzeigen - Gesamtübersicht
══════════════════════════════════════════════════════════════════════
📊 GESAMTÜBERSICHT ALLER SHOPS
══════════════════════════════════════════════════════════════════════
Grün = hinter Link11 | Rot = Direkt
🚫 AKTUELL GEBANNTE BOT-TYPEN: AhrefsBot, Bytespider (TikTok/ByteDance), SemrushBot
📝 Log-Einträge gesamt: 1,234 (⌀ 5.2 req/min, Laufzeit: 3h 57m)
├─ shop1.example.com 🤖 🤖: 456 (3.8 req/min, seit 2h 0m) ███████
│ ├─➤ Googlebot: 234x, 1.9 req/min
│ ├─➤ Bingbot (Microsoft): 123x, 1.0 req/min
│ └─➤ AhrefsBot: 99x, 0.8 req/min
├─ shop2.example.com 🤖 🤖: 778 (6.5 req/min, seit 2h 0m) █████████████
│ ├─➤ Bytespider (TikTok/ByteDance): 456x, 3.8 req/min
│ ├─➤ GPTBot (OpenAI): 189x, 1.6 req/min
│ └─➤ ClaudeBot (Anthropic): 133x, 1.1 req/min
🚫 Rate-Limit Bans: 5 ausgelöst, 3 Bot-Typen aktuell gebannt
├─ shop1.example.com: 2 bans (1 Bot-Typen aktiv) █
│ └─🚫 AhrefsBot
├─ shop2.example.com: 3 bans (2 Bot-Typen aktiv) █
│ └─🚫 Bytespider (TikTok/ByteDance)
│ └─🚫 SemrushBot
🤖 Bot-Statistik nach Bot-Typ (alle Shops):
Googlebot: 456x ███████████████████████████████████████
Bytespider (TikTok/ByteDance): 389x ████████████████████████████████
Bingbot (Microsoft): 234x ███████████████████
GPTBot (OpenAI): 189x ███████████████
...
Logs anzeigen - Einzelner Shop
══════════════════════════════════════════════════════════════════════
📊 shop.example.com | 🤖 Bot-Only 🤖
══════════════════════════════════════════════════════════════════════
⏱️ Laufzeit: 2h 15m
📈 Log-Einträge: 1,234 (9.1 req/min)
🤖 Bot-Patterns: 321 + 32 generische
🚦 Rate-Limit: 30 req/min PRO BOT-TYP, Ban: 5 min
🚫 Bans: 3 ausgelöst, 2 Bot-Typen aktuell gebannt
Gebannt: AhrefsBot, Bytespider (TikTok/ByteDance)
🤖 Bot-Statistik (nach Bot-Typ):
Googlebot: 456x ███████████████████████████████████████
Bingbot (Microsoft): 234x ███████████████████
GPTBot (OpenAI): 189x ███████████████
AhrefsBot: 123x ██████████
...
Status anzeigen
📊 5/15 Shops aktiv
shop1.example.com [Link11] 🇩🇪🇦🇹🇨🇭 🌍
523 blocks, 1h 41m, Cache: ✅8,234
shop2.example.com [Direkt] 🤖 🤖
1,234 log entries, 2h 15m, 321 Patterns, 30 req/min/Bot-Typ, 🚫 AhrefsBot, SemrushBot
shop3.example.com [Direkt] 🇪🇺 🌍
312 blocks, 1h 39m, Cache: ✅12,456
🔧 Erweiterte Verwendung
Rate-Limit Dateien prüfen
# Aktive Bans anzeigen (mit Bot-Namen)
for f in /var/www/vhosts/SHOP/httpdocs/geoip_ratelimit/bans/*.ban; do
[ -f "$f" ] && echo "$(cat $f)"
done
# Request-Counter anzeigen
find /var/www/vhosts/SHOP/httpdocs/geoip_ratelimit/counts/ -name "*.count" -exec cat {} \;
# Anzahl aktiver Bans
find /var/www/vhosts/SHOP/httpdocs/geoip_ratelimit/bans/ -name "*.ban" | wc -l
Manuell einen Bot-Typ entbannen
# Alle Bans löschen für einen Shop
rm -f /var/www/vhosts/SHOP/httpdocs/geoip_ratelimit/bans/*.ban
# Alle Counter zurücksetzen
rm -f /var/www/vhosts/SHOP/httpdocs/geoip_ratelimit/counts/*.count
📁 Dateistruktur
Pro Shop (in /var/www/vhosts/SHOP/httpdocs/)
GeoIP-Modus:
index.php.geoip_backup- Backup der Original index.phpgeoip_blocking.php- PHP-Blocking-Scriptgeoip_ip_ranges.cache- Gecachte IP-Ranges (erneuert alle 24h)geoip_blocked.log- Log der Blocks
Bot-Only Modus:
index.php.geoip_backup- Backup der Original index.phpgeoip_blocking.php- PHP-Blocking-Scriptgeoip_blocked.log- Log der Bot-Requests und Bansgeoip_ratelimit/- Rate-Limit Verzeichnisbans/- Aktive Bans (.banDateien, Format:timestamp|botname)counts/- Request-Counter (.countDateien)
System-weit
/var/lib/geoip/active_shops.json- Tracking aktiver Shops
⚙️ Konfiguration
Blocking-Dauer ändern
Standardmäßig 72 Stunden. Zum Ändern editiere das Python-Script:
expiry = datetime.now() + timedelta(hours=72) # Hier ändern
Rate-Limit Defaults ändern
# Am Anfang des Scripts
DEFAULT_RATE_LIMIT = 30 # Requests pro Minute pro Bot-Typ
DEFAULT_BAN_DURATION = 5 # Minuten
Weitere Länder hinzufügen
Editiere GEO_REGIONS im Python-Script:
GEO_REGIONS = {
"dach": {
"countries": ["de", "at", "ch"], # Hier Länder hinzufügen
...
},
...
}
Link11-IP ändern
# Am Anfang des Scripts
LINK11_IP = "128.65.223.106" # Hier ändern
🛡️ Sicherheit
Was wird geblockt?
GeoIP-Modus:
- ✅ Alle IPs außerhalb der konfigurierten Region
- ✅ Sofortiger 403 Response
Bot-Only Modus:
- ✅ Erkannte Bot-Typen die das Rate-Limit überschreiten
- ✅ Temporärer Ban für den gesamten Bot-Typ
- ❌ Bots unter dem Limit werden durchgelassen (gewollt!)
Was wird NICHT geblockt?
- ✅ Alle IPs aus den erlaubten Ländern (GeoIP-Modus)
- ✅ Normaler User-Traffic (Bot-Only Modus)
- ✅ Bots unter dem Rate-Limit (Bot-Only Modus)
- ✅ Private IPs (192.168.x.x, 10.x.x.x, etc.)
- ✅ Localhost (127.0.0.1)
🐛 Troubleshooting
Shop zeigt 500 Error
# Prüfe PHP-Fehler-Log
tail -50 /var/www/vhosts/SHOP/logs/error_log
# Stelle Original-Index wieder her
cd /var/www/vhosts/SHOP/httpdocs
mv index.php.geoip_backup index.php
Rate-Limit funktioniert nicht
# Prüfe Verzeichnis-Berechtigungen
ls -la /var/www/vhosts/SHOP/httpdocs/geoip_ratelimit/
# Sollte 777 sein (PHP läuft als anderer User)
# Falls nicht:
chmod -R 777 /var/www/vhosts/SHOP/httpdocs/geoip_ratelimit/
Bots werden nicht erkannt
Prüfe ob der User-Agent in den Bot-Patterns enthalten ist:
# Im Log nach unbekannten Bots suchen
grep "Bot (.*)" /var/www/vhosts/SHOP/httpdocs/geoip_blocked.log
Unbekannte Bots werden als Bot (crawler), Bot (spider), etc. erkannt, wenn sie generische Keywords enthalten.
Rate-Limit Verzeichnisse sind leer trotz Bot-Traffic
Berechtigungsproblem! Das Python-Script läuft als root, aber PHP läuft als Domain-User.
# Quick-Fix für alle Shops:
for dir in /var/www/vhosts/*/httpdocs/geoip_ratelimit; do
[ -d "$dir" ] && chmod -R 777 "$dir" && echo "Fixed: $dir"
done
📊 Performance
PHP-Level Blocking (GeoIP)
- Overhead pro Request: ~2-8ms (bei gecachten IP-Ranges)
- Erster Request: ~400-800ms (beim Download der IP-Ranges)
- Cache-Dauer: 24 Stunden
- RAM-Verbrauch: ~5-10 MB pro Shop
Bot-Rate-Limiting
- Overhead pro Request: ~1-3ms (File-I/O)
- Ban-Check: ~0.5ms (schneller Pfad)
- Cleanup: Probabilistisch (1% der Requests)
📝 Logs und Monitoring
PHP-Level Logs
# Alle Log-Einträge für einen Shop
tail -f /var/www/vhosts/SHOP/httpdocs/geoip_blocked.log
# Nur BANNED Einträge (Rate-Limit überschritten)
grep "BANNED:" /var/www/vhosts/SHOP/httpdocs/geoip_blocked.log
# Nur BOT Einträge (unter Limit, durchgelassen)
grep "BOT:" /var/www/vhosts/SHOP/httpdocs/geoip_blocked.log
# Nur BLOCKED Einträge (bereits gebannter Bot)
grep "BLOCKED (banned):" /var/www/vhosts/SHOP/httpdocs/geoip_blocked.log
Bot-Statistik erstellen
# Top 10 Bots (aus Log)
grep -oP '(BOT|BANNED): \K[^|]+' /var/www/vhosts/SHOP/httpdocs/geoip_blocked.log | \
sed 's/ //g' | sort | uniq -c | sort -rn | head -10
📚 Changelog
v4.0.0
- BREAKING: CrowdSec-Integration komplett entfernt
- BREAKING: Rate-Limiting jetzt nach Bot-Typ statt IP+UA
- NEU: Alle Requests eines Bot-Typs teilen sich EIN Limit
- NEU: Ban-Dateien speichern Bot-Namen (
timestamp|botname) - NEU: Anzeige der aktuell gebannten Bot-Typen mit Namen
- NEU: Top 3 Bot-Typen pro Shop in Gesamtübersicht
- NEU: Vereinfachte Modi: nur noch
geoipundbot - ENTFERNT: Watcher-Service (nicht mehr benötigt)
- ENTFERNT: CrowdSec Queue-Dateien
- ENTFERNT: Alle CrowdSec-Funktionen
v3.5.0
- Erweiterte Bot-Erkennung mit 321 Bot-Patterns
- 12 Bot-Kategorien
- 32 generische Fallback-Patterns
v3.4.x
- Rate-Limit Logik korrigiert
- Verzeichnis-Berechtigungen (0o777)
- Bot-Namen in Statistiken
v3.3.0
- Option [7] - Nur direkte Shops aktivieren
- Link11-Erkennung per DNS-Lookup
- Farbcodierung im Menü
v3.2.0
- Bot-Only Blocking Modus
- 4 Blocking-Modi
v3.1.0
- Eurozone+GB Region (22 Länder)
- Cache-Validierung
- Fail-Open Mechanismus
v3.0.0
- DACH-Support
- CrowdSec-Integration
- Multi-Shop-Management
Version: 4.0.0
Letztes Update: Dezember 2025
Status: Production Ready ✅
Bot-Patterns: 321 spezifisch + 32 generisch = 353 total
Rate-Limiting: Pro Bot-Typ (nicht pro IP)
Erlaubte Regionen: 🇩🇪🇦🇹🇨🇭 DACH | 🇪🇺 Eurozone+GB | 🤖 Bot-Only (weltweit)