# GeoIP Shop Blocker Manager - DACH Version **Hybrid-System für temporäres GeoIP-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 DACH-Region (Deutschland, Österreich, Schweiz) zu sperren. Es kombiniert PHP-Level-Blocking mit optionaler CrowdSec Firewall-Integration für maximalen Schutz. ## 🎯 Features - ✅ **DACH-Region erlaubt**: Deutschland (DE), Österreich (AT), Schweiz (CH) - ✅ **Präzises Blocking**: PHP prüft gegen vollständige DACH IP-Ranges (keine Fehlblockierungen) - ✅ **Flexibler Modus**: Wahl zwischen "PHP + CrowdSec" oder "Nur PHP" - ✅ **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 100 IPs) - ✅ **Bot-Erkennung**: Automatische Identifikation von 80+ Bots/Crawlern (Googlebot, GPTBot, AhrefsBot, etc.) - ✅ **Request-Statistiken**: Requests pro Minute (req/min) und Laufzeit pro Shop - ✅ **Top-IP pro Shop**: Zeigt die aktivste IP pro Shop mit Details - ✅ **Link11-Erkennung**: Farbige Anzeige ob Shop hinter Link11 CDN ist (Grün/Rot) - ✅ **Auto-Deaktivierung**: Blocking läuft nach 72 Stunden automatisch ab - ✅ **Systemd-Service**: Automatischer Start beim Booten - ✅ **Sauberes Cleanup**: Vollständige Deinstallation bei Deaktivierung - ✅ **Plesk-kompatibel**: Funktioniert mit Plesk-verwalteten Shops - ✅ **CDN-kompatibel**: PHP-only Modus für Link11, Cloudflare & Co. ## 🏗️ Architektur ### Modus 1: PHP + CrowdSec 🛡️ #### Komponente 1: PHP-Script - Wird in die `index.php` des Shops integriert - Lädt DACH IP-Ranges von ipdeny.com (DE, AT, CH) - Prüft jede Anfrage gegen diese Ranges - Blockt Nicht-DACH-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 PHP 📝 - Nur das PHP-Script wird aktiviert - Keine CrowdSec-Synchronisation - Kein Watcher-Service nötig - **Ideal für Server hinter CDN/Proxy** (Link11, Cloudflare, etc.) > **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 ist der **PHP-only Modus** die bessere Wahl, da PHP die echte IP aus dem `X-Forwarded-For` Header liest. ## 📋 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 PHP+CrowdSec Modus) - **CrowdSec Firewall Bouncer**: Installiert und konfiguriert (nur für PHP+CrowdSec Modus) - **Plesk**: Optional, aber empfohlen - **Root-Zugriff**: Erforderlich für Installation und Verwaltung ### CrowdSec Installation prüfen (nur für PHP+CrowdSec Modus) ```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ü ``` [1] GeoIP-Blocking AKTIVIEREN (einzeln) [2] GeoIP-Blocking DEAKTIVIEREN (einzeln) [3] Logs anzeigen [4] Status anzeigen ──────────────────────────────────────── [5] 🚀 ALLE Shops aktivieren [6] 🛑 ALLE Shops deaktivieren ──────────────────────────────────────── [0] Beenden ``` ### Blocking-Modus wählen Bei jeder Aktivierung (einzeln oder alle) wird nach dem Modus gefragt: ``` 🔧 Wähle den Blocking-Modus: [1] PHP + CrowdSec (IPs werden an CrowdSec gemeldet) [2] Nur PHP (keine CrowdSec-Synchronisation) Modus wählen [1/2]: ``` **Wann welchen Modus wählen?** | Situation | Empfohlener Modus | |-----------|-------------------| | Server direkt im Internet | PHP + CrowdSec 🛡️ | | Server hinter CDN (Link11, Cloudflare) | Nur PHP 📝 | | CrowdSec nicht installiert | Nur PHP 📝 | | Minimaler Overhead gewünscht | Nur PHP 📝 | | Maximaler Schutz (alle Ports) | PHP + CrowdSec 🛡️ | ### Link11-Erkennung Das Script erkennt automatisch, ob ein Shop hinter Link11 CDN ist und zeigt dies farblich an: ``` 📋 Verfügbare Shops: Grün = hinter Link11 | Rot = Direkt [1] air-suspension-parts.de [Link11] ← grün [2] allgaeu-triathlon-shop.de [Direkt] ← rot [3] autohalle24.de [Link11] ← grün [4] behome24.de [Direkt] ← rot ``` **Funktionsweise:** - Prüft per DNS-Lookup ob die Domain zur Link11-IP `128.65.223.106` auflöst - `[Link11]` (grün) = Shop ist hinter Link11 CDN → PHP-only Modus empfohlen - `[Direkt]` (rot) = Shop ist direkt erreichbar → PHP+CrowdSec möglich Die Erkennung ist in allen Menüs aktiv: - Aktivieren (einzeln & alle) - Deaktivieren (einzeln & alle) - Logs anzeigen - Status anzeigen ### Blocking aktivieren (einzelner Shop) 1. Script starten: `python3 geoip_shop_manager.py` 2. Option `[1] GeoIP-Blocking AKTIVIEREN (einzeln)` wählen 3. Shop aus der Liste auswählen (farbig markiert nach Link11-Status) 4. **Modus wählen** (PHP+CrowdSec oder Nur PHP) 5. Bestätigen mit `ja` **Was passiert (PHP + CrowdSec Modus):** - Bei ERSTEM Shop: Systemd-Service wird installiert und gestartet - Backup der `index.php` wird erstellt - `geoip_blocking.php` wird erstellt und eingebunden - Shop wird für Tracking registriert - Blocking ist sofort aktiv - Erlaubt werden nur IPs aus: 🇩🇪 Deutschland, 🇦🇹 Österreich, 🇨🇭 Schweiz **Was passiert (Nur PHP Modus):** - Backup der `index.php` wird erstellt - `geoip_blocking.php` wird erstellt (ohne CrowdSec-Queue) - Shop wird für Tracking registriert - Blocking ist sofort aktiv - Kein Watcher-Service nötig ### Blocking für ALLE Shops aktivieren 1. Script starten: `python3 geoip_shop_manager.py` 2. Option `[5] 🚀 ALLE Shops aktivieren` wählen 3. Liste der zu aktivierenden Shops wird angezeigt (mit Link11-Status) 4. **Modus wählen** (gilt für alle Shops) 5. Bestätigen mit `ja` **Beispielausgabe:** ``` ══════════════════════════════════════════════════════════════ DACH GeoIP-Blocking für ALLE Shops aktivieren ══════════════════════════════════════════════════════════════ 📋 Folgende 5 Shop(s) werden aktiviert: Grün = hinter Link11 | Rot = Direkt • shop1.example.com [Link11] • shop2.example.com [Direkt] • shop3.example.com [Link11] ... 🔧 Wähle den Blocking-Modus: [1] PHP + CrowdSec (IPs werden an CrowdSec gemeldet) [2] Nur PHP (keine CrowdSec-Synchronisation) Modus wählen [1/2]: 2 ⚠️ Dies aktiviert den Schutz für alle oben genannten Shops! Modus: Nur PHP 📝 Fortfahren? (ja/nein): ja ``` ### Blocking deaktivieren (einzelner Shop) 1. Script starten: `python3 geoip_shop_manager.py` 2. Option `[2] GeoIP-Blocking DEAKTIVIEREN (einzeln)` wählen 3. Shop aus der Liste auswählen (zeigt Modus und Link11-Status) 4. Bestätigen mit `ja` **Was passiert:** - Original `index.php` wird wiederhergestellt - Alle PHP-Dateien werden gelöscht - Bei PHP+CrowdSec Modus: Alle CrowdSec-Decisions werden entfernt - Shop wird deregistriert - Bei LETZTEM Shop mit CrowdSec: Systemd-Service wird deinstalliert ### Blocking für ALLE Shops deaktivieren 1. Script starten: `python3 geoip_shop_manager.py` 2. Option `[6] 🛑 ALLE Shops deaktivieren` wählen 3. Liste der aktiven Shops wird angezeigt (mit Link11-Status) 4. Bestätigen mit `ja` ### Logs anzeigen 1. Script starten: `python3 geoip_shop_manager.py` 2. Option `[3] Logs anzeigen` wählen 3. Auswahl treffen: ``` 📋 Logs anzeigen für: Grün = hinter Link11 | Rot = Direkt [0] 📊 ALLE Shops (Zusammenfassung) [1] shop1.example.com [Link11] 🛡️ [2] shop2.example.com [Direkt] 📝 ... ``` Die Icons zeigen den Modus: - 🛡️ = PHP + CrowdSec - 📝 = Nur PHP #### Option [0]: Gesamtübersicht aller Shops Zeigt eine aggregierte Statistik über alle aktiven Shops mit **Requests pro Minute**, **Bot-Erkennung** und **Top-IP pro Shop**: ``` ══════════════════════════════════════════════════════════════════════ 📊 GESAMTÜBERSICHT ALLER SHOPS ══════════════════════════════════════════════════════════════════════ 📝 PHP-Blocks gesamt: 1359 (⌀ 184.7 req/min, Laufzeit: 7m) ├─ air-suspension-parts.de: 426 (57.9 req/min, seit 7m) ████████████████████ │ └─➤ Top: 40.113.19.56 (Mozilla/5.0 (Windows NT 10...) - 89x, 12.1 req/min ├─ allgaeu-triathlon-shop.de: 3 (0.4 req/min, seit 7m) │ └─➤ Top: 66.249.66.10 (Googlebot) - 2x, 0.3 req/min ├─ autohalle24.de: 62 (8.4 req/min, seit 7m) ████████████████ │ └─➤ Top: 157.55.39.203 (Bingbot) - 15x, 2.0 req/min ├─ gastro-shop-24.com: 172 (23.4 req/min, seit 7m) ████████████████████ │ └─➤ Top: 52.167.144.204 (Bingbot) - 45x, 6.1 req/min ... 🛡️ CrowdSec-Bans gesamt: 892 ├─ shop1.example.com: 401 ████████████████ ├─ shop2.example.com: 298 ███████████ └─ shop3.example.com: 193 ███████ 🔥 Top 100 blockierte IPs (alle Shops): 40.113.19.56 (Mozilla/5.0 (Windows NT 10.0; Win...): 146 (19.9 req/min) → air-suspension-parts.de [89x] ████████████████████ 157.55.39.203 (Bingbot): 85 (11.6 req/min) → gastro-shop-24.com [32x] █████████████████ 52.167.144.204 (Bingbot): 27 (3.7 req/min) → horchakustik-shop.de [12x] █████ 66.249.66.169 (Googlebot): 26 (3.5 req/min) → designbraun.de [8x] █████ 66.249.66.203 (Googlebot): 25 (3.4 req/min) → itemstar-shop.de [11x] █████ ... ══════════════════════════════════════════════════════════════════════ ``` **Enthält:** - **PHP-Blocks gesamt** mit durchschnittlicher Request-Rate und Gesamtlaufzeit - **Pro Shop**: Anzahl Blocks, req/min, Laufzeit seit Aktivierung, visueller Balken - **Top-IP pro Shop**: Aktivste IP mit Bot-Name/User-Agent, Anzahl und req/min - **CrowdSec-Bans** pro Shop (nur für PHP+CrowdSec Shops) - **Top 100 blockierte IPs** mit: - Bot-Name oder User-Agent (wenn unbekannt) - req/min für diese IP - Meistbetroffener Shop mit Anzahl #### Option [1-n]: Einzelner Shop Zeigt detaillierte Logs für einen spezifischen Shop: ``` ══════════════════════════════════════════════════════════════════════ 📊 Logs für shop1.example.com [PHP + CrowdSec 🛡️] ══════════════════════════════════════════════════════════════════════ ⏱️ Aktiviert: 2025-12-08 14:30:00 ⏱️ Laufzeit: 1d 18h 45m 📈 Blocks: 19243 (8.2 req/min) 📝 Letzte 50 PHP-Blocks: ====================================================================== [2025-12-10 09:15:23] IP: 66.249.66.10 | UA: Mozilla/5.0 (compatible; Googlebot/2.1) | URI: /produkt-123 [2025-12-10 09:15:21] IP: 40.77.167.27 | UA: Mozilla/5.0 (compatible; bingbot/2.0) | URI: /kategorie ... ====================================================================== Gesamt: 19243 🔥 Top 20 blockierte IPs: 66.249.66.10 (Googlebot): 2341 (1.0 req/min) ████████████████████ 40.77.167.27 (Bingbot): 892 (0.4 req/min) ████████████████████ 216.244.66.196 (DotBot): 234 (0.1 req/min) ████████████████████ 185.191.171.5 (SemrushBot): 189 (0.1 req/min) ████████████████████ 52.167.144.225 (Mozilla/5.0 (Windows NT 6.1; WOW...): 156 (0.1 req/min) ████████████████████ ... 🛡️ CrowdSec Decisions: ====================================================================== Aktive Bans: 401 Letzte 20 Bans: 🚫 202.8.43.232 (bis 2025-12-11 17:24:57) 🚫 45.95.169.22 (bis 2025-12-11 16:30:12) ... ====================================================================== ``` Bei PHP-only Shops wird stattdessen angezeigt: ``` 📝 CrowdSec-Synchronisation ist für diesen Shop deaktiviert (PHP-only Modus) ``` ### Status prüfen Option `[4] Status anzeigen` zeigt: - Anzahl verfügbarer Shops - Anzahl aktiver Blockings - Liste aller Shops mit aktivem Blocking, **Modus**, **Link11-Status**, **Blocks**, **req/min** und **Laufzeit** ``` 📊 Status: Shops gesamt: 41 Aktive DACH-Blockings: 5 Grün = hinter Link11 | Rot = Direkt ✓ air-suspension-parts.de [Link11] [PHP] 📝 - 426 blocks (57.9 req/min, 7m) ✓ gastro-shop-24.com [Direkt] [PHP+CS] 🛡️ - 172 blocks (23.4 req/min, 7m) ✓ horchakustik-shop.de [Link11] [PHP] 📝 - 103 blocks (14.0 req/min, 7m) ✓ itemstar-shop.de [Direkt] [PHP+CS] 🛡️ - 100 blocks (13.6 req/min, 7m) ✓ leonessa.at [Link11] [PHP] 📝 - 39 blocks (5.3 req/min, 7m) ``` ## 🤖 Bot-Erkennung Das Script erkennt automatisch über **80 verschiedene Bots und Crawler** anhand des User-Agent-Strings. Die erkannten Bots werden in den Logs hinter der IP-Adresse angezeigt. ### Erkannte Bot-Kategorien | Kategorie | Bots | |-----------|------| | **AI/LLM Crawler** | GPTBot, OAI-SearchBot, ChatGPT-User, ClaudeBot, Claude-User, PerplexityBot, Gemini-Deep-Research, cohere-ai, MistralAI-User, AI2Bot, CCBot | | **Suchmaschinen** | Googlebot, Bingbot, YandexBot, Baiduspider, DuckDuckBot, Applebot, PetalBot, Sogou, Qwantify | | **SEO-Tools** | AhrefsBot, SemrushBot, MJ12bot, DotBot, BLEXBot, DataForSeoBot, SEOkicks, Screaming Frog, Sistrix | | **Social Media** | FacebookBot, LinkedInBot, Twitterbot, Pinterest, Slackbot, TelegramBot, WhatsApp, Discordbot | | **Monitoring** | UptimeRobot, Pingdom, StatusCake, GTmetrix, Site24x7 | | **E-Commerce** | PayPal IPN, Stripe, Shopify, Amazonbot | | **Andere** | Bytespider (TikTok), Diffbot, Wget, curl, python-requests, HeadlessChrome, Scrapy | ### Anzeige in den Logs **Bei bekanntem Bot:** ``` 66.249.66.10 (Googlebot): 7025 (9.5 req/min) → shop.example.com [234x] ████████████████████ ``` **Bei unbekanntem Bot (zeigt User-Agent):** ``` 40.113.19.56 (Mozilla/5.0 (Windows NT 10.0; Win...): 146 (19.9 req/min) → shop.example.com [89x] ████████████████████ ``` ### Bot-Erkennung erweitern Um weitere Bots zur Erkennung hinzuzufügen, editiere das `BOT_PATTERNS` Dictionary im Python-Script: ```python BOT_PATTERNS = { # Existierende Patterns... 'MeinNeuerBot': r'MeinNeuerBot', # Regex-Pattern für User-Agent } ``` ## 🔧 Erweiterte Verwendung ### Manuell CrowdSec Decisions prüfen ```bash # Alle Decisions anzeigen (mit vollständiger Liste) cscli decisions list --limit 0 # Nur GeoIP-Blocks anzeigen cscli decisions list --limit 0 | grep "GeoIP" # Decisions für einen bestimmten Shop cscli decisions list --limit 0 | grep "shop.example.com" ``` ### Alle GeoIP-Decisions löschen (Einzeiler) ```bash while cscli decisions list -o raw --limit 0 | grep -q "GeoIP"; do cscli decisions list -o raw --limit 0 | grep "GeoIP" | cut -d',' -f3 | cut -d':' -f2 | while read ip; do echo "🗑️ Lösche: $ip"; cscli decisions delete --ip "$ip" 2>/dev/null; done; done && echo "✅ Alle GeoIP-Decisions gelöscht" ``` ### Firewall-Statistiken prüfen ```bash # Geblockte Pakete in iptables iptables -L -n -v | grep crowdsec # IPs im CrowdSec ipset ipset list crowdsec-blacklists-5 | head -50 # Prüfe ob eine bestimmte IP gebannt ist ipset test crowdsec-blacklists-5 1.2.3.4 ``` ### Systemd-Service verwalten ```bash # Status des Watcher-Service systemctl status geoip-crowdsec-watcher.service # Logs des Watcher-Service journalctl -u geoip-crowdsec-watcher.service -f # Service neu starten systemctl restart geoip-crowdsec-watcher.service ``` ### Manuelle IP-Tests ```bash # Eigene IP für 3 Minuten bannen (Test) cscli decisions add --ip DEINE_IP --duration 3m --type ban --reason "Test" # Prüfen ob Ban aktiv ist ipset test crowdsec-blacklists-5 DEINE_IP # Ban manuell entfernen cscli decisions delete --ip DEINE_IP ``` ## 📁 Dateistruktur ### Pro Shop (in `/var/www/vhosts/SHOP/httpdocs/`) - `index.php.geoip_backup` - Backup der Original index.php - `geoip_blocking.php` - PHP-Blocking-Script - `dach_ip_ranges.cache` - Gecachte DACH IP-Ranges (erneuert alle 24h) - `geoip_blocked.log` - Log der PHP-Level Blocks - `geoip_crowdsec_queue.log` - Queue für CrowdSec-Synchronisation (nur PHP+CrowdSec Modus) ### System-weit - `/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 (inkl. Modus und Aktivierungszeit) ## ⚙️ Konfiguration ### Blocking-Dauer ändern Standardmäßig 72 Stunden. Zum Ändern editiere das Python-Script: ```python # Zeile ~400 und ~750 expiry = datetime.now() + timedelta(hours=72) # Hier ändern ``` Und im PHP-Script Template: ```python # Zeile ~30-50 GEOIP_SCRIPT = '''/dev/null; done; done && echo "✅ Alle GeoIP-Decisions gelöscht" # Prüfen cscli decisions list --limit 0 | grep "GeoIP" ``` ### Migration von der alten DE-Only Version Falls du von der alten Version (nur Deutschland) auf die DACH-Version wechselst: ```bash # 1. Alle aktiven Shops deaktivieren (alte Version) python3 geoip_shop_manager_old.py # Option 2 für jeden Shop # 2. Alte Cache-Dateien löschen rm /var/www/vhosts/*/httpdocs/de_ip_ranges.cache # 3. Neue Version verwenden python3 geoip_shop_manager.py # Shops wieder aktivieren ``` ## 📊 Performance ### PHP-Level Blocking - **Overhead pro Request**: ~2-8ms (bei gecachten IP-Ranges) - **Erster Request**: ~400-800ms (beim Download der IP-Ranges für 3 Länder) - **Cache-Dauer**: 24 Stunden - **RAM-Verbrauch**: ~5-10 MB pro Shop ### CrowdSec Firewall Blocking (nur PHP+CrowdSec Modus) - **Overhead**: 0ms (blockt vor PHP) - **RAM**: ~20-50 MB (Watcher-Service) - **Geblockte Pakete**: Werden gar nicht erst an Apache weitergeleitet ### Empfohlene Limits - **Kleine Server** (2GB RAM): Bis zu 10 Shops gleichzeitig - **Mittlere Server** (4-8GB RAM): Bis zu 50 Shops - **Große Server** (16GB+ RAM): Unbegrenzt ## 🔄 Updates ### Script aktualisieren ```bash cd /root wget -O geoip_shop_manager.py https://raw.githubusercontent.com/DEIN-REPO/geoip-shop-blocker/main/geoip_shop_manager.py chmod +x geoip_shop_manager.py ``` **WICHTIG**: Bereits aktive Shops bleiben unberührt. Der Watcher-Service muss manuell aktualisiert werden: ```bash # Für aktive Shops: Watcher-Service neu installieren # (Automatisch beim nächsten Aktivieren/Deaktivieren) # ODER manuell: systemctl stop geoip-crowdsec-watcher.service # Script ausführen und einen Shop kurz de-/reaktivieren ``` ### IP-Ranges aktualisieren ```bash # Cache löschen (wird automatisch neu geladen) rm /var/www/vhosts/*/httpdocs/dach_ip_ranges.cache ``` Die Ranges werden automatisch alle 24h aktualisiert. ## 📝 Logs und Monitoring ### PHP-Level Logs ```bash # Blockierte IPs für einen Shop tail -f /var/www/vhosts/SHOP/httpdocs/geoip_blocked.log # Statistik wc -l /var/www/vhosts/SHOP/httpdocs/geoip_blocked.log ``` ### CrowdSec Logs ```bash # Watcher-Service Logs (Echtzeit) journalctl -u geoip-crowdsec-watcher.service -f # CrowdSec-Agent Logs tail -f /var/log/crowdsec.log # Firewall-Bouncer Logs journalctl -u crowdsec-firewall-bouncer.service -f ``` ### Statistiken ```bash # Geblockte Pakete zählen iptables -L -n -v | grep crowdsec-blacklists-5 # Anzahl aktiver Bans cscli decisions list --limit 0 | grep "GeoIP" | wc -l # Top 10 blockierte IPs (PHP-Level) cat /var/www/vhosts/SHOP/httpdocs/geoip_blocked.log | \ grep -oP 'IP: \K[0-9.]+' | sort | uniq -c | sort -rn | head -10 ``` ## 🔐 Best Practices ### Vor Aktivierung 1. ✅ Backup erstellen (macht das Script automatisch) 2. ✅ Sicherstellen, dass Admin-Zugriff aus DACH-Region kommt 3. ✅ **Link11-Status prüfen** (grün = PHP-only empfohlen) 4. ✅ **Modus wählen** (PHP+CrowdSec für direkte Server, PHP-only für CDN) 5. ✅ Test mit kurzer Dauer (kann im Script angepasst werden) 6. ✅ Monitoring einrichten ### Während aktivem Blocking 1. ✅ Logs regelmäßig prüfen (Gesamtübersicht nutzen!) 2. ✅ **req/min beobachten** - hohe Werte können auf Angriffe hindeuten 3. ✅ **Bot-Traffic analysieren** - welche Crawler werden geblockt? 4. ✅ **Top-IPs pro Shop prüfen** - ungewöhnliche Aktivität erkennen 5. ✅ Auf Fehlblockierungen achten (sehr selten) 6. ✅ CrowdSec-Statistiken beobachten (nur bei PHP+CrowdSec) 7. ✅ Server-Performance monitoren ### Nach Deaktivierung 1. ✅ Prüfen ob alle Decisions entfernt wurden (nur bei PHP+CrowdSec) 2. ✅ Backup-Dateien können gelöscht werden (optional) 3. ✅ Logs archivieren (falls benötigt) ## ⚠️ Wichtige Hinweise ### Rechtliches - **DSGVO**: IP-Adressen werden nur temporär geloggt (72h) - **Geoblocking**: Kann gegen EU-Verordnungen verstoßen bei B2C-Geschäften - **Haftung**: Nur für technische Notfälle/DDoS-Abwehr empfohlen ### Technisches - **API-Calls**: Bei vielen aktiven Shops könnten viele IPs in CrowdSec landen - **CrowdSec-Limits**: Kostenloser Tier hat API-Limits - **Netzwerk**: Kein Blocking möglich, wenn Server selbst unter DDoS steht - **CDN**: Bei CDN-Nutzung ist PHP-only Modus empfohlen (Link11-Erkennung nutzen!) ### Empfehlungen - ✅ Nur temporär nutzen (Notfälle, Angriffe) - ✅ Nicht als permanente Lösung - ✅ Kombinieren mit anderen Security-Maßnahmen - ✅ Regelmäßig Logs prüfen (Gesamtübersicht für schnellen Überblick) - ✅ **req/min im Auge behalten** für Anomalie-Erkennung - ✅ **Link11-Erkennung nutzen** für Modus-Empfehlung - ✅ Bei CDN: PHP-only Modus verwenden ## 🤝 Contributing Contributions sind willkommen! Bitte: 1. Fork das Repository 2. Erstelle einen Feature-Branch 3. Committe deine Änderungen 4. Push zum Branch 5. Erstelle einen Pull Request ## 📄 Lizenz MIT License - siehe LICENSE Datei ## 🙏 Credits - **IP-Ranges**: [ipdeny.com](https://www.ipdeny.com/) (RIPE-basiert) - **CrowdSec**: [crowdsec.net](https://www.crowdsec.net/) - **Bot-Listen**: [momenticmarketing.com](https://momenticmarketing.com/blog/ai-search-crawlers-bots), [searchenginejournal.com](https://www.searchenginejournal.com/ai-crawler-user-agents-list/558130/) - **Entwickelt für**: Plesk-basierte Multi-Shop-Server ## 📞 Support Bei Problemen: 1. Prüfe die Troubleshooting-Sektion 2. Prüfe die Logs (Gesamtübersicht oder einzeln) 3. Erstelle ein GitHub Issue mit: - Fehlerbeschreibung - Relevante Logs - System-Infos (OS, PHP-Version, CrowdSec-Version) - **Verwendeter Modus** (PHP+CrowdSec oder PHP-only) - **Link11-Status** der betroffenen Shops ## 📚 Weitere Dokumentation - [CrowdSec Dokumentation](https://docs.crowdsec.net/) - [Plesk Dokumentation](https://docs.plesk.com/) - [iptables Tutorial](https://www.netfilter.org/documentation/) - [ipdeny.com Ländercodes](https://www.ipdeny.com/ipblocks/data/aggregated/) --- **Version**: 2.4.0 (DACH) **Letztes Update**: Dezember 2025 **Status**: Production Ready ✅ **Erlaubte Länder**: 🇩🇪 Deutschland | 🇦🇹 Österreich | 🇨🇭 Schweiz ### Changelog #### v2.4.0 - **NEU**: Link11-Erkennung mit farbiger Anzeige (Grün = hinter Link11, Rot = Direkt) - **NEU**: DNS-Check für automatische CDN-Erkennung - **NEU**: Top-IP pro Shop in Gesamtübersicht mit Bot-Name/User-Agent und req/min - **NEU**: req/min für jede IP in Top 100 Liste - **NEU**: User-Agent-Anzeige statt "Unbekannt" bei nicht erkannten Bots - **NEU**: Shop-Zuordnung bei Top 100 IPs (welcher Shop am meisten betroffen) - Link11-Status in allen Menüs sichtbar (Aktivieren, Deaktivieren, Logs, Status) #### v2.3.0 - **NEU**: Bot-Erkennung mit 80+ bekannten Bots/Crawlern (Googlebot, GPTBot, ClaudeBot, AhrefsBot, SemrushBot, etc.) - **NEU**: Requests pro Minute (req/min) Berechnung pro Shop - **NEU**: Laufzeit-Anzeige seit Aktivierung (z.B. "1d 18h 45m") - **NEU**: Erweiterte Status-Ansicht mit Blocks, req/min und Laufzeit - **NEU**: Top 20 IPs mit Bot-Erkennung in Einzelshop-Logs - Bot-Kategorien: AI/LLM, Suchmaschinen, SEO-Tools, Social Media, Monitoring, E-Commerce - Verbesserte Gesamtübersicht mit durchschnittlicher Request-Rate #### v2.2.0 - **NEU**: Modus-Auswahl bei Aktivierung (PHP+CrowdSec 🛡️ oder Nur PHP 📝) - **NEU**: PHP-only Modus für Server hinter CDN/Reverse-Proxy (Link11, Cloudflare) - **NEU**: Modus-Anzeige in Status, Logs und Deaktivierungs-Menü - **NEU**: Automatische Erkennung ob CrowdSec-Cleanup nötig ist - **NEU**: Top 100 blockierte IPs (statt Top 10) in Gesamtübersicht - **FIX**: CrowdSec Cleanup nutzt jetzt `--limit 0` für vollständige Löschung - Verbesserte Dokumentation zu CDN/Proxy-Szenarien #### v2.1.0 - **NEU**: Option [5] - Alle Shops gleichzeitig aktivieren - **NEU**: Option [6] - Alle Shops gleichzeitig deaktivieren - **NEU**: Gesamtübersicht in Logs (Option [0]) mit aggregierten Statistiken - **NEU**: Visuelle Balken in der Statistik-Anzeige - Verbessertes Menü-Layout mit Trennlinien #### v2.0.0 - DACH-Support (DE, AT, CH statt nur DE) - Systemd-Service für Watcher - CrowdSec-Integration - Multi-Shop-Management