From e10464f0c016e66cbde971c3349d676330794fa9 Mon Sep 17 00:00:00 2001 From: thomasciesla Date: Tue, 9 Dec 2025 13:37:36 +0100 Subject: [PATCH] README.md aktualisiert --- README.md | 990 +++++++++++++++++++++++++++++++++++++++--------------- 1 file changed, 715 insertions(+), 275 deletions(-) diff --git a/README.md b/README.md index fd1c792..8d465cd 100644 --- a/README.md +++ b/README.md @@ -1,48 +1,36 @@ -# GeoIP Shop Blocker Manager - DACH & Eurozone Version +# GeoIP Shop Blocker Manager - DACH Version -**Hybrid-System für temporäres GeoIP-Blocking und Bot-Blocking auf Plesk-Servern mit mehreren Shops** +**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 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. +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 -### 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) +- ✅ **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 50 IPs) -- ✅ **Bot-Statistiken**: Auswertung welche Bots wie oft geblockt wurden +- ✅ **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 100 IPs) - ✅ **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. +- ✅ **CDN-kompatibel**: PHP-only Modus für Link11, Cloudflare & Co. ## 🏗️ Architektur -### Modus 1: GeoIP + CrowdSec 🛡️ +### Modus 1: PHP + CrowdSec 🛡️ #### Komponente 1: PHP-Script - Wird in die `index.php` des Shops integriert -- Lädt IP-Ranges der gewählten Region von ipdeny.com +- Lädt DACH IP-Ranges von ipdeny.com (DE, AT, CH) - Prüft jede Anfrage gegen diese Ranges -- Blockt Nicht-Region-IPs sofort mit HTTP 403 +- Blockt Nicht-DACH-IPs sofort mit HTTP 403 - Schreibt blockierte IPs in Queue-Datei für CrowdSec #### Komponente 2: Python Watcher (systemd service) @@ -58,52 +46,14 @@ Dieses Tool ermöglicht es, einzelne oder alle Shops auf einem Plesk-Server temp - Übernimmt Bans für 72 Stunden - Deutlich performanter als PHP-Checks -### Modus 2: Nur GeoIP 📝 +### 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.) -### 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 -} -``` +> **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 @@ -111,12 +61,12 @@ BOT_PATTERNS = { - **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) +- **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 +CrowdSec Modi) +### CrowdSec Installation prüfen (nur für PHP+CrowdSec Modus) ```bash # Prüfe ob CrowdSec läuft @@ -160,23 +110,15 @@ Das war's! Das Script ist vollständig selbstverwaltend. ### 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 ----------------------------------------- +[7] 🎯 Nur DIREKTE aktivieren (ohne Link11) +──────────────────────────────────────── [0] Beenden ``` @@ -186,138 +128,355 @@ 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) + [1] PHP + CrowdSec (IPs werden an CrowdSec gemeldet) + [2] Nur PHP (keine CrowdSec-Synchronisation) -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]: +Modus 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 🛡️ | +| 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 🛡️ | ### 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` +4. **Modus wählen** (PHP+CrowdSec oder Nur PHP) +5. Bestätigen mit `ja` -**Was passiert (GeoIP + CrowdSec Modus):** +**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 -- IP-Range-Cache wird generiert und validiert - Shop wird für Tracking registriert - Blocking ist sofort aktiv +- Erlaubt werden nur IPs aus: 🇩🇪 Deutschland, 🇦🇹 Österreich, 🇨🇭 Schweiz -**Was passiert (Bot-Only Modus):** +**Was passiert (Nur PHP 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 +- `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 aktivieren` wählen +3. Liste der zu aktivierenden Shops wird angezeigt +4. **Modus wählen** (gilt für alle Shops) +5. Bestätigen mit `ja` + +**Beispielausgabe:** +``` +══════════════════════════════════════════════════════════════ + Blocking für ALLE Shops aktivieren +══════════════════════════════════════════════════════════════ + +📋 Folgende 5 Shop(s) werden aktiviert: + + • shop1.example.com [Link11] + • shop2.example.com [Direkt] + • shop3.example.com [Direkt] + ... + +🔧 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 nur für DIREKTE Shops aktivieren (ohne Link11) + +Diese Option ist besonders nützlich, wenn du einen Mix aus Shops hast - einige hinter Link11 CDN, andere direkt exponiert. Mit Option `[7]` werden **nur die direkt exponierten Shops** aktiviert. + +1. Script starten: `python3 geoip_shop_manager.py` +2. Option `[7] 🎯 Nur DIREKTE aktivieren (ohne Link11)` wählen +3. Liste zeigt welche Shops aktiviert/übersprungen werden +4. **Modus wählen** (gilt für alle direkten Shops) +5. Bestätigen mit `ja` + +**Beispielausgabe:** +``` +══════════════════════════════════════════════════════════════ + Blocking für DIREKTE Shops aktivieren (ohne Link11) +══════════════════════════════════════════════════════════════ + Grün = hinter Link11 (übersprungen) + Rot = Direkt (wird aktiviert) + +📋 3 direkte Shop(s) werden aktiviert: + • shop2.example.com [Direkt] + • shop4.example.com [Direkt] + • shop5.example.com [Direkt] + +⏭️ 2 Shop(s) hinter Link11 werden übersprungen: + • shop1.example.com [Link11] + • shop3.example.com [Link11] + +🔧 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]: 1 + +⚠️ Modus: GeoIP + CrowdSec 🛡️ + Region: 🇩🇪🇦🇹🇨🇭 DACH + Aktiviert: 3 direkte Shop(s) + Übersprungen: 2 Link11-Shop(s) + +Fortfahren? (ja/nein): ja + +══════════════════════════════════════════════════════════════ + +[1/3] shop2.example.com + ⏳ Cache generieren... + ✅ Aktiviert (8,234 Ranges) + +[2/3] shop4.example.com + ⏳ Cache generieren... + ✅ Aktiviert (8,234 Ranges) + +[3/3] shop5.example.com + ⏳ Cache generieren... + ✅ Aktiviert (8,234 Ranges) + +══════════════════════════════════════════════════════════════ + ✅ 3 direkte Shop(s) aktiviert + ⏭️ 2 Link11-Shop(s) übersprungen + 🛡️ Fail-Open bei Cache-Fehlern aktiv +══════════════════════════════════════════════════════════════ +``` + +**Warum diese Option?** + +- **CrowdSec-Effektivität**: Bei Shops hinter Link11 sieht iptables nur die Link11-IP, nicht die echte Client-IP. CrowdSec-Bans sind dort wirkungslos. +- **Gezielter Schutz**: Schützt nur die Shops, die tatsächlich direkt exponiert sind und von CrowdSec profitieren. +- **Zeitersparnis**: Keine unnötige Konfiguration für CDN-geschützte Shops. + +### Blocking deaktivieren (einzelner Shop) + +1. Script starten: `python3 geoip_shop_manager.py` +2. Option `[2] Deaktivieren (einzeln)` wählen +3. Shop aus der Liste auswählen (zeigt Modus an) +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 deaktivieren` wählen +3. Liste der aktiven Shops wird angezeigt +4. Bestätigen mit `ja` + +**Was passiert:** +- Zeigt alle Shops mit aktivem Blocking +- Deaktiviert das Blocking für jeden Shop nacheinander +- Entfernt alle zugehörigen CrowdSec-Decisions (nur bei PHP+CrowdSec Shops) +- Deinstalliert den Watcher-Service am Ende (falls aktiv) +- Zusammenfassung mit Erfolgs-/Fehlerzählung ### Logs anzeigen -Option `[3] Logs anzeigen` zeigt: +1. Script starten: `python3 geoip_shop_manager.py` +2. Option `[3] Logs anzeigen` wählen +3. Auswahl treffen: ``` -📋 Logs für: - [0] 📊 ALLE - [1] shop1.example.com 🇩🇪🇦🇹🇨🇭 🛡️ - [2] shop2.example.com 🇪🇺 📝 - [3] shop3.example.com 🤖 🤖🛡️ +📋 Logs anzeigen für: + [0] 📊 ALLE Shops (Zusammenfassung) + [1] shop1.example.com 🛡️ [Link11] + [2] shop2.example.com 📝 [Direkt] + ... ``` -#### Gesamtübersicht (Option 0) +Die Icons zeigen den Modus: +- 🛡️ = PHP + CrowdSec +- 📝 = Nur PHP + +Die Farbcodierung zeigt den CDN-Status: +- **Grün** = hinter Link11 +- **Rot** = Direkt exponiert + +#### Option [0]: Gesamtübersicht aller Shops + +Zeigt eine aggregierte Statistik über alle aktiven Shops: ``` -══════════════════════════════════════════════════════════════════════ +════════════════════════════════════════════════════════════════ 📊 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 +📝 Blocks gesamt: 1.247 (⌀ 12.3 req/min, Laufzeit: 1h 41m) + ├─ shop1.example.com 🇩🇪🇦🇹🇨🇭 🛡️: 523 (5.2 req/min, seit 1h 41m) █████████████████████ + │ └─➤ Top: 185.220.101.34 (GPTBot) - 127x, 1.3 req/min + ├─ shop2.example.com 🇩🇪🇦🇹🇨🇭 📝: 412 (4.1 req/min, seit 1h 40m) ████████████████ + │ └─➤ Top: 45.95.169.22 (Bytespider) - 89x, 0.9 req/min + └─ shop3.example.com 🇩🇪🇦🇹🇨🇭 🛡️: 312 (3.1 req/min, seit 1h 39m) ████████████ 🛡️ 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 ███████ - ... + ├─ shop1.example.com 🇩🇪🇦🇹🇨🇭 🛡️: 401 ████████████████ + └─ shop3.example.com 🇩🇪🇦🇹🇨🇭 🛡️: 491 ███████████████████ 🔥 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] █████████ + 185.220.101.34 (GPTBot): 127 (1.3 req/min) → shop1.example.com [127x] █████████████████████████ + 45.95.169.22 (Bytespider): 89 (0.9 req/min) → shop2.example.com [89x] █████████████████ ... -══════════════════════════════════════════════════════════════════════ + +════════════════════════════════════════════════════════════════ +``` + +**Enthält:** +- PHP-Blocks pro Shop mit visuellen Balken und req/min +- Top-IP pro Shop mit Bot-Erkennung +- CrowdSec-Bans pro Shop (nur für PHP+CrowdSec Shops) +- Top 50 der am häufigsten blockierten IPs über alle Shops hinweg + +#### Option [1-n]: Einzelner Shop + +Zeigt detaillierte Logs für einen spezifischen Shop: + +``` +📊 Logs für shop1.example.com [PHP + CrowdSec 🛡️] + +📝 PHP-Blocks: +================================================================================ +[2025-12-08 17:24:57] IP: 202.8.43.232 | UA: Mozilla/5.0 ... | URI: /produkt-123 +... +================================================================================ +Gesamt: 523 + +🛡️ 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` zeigt: +Option `[4] Status anzeigen` zeigt: +- Anzahl verfügbarer Shops +- Anzahl aktiver Blockings +- Liste aller Shops mit aktivem Blocking **und deren Modus** +- Link11-Status (farbcodiert) ``` -📊 3/15 Shops aktiv +📊 Status: 5/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 + 523 blocks, 1h 41m, Cache: ✅8,234 + shop2.example.com [Direkt] 🇩🇪🇦🇹🇨🇭 📝 + 412 blocks, 1h 40m, Cache: ✅8,234 + shop3.example.com [Direkt] 🇩🇪🇦🇹🇨🇭 🛡️ + 312 blocks, 1h 39m, Cache: ✅8,234 +``` + +## 🔧 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/`) -| 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) | +- `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 PHP-Level Blocks +- `geoip_crowdsec_queue.log` - Queue für CrowdSec-Synchronisation (nur PHP+CrowdSec Modus) ### 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 | +- `/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) ## ⚙️ Konfiguration @@ -326,67 +485,89 @@ Option `[4] Status` zeigt: Standardmäßig 72 Stunden. Zum Ändern editiere das Python-Script: ```python +# Zeile ~400 und ~750 expiry = datetime.now() + timedelta(hours=72) # Hier ändern ``` -### Bot-Patterns anpassen - -Im Python-Script unter `BOT_PATTERNS`: - +Und im PHP-Script Template: ```python -BOT_PATTERNS = { - 'GPTBot': r'GPTBot', - 'ClaudeBot': r'ClaudeBot', - # Eigene hinzufügen: - 'MeinBot': r'MeinBot', -} +# Zeile ~30-50 +GEOIP_SCRIPT = '''/dev/null; done; done && echo "✅ Alle GeoIP-Decisions gelöscht" + +# Prüfen +cscli decisions list --limit 0 | grep "GeoIP" +``` + +### Link11-Erkennung funktioniert nicht + +```bash +# Manuelle DNS-Prüfung +dig +short shop.example.com + +# Sollte 128.65.223.106 zeigen wenn hinter Link11 +# Falls andere IP → Shop ist direkt exponiert ``` ## 📊 Performance -### GeoIP-Modi +### PHP-Level Blocking -| 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 | +- **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-Only Modi +### CrowdSec Firewall Blocking (nur PHP+CrowdSec Modus) -| Metrik | Wert | -|--------|------| -| Overhead pro Request | ~0.5-2ms (nur Regex-Match) | -| Kein Cache nötig | Sofort aktiv | -| RAM pro Shop | ~1-2 MB | +- **Overhead**: 0ms (blockt vor PHP) +- **RAM**: ~20-50 MB (Watcher-Service) +- **Geblockte Pakete**: Werden gar nicht erst an Apache weitergeleitet -## 📝 Changelog +### Empfohlene Limits -### 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.) +- **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://git.jtl-hosting.de/thomasciesla/geoip_shop_manager/raw/branch/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/geoip_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 erlaubter Region kommt +3. ✅ **Link11-Status prüfen** (farbcodiert im Script) +4. ✅ **Modus wählen** (PHP+CrowdSec für direkte Server, PHP-only für CDN) +5. ✅ Bei gemischtem Setup: **Option [7]** für nur direkte Shops nutzen +6. ✅ Test mit kurzer Dauer (kann im Script angepasst werden) +7. ✅ Monitoring einrichten + +### Während aktivem Blocking + +1. ✅ Logs regelmäßig prüfen (Gesamtübersicht nutzen!) +2. ✅ Auf Fehlblockierungen achten (sehr selten) +3. ✅ CrowdSec-Statistiken beobachten (nur bei PHP+CrowdSec) +4. ✅ 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 oder Option [7] empfohlen + +### 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) +- ✅ Bei CDN: PHP-only Modus oder Option [7] 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/) +- **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**: 3.3.0 +**Letztes Update**: Dezember 2025 +**Status**: Production Ready ✅ +**Erlaubte Regionen**: 🇩🇪🇦🇹🇨🇭 DACH | 🇪🇺 Eurozone+GB | 🤖 Bot-Only + +### Changelog + +#### v3.3.0 +- **NEU**: Option [7] - Nur direkte Shops aktivieren (ohne Link11) +- **NEU**: Automatische Link11-Erkennung per DNS-Lookup +- **NEU**: Farbcodierung im Menü (Grün = Link11, Rot = Direkt) +- **NEU**: Hilfsfunktionen `get_direct_shops()` und `get_link11_shops()` +- Verbesserte Dokumentation zu CDN-Szenarien und Option [7] + +#### v3.2.0 +- **NEU**: Bot-Only Blocking Modus (weltweit erreichbar, nur Bots blocken) +- **NEU**: 4 Blocking-Modi: GeoIP+CrowdSec, GeoIP-only, Bot+CrowdSec, Bot-only - **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 +- **NEU**: 30+ Bot-Patterns (GPTBot, ClaudeBot, Googlebot, etc.) -### 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 +#### v3.1.0 +- **NEU**: Eurozone+GB Region (22 Länder) +- **NEU**: Cache-Validierung mit Mindest-Range-Prüfung +- **NEU**: Fail-Open Mechanismus bei Cache-Fehlern - 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) +#### v3.0.0 +- **NEU**: DACH-Support (DE, AT, CH statt nur DE) - Systemd-Service für Watcher - CrowdSec-Integration - Multi-Shop-Management ---- +#### 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 -**Version**: 3.2.0 -**Letztes Update**: Dezember 2025 -**Status**: Production Ready ✅ +#### 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 -**Modi:** -- 🛡️ GeoIP + CrowdSec -- 📝 Nur GeoIP -- 🤖🛡️ Bot-Block + CrowdSec -- 🤖 Nur Bot-Block - -**Regionen:** -- 🇩🇪🇦🇹🇨🇭 DACH (3 Länder) -- 🇪🇺 Eurozone+GB (22 Länder) \ No newline at end of file +#### v2.0.0 +- DACH-Support (DE, AT, CH statt nur DE) +- Systemd-Service für Watcher +- CrowdSec-Integration +- Multi-Shop-Management \ No newline at end of file