# GeoIP Shop Blocker Manager - DACH & Eurozone Version **Hybrid-System für temporäres GeoIP-Blocking und Bot-Blocking auf Plesk-Servern 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 gewählten Region zu sperren oder nur bekannte Bots/Crawler zu blockieren. Es kombiniert PHP-Level-Blocking mit optionaler CrowdSec Firewall-Integration für maximalen Schutz. ## 🎯 Features ### Geo-Regionen - ✅ **DACH-Region**: Deutschland (DE), Österreich (AT), Schweiz (CH) - 3 Länder - ✅ **Eurozone+GB**: 22 Länder (DE, AT, CH, BE, CY, EE, ES, FI, FR, GB, GR, HR, IE, IT, LT, LU, LV, MT, NL, PT, SI, SK) ### Blocking-Modi - ✅ **GeoIP + CrowdSec** 🛡️: Geo-Blocking mit Firewall-Integration - ✅ **Nur GeoIP** 📝: Geo-Blocking ohne CrowdSec (ideal für CDN) - ✅ **Bot-Block + CrowdSec** 🤖🛡️: Nur Bots blockieren, Shop weltweit erreichbar - ✅ **Nur Bot-Block** 🤖: Nur Bots blockieren, ohne CrowdSec ### Allgemein - ✅ **30+ Bot-Patterns**: GPTBot, ClaudeBot, Googlebot, AhrefsBot, SemrushBot, etc. - ✅ **Präzises Blocking**: PHP prüft gegen vollständige IP-Ranges (keine Fehlblockierungen) - ✅ **Doppelter Schutz**: PHP-Level + Firewall-Level (CrowdSec) - optional - ✅ **Automatische Synchronisation**: Blockierte IPs werden automatisch an CrowdSec weitergegeben - ✅ **Multi-Shop-Management**: Verwaltung mehrerer Shops auf einem Server - ✅ **Bulk-Operationen**: Alle Shops gleichzeitig aktivieren/deaktivieren - ✅ **Gesamtübersicht**: Logs und Statistiken über alle Shops hinweg (Top 50 IPs) - ✅ **Bot-Statistiken**: Auswertung welche Bots wie oft geblockt wurden - ✅ **Auto-Deaktivierung**: Blocking läuft nach 72 Stunden automatisch ab - ✅ **Fail-Open**: Bei Cache-Fehlern wird Traffic durchgelassen (kein Lockout) - ✅ **Cache-Validierung**: IP-Ranges werden vor Aktivierung validiert - ✅ **Link11-Erkennung**: Zeigt an ob Shop hinter Link11 CDN steht - ✅ **Systemd-Service**: Automatischer Start beim Booten - ✅ **Sauberes Cleanup**: Vollständige Deinstallation bei Deaktivierung - ✅ **Plesk-kompatibel**: Funktioniert mit Plesk-verwalteten Shops - ✅ **CDN-kompatibel**: PHP-only Modi für Link11, Cloudflare & Co. ## 🏗️ Architektur ### Modus 1: GeoIP + CrowdSec 🛡️ #### Komponente 1: PHP-Script - Wird in die `index.php` des Shops integriert - Lädt IP-Ranges der gewählten Region von ipdeny.com - Prüft jede Anfrage gegen diese Ranges - Blockt Nicht-Region-IPs sofort mit HTTP 403 - Schreibt blockierte IPs in Queue-Datei für CrowdSec #### Komponente 2: Python Watcher (systemd service) - Läuft permanent im Hintergrund als root - Überwacht Queue-Dateien aller aktiven Shops - Fügt blockierte IPs automatisch zu CrowdSec hinzu - Vermeidet Duplikate durch In-Memory-Cache - Prüft alle 5 Sekunden auf neue IPs #### Komponente 3: CrowdSec Firewall Bouncer - Blockiert IPs auf Firewall-Ebene (iptables/nftables) - Schützt ALLE Services (HTTP, HTTPS, SSH, FTP, etc.) - Übernimmt Bans für 72 Stunden - Deutlich performanter als PHP-Checks ### Modus 2: Nur GeoIP 📝 - Nur das PHP-Script wird aktiviert - Keine CrowdSec-Synchronisation - Kein Watcher-Service nötig - **Ideal für Server hinter CDN/Proxy** (Link11, Cloudflare, etc.) ### Modus 3: Bot-Block + CrowdSec 🤖🛡️ - Blockiert nur bekannte Bots/Crawler anhand des User-Agents - Shop bleibt **weltweit für normale Besucher erreichbar** - Blockierte Bot-IPs werden an CrowdSec gemeldet - Kein IP-Range-Cache nötig (schnelle Aktivierung) ### Modus 4: Nur Bot-Block 🤖 - Blockiert nur bekannte Bots/Crawler - Keine CrowdSec-Synchronisation - **Ideal für Bot-Schutz ohne Geo-Einschränkungen** > **Hinweis**: Bei Servern hinter einem CDN/Reverse-Proxy (wie Link11, Cloudflare, Hetzner LB) sieht iptables nur die Proxy-IP, nicht die echte Client-IP. In diesem Fall sind die **PHP-only Modi** (📝 oder 🤖) die bessere Wahl. ## 🤖 Blockierte Bots Das Script blockiert über 30 bekannte Bots und Crawler: | Kategorie | Bots | |-----------|------| | **AI-Crawler** | GPTBot, OAI-SearchBot, ChatGPT-User, ClaudeBot, Claude-User, anthropic-ai, PerplexityBot | | **Suchmaschinen** | Googlebot, Google-Extended, AdsBot-Google, Bingbot, BingPreview, msnbot, DuckDuckBot, YandexBot, Baiduspider | | **SEO-Tools** | AhrefsBot, SemrushBot, MJ12bot, DotBot, PetalBot, DataForSeoBot | | **Social Media** | FacebookBot, LinkedInBot, Twitterbot, Slackbot | | **Andere** | Applebot, Amazonbot, Bytespider, UptimeRobot, Pingdom, curl, python-requests, Wget, Scrapy | ### Eigene Bots hinzufügen Im Script unter `BOT_PATTERNS` können eigene Patterns ergänzt werden: ```python BOT_PATTERNS = { # ... bestehende ... 'MeinBot': r'MeinBot', # Einfacher Match 'Scraper123': r'[Ss]craper-?\d+', # Mit Regex 'BadCrawler': r'BadCrawler|EvilBot', # Mehrere Varianten } ``` ## 📋 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 - **CrowdSec**: Installiert und aktiv (nur für +CrowdSec Modi) - **CrowdSec Firewall Bouncer**: Installiert und konfiguriert (nur für +CrowdSec Modi) - **Plesk**: Optional, aber empfohlen - **Root-Zugriff**: Erforderlich für Installation und Verwaltung ### CrowdSec Installation prüfen (nur für +CrowdSec Modi) ```bash # Prüfe ob CrowdSec läuft systemctl status crowdsec # Prüfe ob Firewall Bouncer aktiv ist cscli bouncers list # Sollte zeigen: # cs-firewall-bouncer-... mit ✔️ Valid und Recent Last API pull ``` Falls CrowdSec noch nicht installiert ist: ```bash curl -s https://packagecloud.io/install/repositories/crowdsec/crowdsec/script.deb.sh | sudo bash apt-get update apt-get install crowdsec crowdsec-firewall-bouncer-iptables ``` ## 🚀 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 v3.2.0 🇩🇪🇦🇹🇨🇭 DACH | 🇪🇺 Eurozone+GB | 🤖 Bot-Only 🛡️ Mit Cache-Validierung und Fail-Open ============================================================ ✅ CrowdSec ✅ Watcher-Service ---------------------------------------- [1] Aktivieren (einzeln) [2] Deaktivieren (einzeln) [3] Logs anzeigen [4] Status ---------------------------------------- [5] 🚀 ALLE aktivieren [6] 🛑 ALLE deaktivieren ---------------------------------------- [0] Beenden ``` ### Blocking-Modus wählen Bei jeder Aktivierung (einzeln oder alle) wird nach dem Modus gefragt: ``` 🔧 Wähle den Blocking-Modus: [1] 🌍 GeoIP + CrowdSec (IPs werden an CrowdSec gemeldet) [2] 🌍 Nur GeoIP (keine CrowdSec-Synchronisation) [3] 🤖 Nur Bot-Blocking (weltweit erreichbar, mit CrowdSec) [4] 🤖 Nur Bot-Blocking (weltweit erreichbar, ohne CrowdSec) Modus wählen [1/2/3/4]: ``` ### Geo-Region wählen (nur bei GeoIP-Modi) ``` 🌍 Wähle die Geo-Region: [1] 🇩🇪🇦🇹🇨🇭 DACH - Deutschland, Österreich, Schweiz [2] 🇪🇺 Eurozone+GB - 22 Länder Region wählen [1/2]: ``` **Wann welchen Modus wählen?** | Situation | Empfohlener Modus | |-----------|-------------------| | DDoS-Angriff aus Übersee | GeoIP + CrowdSec 🛡️ | | Server hinter CDN (Link11, Cloudflare) | Nur GeoIP 📝 | | Nur Bots/Crawler blocken | Nur Bot-Block 🤖 | | Bot-Schutz + Firewall-Bans | Bot-Block + CrowdSec 🤖🛡️ | | CrowdSec nicht installiert | Nur GeoIP 📝 oder Nur Bot-Block 🤖 | | Maximaler Schutz (alle Ports) | GeoIP + CrowdSec 🛡️ | ### Blocking aktivieren (einzelner Shop) 1. Script starten: `python3 geoip_shop_manager.py` 2. Option `[1] Aktivieren (einzeln)` wählen 3. Shop aus der Liste auswählen 4. **Modus wählen** (1-4) 5. **Region wählen** (nur bei GeoIP-Modi) 6. Bestätigen mit `ja` **Was passiert (GeoIP + CrowdSec Modus):** - Bei ERSTEM Shop: Systemd-Service wird installiert und gestartet - Backup der `index.php` wird erstellt - `geoip_blocking.php` wird erstellt und eingebunden - IP-Range-Cache wird generiert und validiert - Shop wird für Tracking registriert - Blocking ist sofort aktiv **Was passiert (Bot-Only Modus):** - Backup der `index.php` wird erstellt - `geoip_blocking.php` mit Bot-Patterns wird erstellt - Kein Cache nötig (sofort aktiv) - 30+ Bot-Patterns werden geprüft ### Logs anzeigen Option `[3] Logs anzeigen` zeigt: ``` 📋 Logs für: [0] 📊 ALLE [1] shop1.example.com 🇩🇪🇦🇹🇨🇭 🛡️ [2] shop2.example.com 🇪🇺 📝 [3] shop3.example.com 🤖 🤖🛡️ ``` #### Gesamtübersicht (Option 0) ``` ══════════════════════════════════════════════════════════════════════ 📊 GESAMTÜBERSICHT ALLER SHOPS ══════════════════════════════════════════════════════════════════════ Grün = hinter Link11 | Rot = Direkt 📝 Blocks gesamt: 1.247 (⌀ 2.3 req/min, Laufzeit: 8h 32m) ├─ shop1.example.com 🇩🇪🇦🇹🇨🇭 🛡️: 523 (1.2 req/min, seit 8h 32m) ████████ │ └─➤ Top: 185.220.101.34 (AhrefsBot) - 127x, 0.2 req/min ├─ shop2.example.com 🇪🇺 📝: 412 (0.8 req/min, seit 8h 30m) ██████ │ └─➤ Top: 45.95.169.22 (SemrushBot) - 89x, 0.2 req/min └─ shop3.example.com 🤖 🤖🛡️: 312 (0.6 req/min, seit 8h 28m) █████ └─➤ Top: 194.26.192.64 (GPTBot) - 67x, 0.1 req/min 🛡️ CrowdSec-Bans gesamt: 892 ├─ shop1.example.com 🇩🇪🇦🇹🇨🇭 🛡️: 401 ████████ └─ shop3.example.com 🤖 🤖🛡️: 193 ███ 🤖 Bot-Statistik (alle Shops): AhrefsBot: 234x ██████████████████████████ SemrushBot: 189x █████████████████████ GPTBot: 156x █████████████████ ClaudeBot: 98x ███████████ Googlebot: 67x ███████ ... 🔥 Top 50 blockierte IPs (alle Shops): 185.220.101.34 (AhrefsBot): 127 (0.2 req/min) → shop1.example.com [127x] █████████████ 45.95.169.22 (SemrushBot): 89 (0.2 req/min) → shop2.example.com [89x] █████████ ... ══════════════════════════════════════════════════════════════════════ ``` ### Status prüfen Option `[4] Status` zeigt: ``` 📊 3/15 Shops aktiv shop1.example.com [Link11] 🇩🇪🇦🇹🇨🇭 🛡️ 523 blocks, 8h 32m, Cache: ✅12.847 shop2.example.com [Direkt] 🇪🇺 📝 412 blocks, 8h 30m, Cache: ✅48.392 shop3.example.com [Link11] 🤖 🤖🛡️ 312 blocks, 8h 28m, 30 Bot-Patterns ``` ## 📁 Dateistruktur ### Pro Shop (in `/var/www/vhosts/SHOP/httpdocs/`) | Datei | Beschreibung | |-------|--------------| | `index.php.geoip_backup` | Backup der Original index.php | | `geoip_blocking.php` | PHP-Blocking-Script | | `geoip_ip_ranges.cache` | Gecachte IP-Ranges (nur GeoIP-Modi) | | `geoip_blocked.log` | Log der PHP-Level Blocks | | `geoip_crowdsec_queue.log` | Queue für CrowdSec (nur +CrowdSec Modi) | ### System-weit | Datei | Beschreibung | |-------|--------------| | `/usr/local/bin/geoip_crowdsec_watcher.py` | Watcher-Service Script | | `/etc/systemd/system/geoip-crowdsec-watcher.service` | Systemd Service | | `/var/lib/crowdsec/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 ``` ### Bot-Patterns anpassen Im Python-Script unter `BOT_PATTERNS`: ```python BOT_PATTERNS = { 'GPTBot': r'GPTBot', 'ClaudeBot': r'ClaudeBot', # Eigene hinzufügen: 'MeinBot': r'MeinBot', } ``` **Regex-Elemente:** - `|` – ODER (z.B. `r'Bot1|Bot2'`) - `^` – Anfang des Strings - `$` – Ende des Strings - `\d+` – Eine oder mehr Ziffern - `.*` – Beliebige Zeichen - `[Aa]` – A oder a - `-?` – Bindestrich optional ### Minimum IP-Ranges anpassen Für Cache-Validierung: ```python MIN_RANGES = { "dach": 1000, # DE+AT+CH mindestens 1000 Ranges "eurozone": 5000 # 22 Länder mindestens 5000 Ranges } ``` ## 🛡️ Sicherheit ### Fail-Open Mechanismus Bei Problemen mit dem IP-Range-Cache wird Traffic **nicht** blockiert: - Verhindert Lockouts bei Cache-Fehlern - Loggt Warnung im PHP-Error-Log - Cache wird beim nächsten Request neu generiert ### Cache-Validierung Vor Aktivierung wird geprüft: - Mindestanzahl IP-Ranges vorhanden - Cache-Datei nicht korrupt - Alle Länder erfolgreich geladen ### Link11-Erkennung Das Script erkennt automatisch ob ein Shop hinter Link11 CDN steht: - **Grün [Link11]**: Shop ist geschützt, PHP-only Modi empfohlen - **Rot [Direkt]**: Direkter Zugriff, alle Modi möglich ## 🌐 CDN/Reverse-Proxy Hinweise ### Problem bei CDN-Nutzung ``` Client (202.8.43.232) → CDN (85.131.143.x) → Dein Server ↓ iptables sieht nur CDN-IP! ``` ### Lösung Verwende **PHP-only Modi** (📝 oder 🤖): - PHP liest echte IP aus `X-Forwarded-For` Header - Funktioniert auch hinter CDN/Proxy - Kein unnötiger CrowdSec-Overhead ## 🐛 Troubleshooting ### Cache-Warnung bei Aktivierung ``` ⚠️ Cache-Generierung: Nur 847 Ranges (min. 1000 erwartet) ℹ️ Fail-Open aktiv - Cache wird beim ersten Request neu generiert ``` **Ursache**: ipdeny.com temporär nicht erreichbar **Lösung**: Cache wird automatisch beim ersten Request neu generiert. Fail-Open verhindert Blockierungen. ### Bot wird nicht erkannt **Prüfen**: User-Agent im Log anschauen und Pattern ergänzen: ```bash tail -f /var/www/vhosts/SHOP/httpdocs/geoip_blocked.log ``` ### 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 ``` ## 📊 Performance ### GeoIP-Modi | Metrik | Wert | |--------|------| | Overhead pro Request | ~2-8ms (bei gecachten IP-Ranges) | | Erster Request | ~400-800ms (Download IP-Ranges) | | Cache-Dauer | 24 Stunden | | RAM pro Shop | ~5-10 MB | ### Bot-Only Modi | Metrik | Wert | |--------|------| | Overhead pro Request | ~0.5-2ms (nur Regex-Match) | | Kein Cache nötig | Sofort aktiv | | RAM pro Shop | ~1-2 MB | ## 📝 Changelog ### v3.2.0 - **NEU**: Bot-Only Modus (🤖) - blockiert nur Bots, Shop weltweit erreichbar - **NEU**: Bot-Block + CrowdSec Modus (🤖🛡️) - **NEU**: 30+ Bot-Patterns (GPTBot, ClaudeBot, AhrefsBot, etc.) - **NEU**: Bot-Statistiken in Logs und Gesamtübersicht - **NEU**: 4 Modi statt 2 bei Aktivierung wählbar - Geo-Region-Auswahl entfällt bei Bot-Only Modi ### v3.1.0 - **NEU**: Cache-Validierung vor Aktivierung - **NEU**: Fail-Open Mechanismus (kein Lockout bei Cache-Fehlern) - **NEU**: Minimum IP-Range Prüfung pro Region - Verbesserte Fehlerbehandlung ### v3.0.0 - **NEU**: Eurozone+GB Region (22 Länder) - **NEU**: Region-Auswahl bei Aktivierung - **NEU**: Link11-Erkennung mit farbiger Anzeige - **NEU**: req/min Statistiken in Logs - **NEU**: Top-IP pro Shop in Gesamtübersicht ### v2.2.0 - Modus-Auswahl bei Aktivierung (PHP+CrowdSec 🛡️ oder Nur PHP 📝) - PHP-only Modus für Server hinter CDN/Reverse-Proxy - Top 100 blockierte IPs in Gesamtübersicht ### v2.1.0 - Bulk-Operationen (alle aktivieren/deaktivieren) - Gesamtübersicht in Logs - Visuelle Balken in Statistiken ### v2.0.0 - DACH-Support (DE, AT, CH) - Systemd-Service für Watcher - CrowdSec-Integration - Multi-Shop-Management --- **Version**: 3.2.0 **Letztes Update**: Dezember 2025 **Status**: Production Ready ✅ **Modi:** - 🛡️ GeoIP + CrowdSec - 📝 Nur GeoIP - 🤖🛡️ Bot-Block + CrowdSec - 🤖 Nur Bot-Block **Regionen:** - 🇩🇪🇦🇹🇨🇭 DACH (3 Länder) - 🇪🇺 Eurozone+GB (22 Länder)