# GeoIP Shop Blocker Manager - DACH & Eurozone Version **PHP-basiertes GeoIP-Blocking und Bot-Rate-Limiting für Plesk-Server mit mehreren Shops** 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 per Rate-Limiting zu bremsen. ## 🎯 Features - ✅ **Zwei Modi**: GeoIP-Blocking oder Bot-Rate-Limiting - ✅ **Flexible Regionen**: DACH (DE, AT, CH) oder Eurozone+GB (22 Länder) - ✅ **Bot-Rate-Limiting**: Bots unter Limit durchlassen, bei Überschreitung temporär bannen - ✅ **Rate-Limiting nach Bot-Typ**: Alle IPs eines Bot-Typs teilen sich EIN Limit - ✅ **IP-basierte Bot-Erkennung**: Erkennt getarnte Bots anhand ihrer IP-Ranges (z.B. Alibaba) - ✅ **Umfangreiche Bot-Erkennung**: 321 bekannte Bot-Patterns + 32 generische Fallback-Patterns - ✅ **Präzises GeoIP-Blocking**: PHP prüft gegen vollständige IP-Ranges (keine Fehlblockierungen) - ✅ **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 (Top 50 IPs) - ✅ **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 auch hinter 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 - Cache wird alle 24 Stunden erneuert **Anwendungsfall**: Shop soll nur aus bestimmten Ländern erreichbar sein. ### Modus 2: Bot-Rate-Limiting 🤖 - Shop bleibt weltweit erreichbar - Bots werden erkannt per: 1. IP-Ranges (für getarnte Bots wie Alibaba) 2. User-Agent Patterns (321 bekannte Bots) 3. Generische Patterns (bot, crawler, spider, etc.) - **Alle IPs eines Bot-Typs teilen sich EIN Rate-Limit** - Bots unter dem Limit werden durchgelassen - Bei Überschreitung: temporärer Ban für den gesamten Bot-Typ **Anwendungsfall**: Shop soll weltweit erreichbar bleiben, aber Bots sollen gebremst werden. ## 🚦 Rate-Limiting (Bot-Modus) ### Funktionsweise Das Rate-Limiting funktioniert **nach Bot-Typ, nicht nach IP**: ``` Request kommt rein │ ▼ ┌───────────────────────┐ │ IP in Bot-IP-Ranges? │──── Ja ───▶ Bot-Typ erkannt (z.B. "Alibaba-Bot") └───────────────────────┘ │ │ Nein │ ▼ │ ┌───────────────────────┐ │ │ User-Agent Pattern? │──── Ja ───▶ Bot-Typ erkannt ◀────┘ └───────────────────────┘ │ Nein ▼ ┌───────────────────────┐ │ Generisches Pattern? │──── Ja ───▶ Bot-Typ erkannt └───────────────────────┘ │ Nein ▼ Normaler User ──────▶ Weiter (kein Limit) │ ▼ (Bot erkannt) ┌───────────────────────┐ │ Bot-Typ gebannt? │──── Ja ───▶ 403 Forbidden └───────────────────────┘ │ Nein ▼ ┌───────────────────────┐ │ Counter für Bot-Typ │ │ erhöhen. Limit? │──── Ja ───▶ Ban für Bot-Typ + 403 └───────────────────────┘ │ Nein ▼ Log + Weiter ✅ ``` **Wichtig**: - Bots werden **nicht** sofort geblockt! Sie dürfen crawlen, solange sie unter dem Limit bleiben. - **Alle IPs eines Bot-Typs teilen sich EIN Limit!** Z.B. 100 verschiedene Googlebot-IPs = 1 gemeinsames Limit. - Getarnte Bots (wie Alibaba) werden anhand ihrer IP-Ranges erkannt, unabhängig vom User-Agent. ### Konfiguration Bei Aktivierung werden zwei Werte abgefragt: ``` 🚦 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]: ``` - **Requests pro Minute**: Wie viele Requests ein Bot-Typ pro Minute machen darf (Default: 30) - **Ban-Dauer**: Wie lange ein Bot-Typ nach Überschreitung gebannt wird (Default: 5 Minuten) ## 🌐 IP-basierte Bot-Erkennung ### Problem: Getarnte Bots Manche Bots (z.B. von Alibaba Cloud) tarnen sich mit einem normalen Browser User-Agent: ``` Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36... ``` Diese wären normalerweise nicht als Bots erkennbar. **ABER**: Sie kommen immer aus bestimmten IP-Bereichen! ### Lösung: BOT_IP_RANGES Das Script enthält eine Liste bekannter Bot-IP-Ranges. Aktuell für Alibaba: | Block | Abdeckung | IPs | |-------|-----------|-----| | `43.0.0.0/9` | Alibaba Cloud Singapore | ~8.3 Mio | | `8.128.0.0/10` | Alibaba Cloud Singapore | ~4.2 Mio | | `8.208.0.0/12` | Alibaba Cloud Global | ~1 Mio | | + 34 weitere | China, HK, etc. | mehrere Mio | **Gesamt**: ~20 Millionen IPs werden als "Alibaba-Bot" erkannt. ### Erkennungsreihenfolge 1. **IP-Check (höchste Priorität)**: Liegt die IP in einem bekannten Bot-Netz? 2. **User-Agent Patterns**: Enthält der User-Agent ein bekanntes Bot-Pattern? 3. **Generische Patterns**: Enthält der User-Agent generische Bot-Begriffe? ## 🤖 Erkannte Bot-Patterns Das System erkennt **321 verschiedene Bots** in 12 Kategorien, plus **32 generische Fallback-Patterns**. ### Bot-Kategorien | Kategorie | Anzahl | Beispiele | |-----------|--------|-----------| | **AI/LLM Services** | 61 | ChatGPT-User, GPTBot, ClaudeBot, Anthropic, PerplexityBot, Gemini, Cohere, MistralAI, DeepSeekBot, Bytespider, HuggingFace, Diffbot, BedrockBot, Firecrawl, Crawl4AI | | **Suchmaschinen** | 36 | Googlebot, Googlebot-Image/Video/News, Google-Extended, Bingbot, Baiduspider, YandexBot, DuckDuckBot, Applebot, Yahoo Slurp, Sogou, NaverBot, BraveBot, PetalBot | | **SEO & Marketing** | 15 | AhrefsBot, SemrushBot, MJ12Bot, DotBot, RogerBot, Screaming Frog, BLEXBot, DataForSEOBot | | **Social Media** | 21 | FacebookBot, Meta-ExternalAgent, Twitterbot, LinkedInBot, Pinterestbot, WhatsApp, TelegramBot, DiscordBot, Slackbot, RedditBot | | **E-Commerce** | 18 | Amazonbot, **Alibaba-Bot**, AlibabaSpider, Aliyun, Shopify, Idealo, Billiger.de, Guenstiger.de, Ladenzeile, Kelkoo, PriceRunner | | **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 | | **Download & Scraper** | 48 | HTTrack, Teleport Pro, WebCopier, SiteSucker, ScrapeBox, Xenu, Grabber, WebZIP, BlackWidow | | **HTTP Libraries** | 32 | Python-Requests, cURL, Wget, Go-HTTP-Client, Axios, Node-Fetch, Scrapy, OkHttp, Guzzle | | **Security Scanner** | 11 | Nessus, SQLMap, Netsparker, Nikto, Acunetix, Burp Suite, OWASP ZAP, Nmap, 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, etc. | ### Generische Fallback-Patterns Falls ein Bot nicht in der spezifischen Liste ist, wird er erkannt wenn sein User-Agent eines dieser Wö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 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.1.0 🇩🇪🇦🇹🇨🇭 DACH | 🇪🇺 Eurozone+GB | 🤖 Bot-Rate-Limiting 🛡️ Mit Cache-Validierung und Fail-Open 🚦 Rate-Limiting nach BOT-TYP (nicht IP) 🌐 IP-basierte Erkennung: 37 Ranges für 1 Bot(s) ============================================================ ---------------------------------------- [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 ``` 🔧 Wähle den Blocking-Modus: [1] 🌍 GeoIP-Blocking (nur erlaubte Regionen) [2] 🤖 Bot-Rate-Limiting (weltweit erreichbar, Bots limitiert) Modus wählen [1/2]: ``` ### 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]: ``` ### Beispiel: Bot-Rate-Limiting aktivieren ``` 🔧 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 🌐 37 IP-Ranges für 1 getarnte Bots 🚦 Rate-Limit: 30 req/min PRO BOT-TYP ⏱️ Ban-Dauer: 5 min ℹ️ Alle Googlebot-Requests teilen sich EIN Limit! ℹ️ Alle Alibaba-IPs teilen sich EIN Limit! Gültig bis: 2025-12-19 12:00:00 CET ============================================================ ``` ### Logs anzeigen ``` ══════════════════════════════════════════════════════════════════════ 📊 shop.example.com | 🤖 Bot-Only 🤖 ══════════════════════════════════════════════════════════════════════ ⏱️ Laufzeit: 2h 15m 📈 Log-Einträge: 1,234 (9.1 req/min) 🤖 Bot-Patterns: 321 + 32 generische 🌐 IP-basierte Erkennung: 37 Ranges für 1 Bot(s) 🚦 Rate-Limit: 30 req/min PRO BOT-TYP, Ban: 5 min 🚫 Bans: 23 ausgelöst, 3 Bot-Typen aktuell gebannt Gebannt: Alibaba-Bot, GPTBot (OpenAI), Bytespider (TikTok/ByteDance) 🤖 Bot-Statistik (nach Bot-Typ): Alibaba-Bot: 456x ███████████████████████████████████████ Googlebot: 234x ███████████████████ GPTBot (OpenAI): 189x ███████████████ AhrefsBot: 123x ██████████ ... 📝 Letzte 30 Log-Einträge: [2025-12-16 10:45:23] BOT: Alibaba-Bot | IP: 43.104.26.55 | Count: 12/30 | URI: /produkt-123 [2025-12-16 10:45:24] BOT: Alibaba-Bot | IP: 43.104.27.12 | Count: 13/30 | URI: /kategorie-abc [2025-12-16 10:45:25] BANNED: Alibaba-Bot | IP: 43.104.26.99 | Exceeded 30 req/min | Ban: 5m ... 🔥 Top 10 IPs: 43.104.26.55 (Alibaba-Bot): 234x 43.104.27.12 (Alibaba-Bot): 198x 66.249.66.1 (Googlebot): 156x ... ``` ### Status anzeigen ``` 📊 3/10 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, 🚫 Alibaba-Bot shop3.example.com [Direkt] 🇪🇺 🌍 312 blocks, 1h 39m, Cache: ✅12,456 ``` ## 📁 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 blockierten Zugriffe **Bot-Rate-Limiting Modus (zusätzlich):** - `geoip_ratelimit/` - Rate-Limit Verzeichnis - `bans/` - Aktive Bans (`.ban` Dateien mit Timestamp|Bot-Name) - `counts/` - Request-Counter (`.count` Dateien) ### System-weit - `/var/lib/geoip/active_shops.json` - Tracking aktiver Shops ## ⚙️ Konfiguration anpassen ### 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 ... }, } ``` ### Eigene Bot-IP-Ranges hinzufügen ```python BOT_IP_RANGES = { 'Alibaba-Bot': [ '43.0.0.0/9', # ... bestehende Ranges ], # Neuen Bot hinzufügen: 'MeinBot': [ '192.0.2.0/24', '198.51.100.0/24', ], } ``` **Wichtig**: Nach Änderungen müssen die Shops neu aktiviert werden (deaktivieren + aktivieren)! ### Link11-IP ändern ```python LINK11_IP = "128.65.223.106" # Hier ändern ``` ## 🛡️ Was wird geblockt? ### GeoIP-Modus - ✅ Alle IPs außerhalb der konfigurierten Region → HTTP 403 - ✅ Private IPs (192.168.x.x, 10.x.x.x) werden durchgelassen - ✅ Localhost (127.0.0.1) wird durchgelassen ### Bot-Rate-Limiting Modus - ✅ Erkannte Bot-Typen die das Rate-Limit überschreiten → Temporärer Ban - ✅ Getarnte Bots (wie Alibaba) werden per IP erkannt - ❌ Bots unter dem Limit werden durchgelassen (gewollt!) - ❌ Normaler User-Traffic wird nie geblockt ## 🐛 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 Domain-User) chmod -R 777 /var/www/vhosts/SHOP/httpdocs/geoip_ratelimit/ ``` ### Alibaba-Bot wird nicht erkannt ```bash # Prüfe ob die IP im Range liegt python3 -c "import ipaddress; print(ipaddress.ip_address('43.104.26.55') in ipaddress.ip_network('43.0.0.0/9'))" # Sollte "True" ausgeben # Prüfe Version (muss 4.1.0+ sein) grep "v4." geoip_shop_manager.py ``` Nach Update: Shops neu aktivieren (deaktivieren + aktivieren). ### GeoIP-Cache lädt nicht ```bash # Manuell testen ob ipdeny.com erreichbar ist curl -I https://www.ipdeny.com/ipblocks/data/aggregated/de-aggregated.zone # Cache-Datei prüfen ls -la /var/www/vhosts/SHOP/httpdocs/geoip_ip_ranges.cache ``` Bei Fail-Open: Traffic wird durchgelassen wenn Cache nicht geladen werden kann. ## 📊 Performance ### GeoIP-Modus - **Overhead pro Request**: ~2-8ms (bei gecachten IP-Ranges) - **Erster Request**: ~400-800ms (beim Download der IP-Ranges) - **Cache-Dauer**: 24 Stunden ### Bot-Rate-Limiting Modus - **Overhead pro Request**: ~1-3ms (File-I/O) - **IP-Range-Check**: ~0.5ms - **Ban-Check**: ~0.5ms (schneller Pfad) ## 📝 Log-Analyse ### Blockierte Zugriffe anzeigen ```bash # Alle Logs für einen Shop tail -f /var/www/vhosts/SHOP/httpdocs/geoip_blocked.log # Nur gebannte Bots grep "BANNED:" /var/www/vhosts/SHOP/httpdocs/geoip_blocked.log # Nur Alibaba grep "Alibaba-Bot" /var/www/vhosts/SHOP/httpdocs/geoip_blocked.log ``` ### Bot-Statistik erstellen ```bash # Top 10 Bot-Typen grep -oP '(BOT|BANNED): \K[^|]+' /var/www/vhosts/SHOP/httpdocs/geoip_blocked.log | \ sort | uniq -c | sort -rn | head -10 ``` ## 📚 Changelog ### v4.1.0 - **NEU**: IP-basierte Bot-Erkennung für getarnte Bots - **NEU**: `BOT_IP_RANGES` mit Alibaba Cloud IP-Ranges (~20 Mio IPs) - **NEU**: Alibaba-Bot wird auch per User-Agent erkannt - **NEU**: IP-Check hat höchste Priorität (vor User-Agent) ### v4.0.0 - **NEU**: Rate-Limiting nach Bot-Typ (nicht IP) - **ENTFERNT**: CrowdSec-Integration komplett entfernt - **VEREINFACHT**: Nur noch 2 Modi (GeoIP / Bot-Rate-Limiting) - Alle IPs eines Bot-Typs teilen sich ein Limit ### v3.5.0 - Erweiterte Bot-Erkennung mit 321 Bot-Patterns - 32 generische Fallback-Patterns ### v3.4.x - File-basiertes Rate-Limiting - Verbessertes Logging ### v3.3.0 - Option "Nur direkte Shops" (ohne Link11) - Link11-Erkennung per DNS ### v3.2.0 - Bot-Only Modus eingeführt - Multi-Shop-Management ### v3.0.0 - DACH-Support - Eurozone+GB Region - Cache-Validierung mit Fail-Open --- **Version**: 4.1.0 **Letztes Update**: Dezember 2025 **Status**: Production Ready ✅ **Bot-Patterns**: 321 spezifisch + 32 generisch **Bot-IP-Ranges**: 37 Ranges für Alibaba (~20 Mio IPs) **Modi**: 🌍 GeoIP-Blocking | 🤖 Bot-Rate-Limiting