diff --git a/README.md b/README.md index 5b327bc..42584be 100644 --- a/README.md +++ b/README.md @@ -1,16 +1,15 @@ -# GeoIP Shop Blocker Manager - DACH Version +# GeoIP Shop Blocker Manager - DACH & Eurozone 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. +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. 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" -- ✅ **Bot-Only Modus**: Nur Bots blocken, Shop bleibt weltweit erreichbar -- ✅ **Rate-Limiting**: Konfigurierbares Rate-Limit für Bot-Blocking mit temporären Bans +- ✅ **Flexible Regionen**: DACH (DE, AT, CH) oder Eurozone+GB (22 Länder) +- ✅ **Bot-Rate-Limiting**: Bots unter Limit durchlassen, bei Überschreitung temporär bannen +- ✅ **Präzises Blocking**: PHP prüft gegen vollständige IP-Ranges (keine Fehlblockierungen) +- ✅ **Flexibler Modus**: 4 Modi - GeoIP+CrowdSec, GeoIP-only, Bot+CrowdSec, Bot-only - ✅ **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 @@ -23,16 +22,17 @@ Dieses Tool ermöglicht es, einzelne oder alle Shops auf einem Plesk-Server temp - ✅ **Sauberes Cleanup**: Vollständige Deinstallation bei Deaktivierung - ✅ **Plesk-kompatibel**: Funktioniert mit Plesk-verwalteten Shops - ✅ **CDN-kompatibel**: PHP-only Modus für Link11, Cloudflare & Co. +- ✅ **Fail-Open**: Bei Cache-Fehlern wird Traffic durchgelassen (keine Ausfälle) ## 🏗️ Architektur -### Modus 1: PHP + CrowdSec 🛡️ +### Modus 1: GeoIP + CrowdSec 🛡️ #### Komponente 1: PHP-Script - Wird in die `index.php` des Shops integriert -- Lädt DACH IP-Ranges von ipdeny.com (DE, AT, CH) +- Lädt IP-Ranges von ipdeny.com (konfigurierte Länder) - Prüft jede Anfrage gegen diese Ranges -- Blockt Nicht-DACH-IPs sofort mit HTTP 403 +- Blockt Nicht-erlaubte IPs sofort mit HTTP 403 - Schreibt blockierte IPs in Queue-Datei für CrowdSec #### Komponente 2: Python Watcher (systemd service) @@ -48,29 +48,35 @@ 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 PHP 📝 +### 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.) -> **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. +### Modus 3: Bot-Rate-Limiting + CrowdSec 🤖🛡️ -### Modus 3: Bot-Only 🤖 +- Shop bleibt weltweit erreichbar +- Nur bekannte Bots werden rate-limited +- **Bots unter dem Limit werden durchgelassen** +- Bei Überschreitung: temporärer Ban + CrowdSec-Meldung -- Blockt nur bekannte Bots/Crawler (30+ Patterns) -- Shop bleibt weltweit für normale Besucher erreichbar -- **Mit Rate-Limiting**: Bots werden nach X Requests/Minute temporär gebannt -- Ideal um AI-Crawler (GPTBot, ClaudeBot, etc.) fernzuhalten -- Verfügbar mit oder ohne CrowdSec-Integration +### Modus 4: Nur Bot-Rate-Limiting 🤖 + +- Shop bleibt weltweit erreichbar +- Nur bekannte Bots werden rate-limited +- **Bots unter dem Limit werden durchgelassen** +- Keine CrowdSec-Synchronisation + +> **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** oder **Bot-only Modus** die bessere Wahl. ## 🚦 Rate-Limiting (Bot-Only Modus) -Im Bot-Only Modus wird ein konfigurierbares Rate-Limiting angewendet: - ### Funktionsweise +Das Rate-Limiting im Bot-Only Modus funktioniert wie folgt: + ``` Bot-Request kommt rein │ @@ -91,48 +97,71 @@ Bot-Request kommt rein └───────────────────┘ │ Nein ▼ - 403 (normal) + Log + Weiter ✅ + (Bot darf durch!) ``` +**Wichtig**: Bots werden **nicht** sofort geblockt! Sie dürfen crawlen, solange sie unter dem konfigurierten Limit bleiben. Erst bei Überschreitung werden sie temporär gebannt. + ### Konfiguration bei Aktivierung +Bei Aktivierung des Bot-Only Modus werden zwei Werte abgefragt: + ``` 🚦 Rate-Limit Konfiguration: - Requests pro Minute bevor Ban [30]: _ - Ban-Dauer in Minuten [5]: _ + Requests pro Minute bevor Ban [30]: + Ban-Dauer in Minuten [5]: + + ✅ Rate-Limit: 30 req/min + ✅ Ban-Dauer: 5 Minuten ``` +- **Requests pro Minute**: Wie viele Requests ein Bot pro Minute machen darf (Default: 30) +- **Ban-Dauer**: Wie lange ein Bot nach Überschreitung gebannt wird (Default: 5 Minuten) + ### Technische Details -- **Speicherung**: File-basiert (kein Redis/Memcached nötig) -- **Identifier**: MD5-Hash aus IP + User-Agent -- **Algorithmus**: Sliding Window Counter (1 Minute Fenster) -- **Cleanup**: Probabilistisch (1% der Requests) -- **Retry-After**: Gebannte Clients erhalten Header mit verbleibender Ban-Zeit +- **Identifier**: MD5-Hash aus IP + User-Agent (ermöglicht granulare Tracking pro Bot-Typ) +- **Speicherung**: File-basiert in `geoip_ratelimit/` Verzeichnis +- **Cleanup**: Probabilistisch (1% der Requests) um Overhead zu minimieren +- **Atomare Operationen**: File-Locking verhindert Race Conditions ### Verzeichnisstruktur ``` httpdocs/ -└── geoip_ratelimit/ - ├── bans/ - │ └── {hash}.ban # Inhalt: Unix-Timestamp (ban bis) - └── counts/ - └── {hash}.count # Inhalt: window_start|count +├── geoip_ratelimit/ +│ ├── bans/ +│ │ └── {hash}.ban # Unix-Timestamp wann Ban abläuft +│ └── counts/ +│ └── {hash}.count # Format: window_start|count ``` +## 🤖 Erkannte Bot-Patterns + +Das System erkennt über 30 verschiedene Bots: + +| 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, DataForSeoBot | +| **Social Media** | FacebookBot, LinkedInBot, Twitterbot, Slackbot | +| **Andere** | Applebot, Amazonbot, Bytespider, PetalBot, UptimeRobot, Pingdom | +| **CLI-Tools** | curl, python-requests, Wget, Scrapy | + ## 📋 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) +- **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 PHP+CrowdSec Modus) +### CrowdSec Installation prüfen (nur für +CrowdSec Modi) ```bash # Prüfe ob CrowdSec läuft @@ -140,9 +169,6 @@ 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: @@ -176,6 +202,13 @@ Das war's! Das Script ist vollständig selbstverwaltend. ### Hauptmenü ``` +============================================================ + GeoIP Shop Blocker Manager v3.4.3 + 🇩🇪🇦🇹🇨🇭 DACH | 🇪🇺 Eurozone+GB | 🤖 Bot-Rate-Limiting + 🛡️ Mit Cache-Validierung und Fail-Open + 🚦 Bots unter Rate-Limit werden durchgelassen +============================================================ + [1] Aktivieren (einzeln) [2] Deaktivieren (einzeln) [3] Logs anzeigen @@ -188,16 +221,16 @@ Das war's! Das Script ist vollständig selbstverwaltend. [0] Beenden ``` -### Blocking-Modus wählen +### Modus-Auswahl -Bei jeder Aktivierung (einzeln oder alle) wird nach dem Modus gefragt: +Bei jeder Aktivierung 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) + [3] 🤖 Bot-Rate-Limiting (weltweit erreichbar, mit CrowdSec) + [4] 🤖 Bot-Rate-Limiting (weltweit erreichbar, ohne CrowdSec) Modus wählen [1/2/3/4]: ``` @@ -206,289 +239,88 @@ Modus wählen [1/2/3/4]: | Situation | Empfohlener Modus | |-----------|-------------------| -| Server direkt im Internet | GeoIP + CrowdSec 🛡️ | -| Server hinter CDN (Link11, Cloudflare) | Nur GeoIP 📝 | -| Nur Bots blocken, Shop weltweit erreichbar | Bot-Only 🤖 | -| CrowdSec nicht installiert | Nur GeoIP 📝 oder Bot-Only 🤖 | -| Minimaler Overhead gewünscht | Nur GeoIP 📝 | -| Maximaler Schutz (alle Ports) | GeoIP + CrowdSec 🛡️ | +| Server direkt im Internet, Geo-Blocking gewünscht | GeoIP + CrowdSec 🛡️ | +| Server hinter CDN, Geo-Blocking gewünscht | Nur GeoIP 📝 | +| Weltweit erreichbar bleiben, nur Bots bremsen | Bot-Rate-Limiting 🤖 | +| CrowdSec nicht installiert | Nur GeoIP 📝 oder Bot-only 🤖 | -### Bot-Only Modus mit Rate-Limiting - -Wenn du Modus [3] oder [4] wählst, wirst du zusätzlich nach dem Rate-Limit gefragt: +### Geo-Region wählen (nur GeoIP-Modi) ``` -🚦 Rate-Limit Konfiguration: - Requests pro Minute bevor Ban [30]: 20 - Ban-Dauer in Minuten [5]: 10 +🌍 Wähle die Geo-Region: + [1] 🇩🇪🇦🇹🇨🇭 DACH - Deutschland, Österreich, Schweiz + [2] 🇪🇺 Eurozone+GB - 22 Länder - ✅ Rate-Limit: 20 req/min - ✅ Ban-Dauer: 10 Minuten +Region wählen [1/2]: ``` -**Empfohlene Werte:** +### Beispielausgabe: Bot-Only Aktivierung -| Szenario | Rate-Limit | Ban-Dauer | -|----------|------------|-----------| -| Normale Abwehr | 30 req/min | 5 min | -| Aggressive Bots | 10 req/min | 15 min | -| Sehr strikt | 5 req/min | 30 min | - -### 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** (GeoIP oder Bot-Only, mit/ohne CrowdSec) -5. Bei Bot-Only: **Rate-Limit konfigurieren** -6. Bestätigen mit `ja` - -**Was passiert (Bot-Only Modus):** -- Backup der `index.php` wird erstellt -- `geoip_blocking.php` wird erstellt mit Bot-Patterns und Rate-Limiting -- Rate-Limit Verzeichnisse werden erstellt (`geoip_ratelimit/bans/`, `geoip_ratelimit/counts/`) -- Shop wird für Tracking registriert -- Blocking ist sofort aktiv -- 30+ Bot-Patterns werden erkannt und geblockt - -### 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. Bei Bot-Only: **Rate-Limit konfigurieren** (gilt für alle Shops) -6. Bestätigen mit `ja` - -**Beispielausgabe (Bot-Only):** ``` -══════════════════════════════════════════════════════════════ - Blocking für ALLE Shops aktivieren -══════════════════════════════════════════════════════════════ - -📋 5 Shop(s): - • shop1.example.com [Link11] - • shop2.example.com [Direkt] - ... - -🔧 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]: 4 - -🚦 Rate-Limit Konfiguration: - Requests pro Minute bevor Ban [30]: 30 - Ban-Dauer in Minuten [5]: 5 - - ✅ Rate-Limit: 30 req/min - ✅ Ban-Dauer: 5 Minuten - -⚠️ Modus: Nur Bot-Block 🤖 +🔧 Aktiviere 🤖 Bot-Only für: shop.example.com + Modus: Bot-Rate-Limiting (weltweit erreichbar) Rate-Limit: 30 req/min, Ban: 5 min + CrowdSec: Nein +============================================================ -Fortfahren? (ja/nein): ja +[1/4] CrowdSec-Synchronisation deaktiviert -══════════════════════════════════════════════════════════════ +[2/4] Aktiviere PHP-Blocking... + ✅ PHP-Blocking aktiviert -[1/5] shop1.example.com - ✅ Aktiviert (32 Bot-Patterns, 30 req/min) +[3/4] Cache-Generierung nicht erforderlich (Bot-Only) -[2/5] shop2.example.com - ✅ Aktiviert (32 Bot-Patterns, 30 req/min) -... +[4/4] Registriere Shop... -══════════════════════════════════════════════════════════════ - ✅ 5 Shop(s) aktiviert - 🚦 Rate-Limit: 30 req/min, Ban: 5 min -══════════════════════════════════════════════════════════════ +============================================================ +✅ 🤖 Bot-Only aktiviert + Shop: shop.example.com + Modus: Nur Bot-Rate-Limit 🤖 + 🤖 32 Bot-Patterns aktiv + 🚦 Rate-Limit: 30 req/min, Ban: 5 min + ℹ️ Bots unter dem Limit werden durchgelassen + Gültig bis: 2025-12-12 19:30:00 CET +============================================================ ``` -### 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. Bei Bot-Only: **Rate-Limit konfigurieren** -6. 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] -``` - -**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 -- Rate-Limit Verzeichnis wird gelöscht (Bot-Only Modus) -- 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) -- Löscht alle Rate-Limit Daten (Bot-Only Shops) -- Deinstalliert den Watcher-Service am Ende (falls aktiv) -- Zusammenfassung mit Erfolgs-/Fehlerzählung - ### Logs anzeigen -1. Script starten: `python3 geoip_shop_manager.py` -2. Option `[3] Logs anzeigen` wählen -3. Auswahl treffen: - -``` -📋 Logs anzeigen für: - [0] 📊 ALLE Shops (Zusammenfassung) - [1] shop1.example.com 🛡️ [Link11] - [2] shop2.example.com 🤖 [Direkt] - ... -``` - -Die Icons zeigen den Modus: -- 🛡️ = GeoIP + CrowdSec -- 📝 = Nur GeoIP -- 🤖🛡️ = Bot-Only + CrowdSec -- 🤖 = Nur Bot-Only - -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 (⌀ 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) ████████████ - -🚫 Rate-Limit Bans: 45 ausgelöst, 12 aktiv - ├─ shop1.example.com 🤖 🤖: 20 bans (5 aktiv) ██████████ - ├─ shop2.example.com 🤖 🤖: 15 bans (4 aktiv) ███████ - └─ shop3.example.com 🤖 🤖: 10 bans (3 aktiv) █████ - -🤖 Bot-Statistik (alle Shops): - Bingbot: 234x ███████████████████████████████████████████████ - GPTBot: 189x █████████████████████████████████████ - Googlebot: 156x ███████████████████████████████ - Bytespider: 98x ███████████████████ - ... - -🔥 Top 50 blockierte IPs (alle Shops): - 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 -- **Rate-Limit Bans**: Anzahl ausgelöster und aktiver Bans (Bot-Only Modus) -- **Bot-Statistik**: Welche Bots wie oft geblockt wurden -- CrowdSec-Bans pro Shop (nur für CrowdSec-Modi) -- 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: +Die Logs zeigen bei Bot-Only Modus auch die Rate-Limit Statistiken: ``` ══════════════════════════════════════════════════════════════════════ -📊 shop1.example.com | 🤖 Bot-Only 🤖 +📊 shop.example.com | 🤖 Bot-Only 🤖 ══════════════════════════════════════════════════════════════════════ -⏱️ Laufzeit: 1h 41m -📈 Blocks: 523 (5.2 req/min) +⏱️ Laufzeit: 2h 15m +📈 Log-Einträge: 1,234 (9.1 req/min) 🤖 Bot-Patterns: 32 aktiv 🚦 Rate-Limit: 30 req/min, Ban: 5 min -🚫 Bans: 20 ausgelöst, 5 aktiv +🚫 Bans: 23 ausgelöst, 3 aktiv 🤖 Bot-Statistik: - Bingbot: 234x ███████████████████████████████████████████████ - GPTBot: 189x █████████████████████████████████████ - Googlebot: 100x ████████████████████ - -📝 Letzte 30 Blocks: -[2025-12-09 18:45:23] BOT: Bingbot | IP: 40.77.167.75 | Count: 15/30 | URI: / -[2025-12-09 18:45:24] BOT: Bingbot | IP: 40.77.167.75 | Count: 16/30 | URI: /produkt -[2025-12-09 18:45:25] BANNED: Bingbot | IP: 40.77.167.75 | Exceeded 30 req/min | Ban: 5m -... - -🔥 Top 10 IPs: - 40.77.167.75 (Bingbot): 234x - 52.167.144.140 (Bingbot): 89x + Googlebot: 456x ███████████████████████████████████████ + Bingbot: 234x ███████████████████ + GPTBot: 189x ███████████████ + AhrefsBot: 123x ██████████ ... + +📝 Letzte 30 Log-Einträge: +[2025-12-09 19:45:23] BOT: Googlebot | IP: 66.249.66.1 | Count: 12/30 | URI: /produkt-123 +[2025-12-09 19:45:24] BOT: Googlebot | IP: 66.249.66.1 | Count: 13/30 | URI: /kategorie-abc +[2025-12-09 19:45:25] BANNED: GPTBot | IP: 20.15.240.64 | Exceeded 30 req/min | Ban: 5m | UA: ... +... ``` -### Status prüfen - -Option `[4] Status anzeigen` zeigt: -- Anzahl verfügbarer Shops -- Anzahl aktiver Blockings -- Liste aller Shops mit aktivem Blocking **und deren Modus** -- Rate-Limit Konfiguration (Bot-Only Modus) -- Aktive Bans (Bot-Only Modus) -- Link11-Status (farbcodiert) +### Status anzeigen ``` -📊 Status: 5/15 Shops aktiv - shop1.example.com [Link11] 🤖 🤖 - 523 blocks, 1h 41m, 32 Bot-Patterns, 30 req/min, 5 aktive Bans - shop2.example.com [Direkt] 🇩🇪🇦🇹🇨🇭 🛡️ - 412 blocks, 1h 40m, Cache: ✅8,234 - shop3.example.com [Direkt] 🇩🇪🇦🇹🇨🇭 📝 - 312 blocks, 1h 39m, Cache: ✅8,234 +📊 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, 32 Bot-Patterns, 30 req/min, 3 aktive Bans + shop3.example.com [Direkt] 🇪🇺 📝 + 312 blocks, 1h 39m, Cache: ✅12,456 ``` ## 🔧 Erweiterte Verwendung @@ -496,59 +328,24 @@ Option `[4] Status anzeigen` zeigt: ### Manuell CrowdSec Decisions prüfen ```bash -# Alle Decisions anzeigen (mit vollständiger Liste) +# Alle Decisions anzeigen 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) +### Rate-Limit Dateien prüfen ```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" -``` +# Aktive Bans anzeigen +find /var/www/vhosts/SHOP/httpdocs/geoip_ratelimit/bans/ -name "*.ban" -exec cat {} \; -### Rate-Limit Bans manuell prüfen (Bot-Only Modus) - -```bash -# Aktive Bans für einen Shop anzeigen -ls -la /var/www/vhosts/SHOP/httpdocs/geoip_ratelimit/bans/ +# 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 - -# Ban-Inhalt prüfen (Unix-Timestamp bis wann gebannt) -cat /var/www/vhosts/SHOP/httpdocs/geoip_ratelimit/bans/*.ban - -# Request-Counter prüfen -cat /var/www/vhosts/SHOP/httpdocs/geoip_ratelimit/counts/*.count -``` - -### Rate-Limit Bans manuell löschen - -```bash -# Alle Bans für einen Shop löschen -rm /var/www/vhosts/SHOP/httpdocs/geoip_ratelimit/bans/*.ban - -# Alle Counter zurücksetzen -rm /var/www/vhosts/SHOP/httpdocs/geoip_ratelimit/counts/*.count -``` - -### 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 @@ -564,37 +361,27 @@ journalctl -u geoip-crowdsec-watcher.service -f 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/`) +**GeoIP-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, nur GeoIP-Modi) -- `geoip_blocked.log` - Log der PHP-Level Blocks -- `geoip_crowdsec_queue.log` - Queue für CrowdSec-Synchronisation (nur CrowdSec-Modi) -- `geoip_ratelimit/` - Rate-Limit Daten (nur Bot-Only Modus) - - `bans/` - Aktive Bans (Hash → Unix-Timestamp) - - `counts/` - Request-Counter (Hash → window_start|count) +- `geoip_ip_ranges.cache` - Gecachte IP-Ranges (erneuert alle 24h) +- `geoip_blocked.log` - Log der Blocks +- `geoip_crowdsec_queue.log` - Queue für CrowdSec (nur +CrowdSec Modi) + +**Bot-Only Modi (zusätzlich):** +- `geoip_ratelimit/` - Rate-Limit Verzeichnis + - `bans/` - Aktive Bans (`.ban` Dateien) + - `counts/` - Request-Counter (`.count` Dateien) ### 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, Rate-Limit Config) +- `/var/lib/crowdsec/geoip_active_shops.json` - Tracking aktiver Shops ## ⚙️ Konfiguration @@ -603,7 +390,6 @@ cscli decisions delete --ip DEINE_IP Standardmäßig 72 Stunden. Zum Ändern editiere das Python-Script: ```python -# Zeile ~400 und ~750 expiry = datetime.now() + timedelta(hours=72) # Hier ändern ``` @@ -615,49 +401,22 @@ DEFAULT_RATE_LIMIT = 30 # Requests pro Minute DEFAULT_BAN_DURATION = 5 # Minuten ``` -### Watcher-Intervall ändern - -Standard: 5 Sekunden. Zum Ändern im Watcher-Script: - -```python -# Zeile ~140 -CHECK_INTERVAL = 5 # In Sekunden -``` - -### IP-Range-Cache-Dauer ändern - -Standard: 24 Stunden. Im PHP-Script: - -```php -$cache_duration = 86400; // In Sekunden -``` - ### Weitere Länder hinzufügen -Um weitere Länder zur Whitelist hinzuzufügen, editiere im Python-Script das PHP-Template. Suche nach: - -```php -$countries = ['de', 'at', 'ch']; // Germany, Austria, Switzerland -``` - -Füge weitere Ländercodes hinzu (z.B. `'nl'` für Niederlande, `'be'` für Belgien). Die verfügbaren Ländercodes findest du unter: https://www.ipdeny.com/ipblocks/data/aggregated/ - -### Bot-Patterns erweitern - -Im Python-Script findest du das Dictionary `BOT_PATTERNS`: +Editiere `GEO_REGIONS` im Python-Script: ```python -BOT_PATTERNS = { - 'GPTBot': r'GPTBot', - 'ClaudeBot': r'ClaudeBot', - # Weitere Patterns hinzufügen... +GEO_REGIONS = { + "dach": { + "countries": ["de", "at", "ch"], # Hier Länder hinzufügen + ... + }, + ... } ``` ### Link11-IP ändern -Falls Link11 eine andere IP verwendet, kann diese im Script angepasst werden: - ```python # Am Anfang des Scripts LINK11_IP = "128.65.223.106" # Hier ändern @@ -668,82 +427,27 @@ LINK11_IP = "128.65.223.106" # Hier ändern ### Was wird geblockt? **GeoIP-Modi:** -- ✅ Alle IPs außerhalb der konfigurierten Region (DACH oder Eurozone) +- ✅ Alle IPs außerhalb der konfigurierten Region - ✅ Auf PHP-Ebene: Sofortiger 403 Response -- ✅ Auf Firewall-Ebene (nur PHP+CrowdSec): Alle Ports (HTTP, HTTPS, SSH, FTP, etc.) +- ✅ Auf Firewall-Ebene (+CrowdSec): Alle Ports -**Bot-Only Modus:** -- ✅ 30+ bekannte Bot-Patterns (GPTBot, ClaudeBot, Bingbot, etc.) -- ✅ Bots die das Rate-Limit überschreiten werden temporär gebannt -- ✅ Normale Besucher weltweit erlaubt +**Bot-Only Modi:** +- ✅ Erkannte Bots die das Rate-Limit überschreiten +- ✅ Temporärer Ban (konfigurierbare Dauer) +- ❌ Bots unter dem Limit werden durchgelassen (gewollt!) ### Was wird NICHT geblockt? - ✅ Alle IPs aus den erlaubten Ländern (GeoIP-Modi) -- ✅ Normale Besucher ohne Bot-User-Agent (Bot-Only Modus) +- ✅ Normaler User-Traffic (Bot-Only Modi) +- ✅ Bots unter dem Rate-Limit (Bot-Only Modi) - ✅ Private IPs (192.168.x.x, 10.x.x.x, etc.) - ✅ Localhost (127.0.0.1) -### Erkannte Bot-Patterns - -| 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 | -| Social Media | FacebookBot, LinkedInBot, Twitterbot, Slackbot | -| SEO-Tools | AhrefsBot, SemrushBot, MJ12bot, DotBot, DataForSeoBot | -| Andere | Applebot, Amazonbot, Bytespider, PetalBot, UptimeRobot, Pingdom, curl, python-requests, Wget, Scrapy | - -## 🌐 CDN/Reverse-Proxy Hinweise - -### Problem bei CDN-Nutzung (Link11, Cloudflare, etc.) - -Wenn dein Server hinter einem CDN oder Reverse-Proxy steht: - -``` -Client (202.8.43.232) → CDN (85.131.143.x) → Dein Server - ↓ - iptables sieht nur CDN-IP! -``` - -**Folge:** CrowdSec Firewall-Bouncer kann die echte Client-IP nicht blocken, da er nur die CDN-IP sieht. - -### Lösung 1: PHP-only Modus - -Das PHP-Script liest die echte IP aus dem `X-Forwarded-For` Header: -- Funktioniert auch hinter CDN/Proxy -- Blockt zuverlässig auf Anwendungsebene -- Kein unnötiger CrowdSec-Overhead - -**Empfehlung für CDN-Nutzer:** Wähle bei der Aktivierung den Modus **[2] Nur GeoIP** oder **[4] Nur Bot-Block**. - -### Lösung 2: Option [7] - Nur direkte Shops - -Wenn du einen Mix aus Shops hast (einige hinter Link11, andere direkt): -- Nutze Option `[7] 🎯 Nur DIREKTE aktivieren (ohne Link11)` -- Das Script erkennt automatisch welche Shops hinter Link11 stehen -- Nur direkt exponierte Shops werden mit CrowdSec-Integration aktiviert -- Link11-geschützte Shops werden übersprungen - -### Prüfen ob CDN aktiv ist - -```bash -# Welche IPs verbinden sich zu nginx/Apache? -ss -tn state established '( sport = :80 or sport = :443 )' | head -20 - -# Wenn nur interne/CDN-IPs erscheinen → PHP-only Modus verwenden - -# DNS-Check für einen Shop -dig +short shop.example.com -# Wenn 128.65.223.106 → hinter Link11 -``` - ## 🐛 Troubleshooting ### Shop zeigt 500 Error -**Ursache**: PHP-Syntax-Fehler oder falsche Einbindung - ```bash # Prüfe PHP-Fehler-Log tail -50 /var/www/vhosts/SHOP/logs/error_log @@ -751,26 +455,34 @@ 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 - -# Deaktiviere via Script -python3 geoip_shop_manager.py # Option 2 ``` -### Rate-Limit funktioniert nicht (Bot-Only Modus) - -**Ursache**: Berechtigungsprobleme bei den Rate-Limit Verzeichnissen +### Rate-Limit funktioniert nicht ```bash -# Prüfe Berechtigungen +# Prüfe Verzeichnis-Berechtigungen ls -la /var/www/vhosts/SHOP/httpdocs/geoip_ratelimit/ -# Fix: Berechtigungen korrigieren +# Sollte 777 sein (PHP läuft als anderer User) +# Falls nicht: chmod -R 777 /var/www/vhosts/SHOP/httpdocs/geoip_ratelimit/ +``` -# Oder für alle Shops: -for dir in /var/www/vhosts/*/httpdocs/geoip_ratelimit; do - [ -d "$dir" ] && chmod -R 777 "$dir" && echo "Fixed: $dir" -done +### Bots werden sofort geblockt (nicht rate-limited) + +**Prüfe ob du die aktuelle Version (v3.4.3+) verwendest!** + +In älteren Versionen wurden Bots sofort geblockt. Ab v3.4.3 werden Bots unter dem Limit durchgelassen. + +```bash +# Version prüfen +grep "v3.4" geoip_shop_manager.py + +# Update durchführen +wget -O geoip_shop_manager.py https://git.jtl-hosting.de/... + +# Shops neu aktivieren (deaktivieren + aktivieren) +# damit das neue PHP-Template angewendet wird ``` ### Watcher-Service läuft nicht @@ -786,81 +498,18 @@ journalctl -u geoip-crowdsec-watcher.service -n 100 systemctl restart geoip-crowdsec-watcher.service ``` -### CrowdSec Decisions werden nicht erstellt +### Rate-Limit Verzeichnisse sind leer trotz Bot-Traffic + +**Berechtigungsproblem!** Das Python-Script läuft als root, aber PHP läuft als Domain-User. ```bash -# Prüfe ob Queue-Datei beschrieben wird -tail -f /var/www/vhosts/SHOP/httpdocs/geoip_crowdsec_queue.log - -# Prüfe Watcher-Logs -journalctl -u geoip-crowdsec-watcher.service -f - -# Prüfe CrowdSec API -cscli decisions add --ip 1.2.3.4 --duration 1m --type ban --reason "Test" -cscli decisions list | grep "1.2.3.4" -cscli decisions delete --ip 1.2.3.4 +# 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 ``` -### Firewall blockt nicht (trotz CrowdSec-Ban) - -**Mögliche Ursachen:** - -1. **CDN/Reverse-Proxy aktiv** → Nutze Option [7] oder wechsle zu PHP-only Modus -2. **Bouncer läuft nicht:** - ```bash - systemctl status crowdsec-firewall-bouncer - ``` -3. **iptables-Regeln fehlen:** - ```bash - iptables -L -n -v | grep crowdsec - ``` - -### Erlaubte IPs werden geblockt - -**Sehr unwahrscheinlich!** Aber falls doch: - -```bash -# Prüfe welche IP-Ranges als erlaubt erkannt werden -cat /var/www/vhosts/SHOP/httpdocs/geoip_ip_ranges.cache - -# Lösche Cache (wird neu geladen) -rm /var/www/vhosts/SHOP/httpdocs/geoip_ip_ranges.cache - -# Prüfe ob IP in erlaubten Ranges ist -php -r ' -$ip = "91.107.229.191"; -$ranges = unserialize(file_get_contents("/var/www/vhosts/SHOP/httpdocs/geoip_ip_ranges.cache")); -foreach($ranges as $range) { - list($subnet, $mask) = explode("/", $range); - $ip_long = ip2long($ip); - $subnet_long = ip2long($subnet); - $mask_long = -1 << (32 - (int)$mask); - if(($ip_long & $mask_long) == ($subnet_long & $mask_long)) { - echo "IP $ip ist in Range $range\n"; - } -} -' -``` - -### Cleanup nach Deaktivierung unvollständig - -```bash -# Manuelle Bereinigung aller GeoIP-Decisions (Einzeiler mit Fortschritt) -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" - -# 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 -``` +Ab v3.4.2 werden die Verzeichnisse automatisch mit 777 erstellt. ## 📊 Performance @@ -871,264 +520,89 @@ dig +short shop.example.com - **Cache-Dauer**: 24 Stunden - **RAM-Verbrauch**: ~5-10 MB pro Shop -### PHP-Level Blocking (Bot-Only mit Rate-Limiting) +### Bot-Rate-Limiting -- **Overhead pro Request**: ~1-3ms (File-basierte Checks) -- **Ban-Check**: ~0.5ms (einzelner File-Read) -- **Counter-Update**: ~1-2ms (File-Lock + Write) -- **Speicherplatz**: ~1 KB pro aktiver Bot (Hash-Dateien) +- **Overhead pro Request**: ~1-3ms (File-I/O) +- **Ban-Check**: ~0.5ms (schneller Pfad) +- **Cleanup**: Probabilistisch (1% der Requests) -### CrowdSec Firewall Blocking (nur CrowdSec-Modi) +### CrowdSec Firewall Blocking - **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://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 +# Blockierte IPs/Bots 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 - # 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 ``` -### CrowdSec Logs +### Bot-Statistik erstellen ```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 +# 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 ``` -### Statistiken +## 📚 Changelog -```bash -# Geblockte Pakete zählen -iptables -L -n -v | grep crowdsec-blacklists-5 +### v3.4.3 +- **FIX**: Rate-Limit Logik korrigiert - Bots unter dem Limit werden jetzt durchgelassen +- Vorher: Alle erkannten Bots wurden sofort mit 403 geblockt +- Nachher: Bots dürfen crawlen bis sie das Limit überschreiten, dann temporärer Ban +- PHP-Templates aktualisiert mit korrektem Flowchart -# Anzahl aktiver Bans -cscli decisions list --limit 0 | grep "GeoIP" | wc -l +### v3.4.2 +- **FIX**: Verzeichnis-Berechtigungen für Rate-Limit (0o777 statt 0o755) +- PHP läuft als Domain-User, nicht als root +- Explizite `os.chmod()` Aufrufe nach `os.makedirs()` -# 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 - -# Top 10 gebannte Bots (Bot-Only Modus) -grep "BOT:" /var/www/vhosts/SHOP/httpdocs/geoip_blocked.log | \ - grep -oP 'BOT: \K[^ |]+' | 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 (GeoIP-Modi) -3. ✅ **Link11-Status prüfen** (farbcodiert im Script) -4. ✅ **Modus wählen** (GeoIP vs. Bot-Only, mit/ohne CrowdSec) -5. ✅ **Rate-Limit konfigurieren** (Bot-Only Modus) -6. ✅ Bei gemischtem Setup: **Option [7]** für nur direkte Shops nutzen -7. ✅ Test mit kurzer Dauer (kann im Script angepasst werden) -8. ✅ 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 CrowdSec-Modi) -4. ✅ Rate-Limit Bans prüfen (Bot-Only Modus) -5. ✅ Server-Performance monitoren - -### Nach Deaktivierung - -1. ✅ Prüfen ob alle Decisions entfernt wurden (nur bei CrowdSec-Modi) -2. ✅ Rate-Limit Verzeichnis wird automatisch gelöscht (Bot-Only Modus) -3. ✅ Backup-Dateien können gelöscht werden (optional) -4. ✅ 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 -- **Rate-Limiting**: File-basiert, funktioniert ohne Redis/Memcached - -### 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 -- ✅ Bot-Only Modus für gezielte Bot-Abwehr ohne GeoBlocking - -## 🤝 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** (GeoIP/Bot-Only, mit/ohne CrowdSec) - - **Rate-Limit Konfiguration** (Bot-Only Modus) - - **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.4.2 -**Letztes Update**: Dezember 2025 -**Status**: Production Ready ✅ -**Erlaubte Regionen**: 🇩🇪🇦🇹🇨🇭 DACH | 🇪🇺 Eurozone+GB | 🤖 Bot-Only (weltweit) - -### Changelog - -#### v3.4.2 -- **FIX**: Verzeichnis-Berechtigungen für Rate-Limit (777 statt 755) -- PHP läuft als anderer User als root - Verzeichnisse müssen für alle schreibbar sein - -#### v3.4.1 +### v3.4.1 - **FIX**: Bot-Namen werden jetzt korrekt in Statistiken angezeigt -- Bot-Name wird direkt aus dem Log extrahiert (`BOT:` / `BANNED:`) statt aus UA geparst +- Bot-Name wird direkt aus Log extrahiert (BOT: / BANNED: Prefix) +- Fallback auf User-Agent Detection wenn nötig -#### v3.4.0 +### v3.4.0 - **NEU**: File-basiertes Rate-Limiting für Bot-Only Modus -- **NEU**: Konfigurierbare Rate-Limits (Requests/Minute) bei Aktivierung -- **NEU**: Konfigurierbare Ban-Dauer bei Überschreitung +- **NEU**: Konfigurierbare Rate-Limits (Requests/Minute, Ban-Dauer) - **NEU**: Sliding Window Counter Algorithmus -- **NEU**: Automatisches Cleanup abgelaufener Bans (probabilistisch) -- **NEU**: Retry-After Header bei gebannten Requests -- **NEU**: Rate-Limit Statistiken in Logs und Gesamtübersicht -- **NEU**: Verzeichnisstruktur `geoip_ratelimit/bans/` und `geoip_ratelimit/counts/` +- **NEU**: Probabilistisches Cleanup (1% der Requests) +- **NEU**: Ban-Check als schneller Pfad (vor Bot-Detection) -#### v3.3.0 +### 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 +### 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**: 30+ Bot-Patterns (GPTBot, ClaudeBot, Googlebot, etc.) -#### v3.1.0 +### 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**: DACH-Support (DE, AT, CH statt nur DE) +### v3.0.0 +- **NEU**: DACH-Support (DE, AT, CH) - 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 +--- -#### 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 \ No newline at end of file +**Version**: 3.4.3 +**Letztes Update**: Dezember 2025 +**Status**: Production Ready ✅ +**Erlaubte Regionen**: 🇩🇪🇦🇹🇨🇭 DACH | 🇪🇺 Eurozone+GB | 🤖 Bot-Only (weltweit) \ No newline at end of file