# 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.php` des 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 ```bash # 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 ```bash 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 ```bash # 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 ```bash # 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.php - `geoip_blocking.php` - PHP-Blocking-Script - `geoip_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.php - `geoip_blocking.php` - PHP-Blocking-Script - `geoip_blocked.log` - Log der Bot-Requests und Bans - `geoip_ratelimit/` - Rate-Limit Verzeichnis - `bans/` - Aktive Bans (`.ban` Dateien, Format: `timestamp|botname`) - `counts/` - Request-Counter (`.count` Dateien) ### 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: ```python expiry = datetime.now() + timedelta(hours=72) # Hier ändern ``` ### Rate-Limit Defaults ändern ```python # 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: ```python GEO_REGIONS = { "dach": { "countries": ["de", "at", "ch"], # Hier Länder hinzufügen ... }, ... } ``` ### Link11-IP ändern ```python # 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 ```bash # 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 ```bash # 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: ```bash # 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. ```bash # 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 ```bash # 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 ```bash # 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 `geoip` und `bot` - **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)