diff --git a/README.md b/README.md index a80f299..c1da1f5 100644 --- a/README.md +++ b/README.md @@ -1,89 +1,55 @@ # GeoIP Shop Blocker Manager - DACH & Eurozone Version -**Hybrid-System für temporäres GeoIP-Blocking auf Plesk-Servern mit mehreren Shops** +**PHP-basiertes System für temporäres GeoIP-Blocking und Bot-Rate-Limiting auf Plesk-Servern** -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. +Dieses Tool ermöglicht es, einzelne oder alle Shops auf einem Plesk-Server temporär für alle Zugriffe außerhalb der konfigurierten Region zu sperren, oder Bots nach Bot-Typ zu rate-limitieren. ## 🎯 Features - ✅ **Flexible Regionen**: DACH (DE, AT, CH) oder Eurozone+GB (22 Länder) -- ✅ **Bot-Rate-Limiting**: Bots unter Limit durchlassen, bei Überschreitung temporär bannen +- ✅ **Bot-Rate-Limiting nach Bot-Typ**: Alle Requests eines Bot-Typs teilen sich EIN Limit - ✅ **Umfangreiche Bot-Erkennung**: 321 bekannte Bot-Patterns + 32 generische Fallback-Patterns - ✅ **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 +- ✅ **Zwei Modi**: GeoIP-Blocking oder Bot-Rate-Limiting - ✅ **Multi-Shop-Management**: Verwaltung mehrerer Shops auf einem Server - ✅ **Bulk-Operationen**: Alle Shops gleichzeitig aktivieren/deaktivieren - ✅ **Link11-Erkennung**: Automatische Erkennung ob Shop hinter Link11 CDN steht - ✅ **Nur direkte Shops**: Option um nur Shops ohne CDN-Schutz zu aktivieren -- ✅ **Gesamtübersicht**: Logs und Statistiken über alle Shops hinweg (Top 50 IPs) +- ✅ **Gesamtübersicht**: Logs und Statistiken über alle Shops hinweg - ✅ **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. +- ✅ **CDN-kompatibel**: Funktioniert mit Link11, Cloudflare & Co. - ✅ **Fail-Open**: Bei Cache-Fehlern wird Traffic durchgelassen (keine Ausfälle) ## 🏗️ Architektur -### Modus 1: GeoIP + CrowdSec 🛡️ +### Modus 1: GeoIP-Blocking 🌍 -#### Komponente 1: PHP-Script -- Wird in die `index.php` des Shops integriert +- PHP-Script wird in die `index.php` des Shops integriert - Lädt IP-Ranges von ipdeny.com (konfigurierte Länder) - Prüft jede Anfrage gegen diese Ranges -- Blockt Nicht-erlaubte IPs sofort mit HTTP 403 -- Schreibt blockierte IPs in Queue-Datei für CrowdSec +- Blockt nicht-erlaubte IPs sofort mit HTTP 403 +- Loggt alle Blocks -#### Komponente 2: Python Watcher (systemd service) -- Läuft permanent im Hintergrund als root -- Überwacht Queue-Dateien aller aktiven Shops -- Fügt blockierte IPs automatisch zu CrowdSec hinzu -- Vermeidet Duplikate durch In-Memory-Cache -- Prüft alle 5 Sekunden auf neue IPs - -#### Komponente 3: CrowdSec Firewall Bouncer -- Blockiert IPs auf Firewall-Ebene (iptables/nftables) -- Schützt ALLE Services (HTTP, HTTPS, SSH, FTP, etc.) -- Übernimmt Bans für 72 Stunden -- Deutlich performanter als PHP-Checks - -### Modus 2: Nur GeoIP 📝 - -- Nur das PHP-Script wird aktiviert -- Keine CrowdSec-Synchronisation -- Kein Watcher-Service nötig -- **Ideal für Server hinter CDN/Proxy** (Link11, Cloudflare, etc.) - -### Modus 3: Bot-Rate-Limiting + CrowdSec 🤖🛡️ +### Modus 2: Bot-Rate-Limiting 🤖 - Shop bleibt weltweit erreichbar -- Nur bekannte Bots werden rate-limited -- **Bots unter dem Limit werden durchgelassen** -- Bei Überschreitung: temporärer Ban + CrowdSec-Meldung - -### 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. +- Erkennt Bots anhand von User-Agent Patterns +- **Rate-Limit gilt PRO BOT-TYP** (nicht pro IP!) +- Alle Googlebot-Requests teilen sich EIN Limit +- Bei Überschreitung: Gesamter Bot-Typ wird temporär gebannt ## 🚦 Rate-Limiting (Bot-Only Modus) ### Funktionsweise -Das Rate-Limiting im Bot-Only Modus funktioniert wie folgt: - ``` Bot-Request kommt rein │ ▼ ┌───────────────────┐ -│ Ist IP+UA gebannt?│──── Ja ───▶ 403 + Exit (sofort) +│ Bot-Typ gebannt? │──── Ja ───▶ 403 + Exit (sofort) └───────────────────┘ │ Nein ▼ @@ -93,8 +59,9 @@ Bot-Request kommt rein │ Ja ▼ ┌───────────────────┐ -│ Counter erhöhen │ -│ Limit erreicht? │──── Ja ───▶ Ban erstellen + 403 +│ Bot-Typ Counter │ +│ erhöhen │ +│ Limit erreicht? │──── Ja ───▶ Bot-Typ bannen + 403 └───────────────────┘ │ Nein ▼ @@ -102,28 +69,42 @@ Bot-Request kommt rein (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. +### Wichtig: Rate-Limit pro Bot-Typ + +**Alle Requests eines Bot-Typs teilen sich EINEN Zähler**, unabhängig von: +- Der IP-Adresse +- Der genauen User-Agent Variante + +Beispiel mit Limit 30 req/min: + +| Request | IP | User-Agent | Bot-Typ | Zähler | +|---------|-----|-----------|---------|--------| +| 1 | 1.1.1.1 | Googlebot/2.1 | Googlebot | 1/30 | +| 2 | 2.2.2.2 | Googlebot/2.1 (+http...) | Googlebot | 2/30 | +| 3 | 3.3.3.3 | Googlebot-Image/1.0 | Googlebot-Image | 1/30 | +| ... | ... | ... | ... | ... | +| 31 | 99.99.99.99 | Googlebot/2.1 | Googlebot | **31/30 → BAN** | + +Nach dem Ban werden **ALLE** Googlebot-Requests geblockt (egal welche IP). ### Konfiguration bei Aktivierung -Bei Aktivierung des Bot-Only Modus werden zwei Werte abgefragt: - ``` 🚦 Rate-Limit Konfiguration: + (0 = Bots sofort bannen, kein Rate-Limiting) + ⚠️ ACHTUNG: Limit gilt pro Bot-TYP, nicht pro IP! Requests pro Minute bevor Ban [30]: Ban-Dauer in Minuten [5]: - ✅ Rate-Limit: 30 req/min + ✅ Rate-Limit: 30 req/min pro Bot-Typ ✅ 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 -- **Identifier**: MD5-Hash aus IP + User-Agent (ermöglicht granulare Tracking pro Bot-Typ) +- **Identifier**: MD5-Hash des erkannten Bot-Namens (z.B. `md5("Googlebot")`) - **Speicherung**: File-basiert in `geoip_ratelimit/` Verzeichnis +- **Ban-Format**: `timestamp|botname` (ermöglicht Anzeige des Bot-Namens) - **Cleanup**: Probabilistisch (1% der Requests) um Overhead zu minimieren - **Atomare Operationen**: File-Locking verhindert Race Conditions @@ -133,9 +114,9 @@ Bei Aktivierung des Bot-Only Modus werden zwei Werte abgefragt: httpdocs/ ├── geoip_ratelimit/ │ ├── bans/ -│ │ └── {hash}.ban # Unix-Timestamp wann Ban abläuft +│ │ └── {bot_hash}.ban # Format: unix_timestamp|bot_name │ └── counts/ -│ └── {hash}.count # Format: window_start|count +│ └── {bot_hash}.count # Format: window_start|count ``` ## 🤖 Erkannte Bot-Patterns @@ -179,28 +160,9 @@ Diese werden dann als `Bot (crawler)`, `Bot (spider)`, etc. angezeigt. - **Webserver**: Apache mit mod_rewrite (oder nginx) - **PHP**: Version 8.0 oder höher - **Python**: Version 3.8 oder höher -- **CrowdSec**: Installiert und aktiv (nur für +CrowdSec Modi) -- **CrowdSec Firewall Bouncer**: Installiert und konfiguriert (nur für +CrowdSec Modi) - **Plesk**: Optional, aber empfohlen - **Root-Zugriff**: Erforderlich für Installation und Verwaltung -### CrowdSec Installation prüfen (nur für +CrowdSec Modi) - -```bash -# Prüfe ob CrowdSec läuft -systemctl status crowdsec - -# Prüfe ob Firewall Bouncer aktiv ist -cscli bouncers list -``` - -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 @@ -226,10 +188,10 @@ Das war's! Das Script ist vollständig selbstverwaltend. ``` ============================================================ - GeoIP Shop Blocker Manager v3.5.0 + GeoIP Shop Blocker Manager v4.0.0 🇩🇪🇦🇹🇨🇭 DACH | 🇪🇺 Eurozone+GB | 🤖 Bot-Rate-Limiting 🛡️ Mit Cache-Validierung und Fail-Open - 🚦 Bots unter Rate-Limit werden durchgelassen + 🚦 Rate-Limiting nach BOT-TYP (nicht IP) ============================================================ [1] Aktivieren (einzeln) @@ -250,24 +212,21 @@ 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] 🤖 Bot-Rate-Limiting (weltweit erreichbar, mit CrowdSec) - [4] 🤖 Bot-Rate-Limiting (weltweit erreichbar, ohne CrowdSec) + [1] 🌍 GeoIP-Blocking (nur erlaubte Regionen) + [2] 🤖 Bot-Rate-Limiting (weltweit erreichbar, Bots limitiert) -Modus wählen [1/2/3/4]: +Modus wählen [1/2]: ``` **Wann welchen Modus wählen?** | Situation | Empfohlener Modus | |-----------|-------------------| -| Server direkt im Internet, Geo-Blocking gewünscht | GeoIP + CrowdSec 🛡️ | -| Server hinter CDN, Geo-Blocking gewünscht | Nur GeoIP 📝 | +| Nur bestimmte Länder erlauben | GeoIP-Blocking 🌍 | | Weltweit erreichbar bleiben, nur Bots bremsen | Bot-Rate-Limiting 🤖 | -| CrowdSec nicht installiert | Nur GeoIP 📝 oder Bot-only 🤖 | +| Aggressive Bots stoppen (verteilt über viele IPs) | Bot-Rate-Limiting 🤖 | -### Geo-Region wählen (nur GeoIP-Modi) +### Geo-Region wählen (nur GeoIP-Modus) ``` 🌍 Wähle die Geo-Region: @@ -281,34 +240,65 @@ Region wählen [1/2]: ``` 🔧 Aktiviere 🤖 Bot-Only für: shop.example.com - Modus: Bot-Rate-Limiting (weltweit erreichbar) - Rate-Limit: 30 req/min, Ban: 5 min - CrowdSec: Nein + Modus: Bot-Rate-Limiting nach Bot-Typ (weltweit erreichbar) + Rate-Limit: 30 req/min pro Bot-Typ, Ban: 5 min ============================================================ -[1/4] CrowdSec-Synchronisation deaktiviert - -[2/4] Aktiviere PHP-Blocking... +[1/3] Aktiviere PHP-Blocking... ✅ PHP-Blocking aktiviert -[3/4] Cache-Generierung nicht erforderlich (Bot-Only) +[2/3] Cache-Generierung nicht erforderlich (Bot-Only) -[4/4] Registriere Shop... +[3/3] Registriere Shop... ============================================================ ✅ 🤖 Bot-Only aktiviert Shop: shop.example.com - Modus: Nur Bot-Rate-Limit 🤖 - 🤖 321 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 + Modus: Bot-Rate-Limiting 🤖 + 🤖 321 Bot-Patterns + 32 generische Patterns + 🚦 Rate-Limit: 30 req/min PRO BOT-TYP + ⏱️ Ban-Dauer: 5 min + ℹ️ Alle Googlebot-Requests teilen sich EIN Limit! + Gültig bis: 2025-12-19 19:30:00 CET ============================================================ ``` -### Logs anzeigen +### Logs anzeigen - Gesamtübersicht -Die Logs zeigen bei Bot-Only Modus auch die Rate-Limit Statistiken: +``` +══════════════════════════════════════════════════════════════════════ + 📊 GESAMTÜBERSICHT ALLER SHOPS +══════════════════════════════════════════════════════════════════════ + Grün = hinter Link11 | Rot = Direkt + +🚫 AKTUELL GEBANNTE BOT-TYPEN: AhrefsBot, Bytespider (TikTok/ByteDance), SemrushBot + +📝 Log-Einträge gesamt: 1,234 (⌀ 5.2 req/min, Laufzeit: 3h 57m) + ├─ shop1.example.com 🤖 🤖: 456 (3.8 req/min, seit 2h 0m) ███████ + │ ├─➤ Googlebot: 234x, 1.9 req/min + │ ├─➤ Bingbot (Microsoft): 123x, 1.0 req/min + │ └─➤ AhrefsBot: 99x, 0.8 req/min + ├─ shop2.example.com 🤖 🤖: 778 (6.5 req/min, seit 2h 0m) █████████████ + │ ├─➤ Bytespider (TikTok/ByteDance): 456x, 3.8 req/min + │ ├─➤ GPTBot (OpenAI): 189x, 1.6 req/min + │ └─➤ ClaudeBot (Anthropic): 133x, 1.1 req/min + +🚫 Rate-Limit Bans: 5 ausgelöst, 3 Bot-Typen aktuell gebannt + ├─ shop1.example.com: 2 bans (1 Bot-Typen aktiv) █ + │ └─🚫 AhrefsBot + ├─ shop2.example.com: 3 bans (2 Bot-Typen aktiv) █ + │ └─🚫 Bytespider (TikTok/ByteDance) + │ └─🚫 SemrushBot + +🤖 Bot-Statistik nach Bot-Typ (alle Shops): + Googlebot: 456x ███████████████████████████████████████ + Bytespider (TikTok/ByteDance): 389x ████████████████████████████████ + Bingbot (Microsoft): 234x ███████████████████ + GPTBot (OpenAI): 189x ███████████████ + ... +``` + +### Logs anzeigen - Einzelner Shop ``` ══════════════════════════════════════════════════════════════════════ @@ -316,56 +306,40 @@ Die Logs zeigen bei Bot-Only Modus auch die Rate-Limit Statistiken: ══════════════════════════════════════════════════════════════════════ ⏱️ Laufzeit: 2h 15m 📈 Log-Einträge: 1,234 (9.1 req/min) -🤖 Bot-Patterns: 321 aktiv -🚦 Rate-Limit: 30 req/min, Ban: 5 min -🚫 Bans: 23 ausgelöst, 3 aktiv +🤖 Bot-Patterns: 321 + 32 generische +🚦 Rate-Limit: 30 req/min PRO BOT-TYP, Ban: 5 min +🚫 Bans: 3 ausgelöst, 2 Bot-Typen aktuell gebannt + Gebannt: AhrefsBot, Bytespider (TikTok/ByteDance) -🤖 Bot-Statistik: +🤖 Bot-Statistik (nach Bot-Typ): Googlebot: 456x ███████████████████████████████████████ Bingbot (Microsoft): 234x ███████████████████ GPTBot (OpenAI): 189x ███████████████ AhrefsBot: 123x ██████████ - Bytespider (TikTok/ByteDance): 98x ████████ - ClaudeBot (Anthropic): 76x ██████ - Amazonbot: 54x ████ ... - -📝 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 (OpenAI) | IP: 20.15.240.64 | Exceeded 30 req/min | Ban: 5m | UA: ... -... ``` ### Status anzeigen ``` 📊 5/15 Shops aktiv - shop1.example.com [Link11] 🇩🇪🇦🇹🇨🇭 🛡️ + shop1.example.com [Link11] 🇩🇪🇦🇹🇨🇭 🌍 523 blocks, 1h 41m, Cache: ✅8,234 shop2.example.com [Direkt] 🤖 🤖 - 1,234 log entries, 2h 15m, 321 Bot-Patterns, 30 req/min, 3 aktive Bans - shop3.example.com [Direkt] 🇪🇺 📝 + 1,234 log entries, 2h 15m, 321 Patterns, 30 req/min/Bot-Typ, 🚫 AhrefsBot, SemrushBot + shop3.example.com [Direkt] 🇪🇺 🌍 312 blocks, 1h 39m, Cache: ✅12,456 ``` ## 🔧 Erweiterte Verwendung -### Manuell CrowdSec Decisions prüfen - -```bash -# Alle Decisions anzeigen -cscli decisions list --limit 0 - -# Nur GeoIP-Blocks anzeigen -cscli decisions list --limit 0 | grep "GeoIP" -``` - ### Rate-Limit Dateien prüfen ```bash -# Aktive Bans anzeigen -find /var/www/vhosts/SHOP/httpdocs/geoip_ratelimit/bans/ -name "*.ban" -exec cat {} \; +# Aktive Bans anzeigen (mit Bot-Namen) +for f in /var/www/vhosts/SHOP/httpdocs/geoip_ratelimit/bans/*.ban; do + [ -f "$f" ] && echo "$(cat $f)" +done # Request-Counter anzeigen find /var/www/vhosts/SHOP/httpdocs/geoip_ratelimit/counts/ -name "*.count" -exec cat {} \; @@ -374,40 +348,37 @@ find /var/www/vhosts/SHOP/httpdocs/geoip_ratelimit/counts/ -name "*.count" -exec find /var/www/vhosts/SHOP/httpdocs/geoip_ratelimit/bans/ -name "*.ban" | wc -l ``` -### Systemd-Service verwalten +### Manuell einen Bot-Typ entbannen ```bash -# Status des Watcher-Service -systemctl status geoip-crowdsec-watcher.service +# Alle Bans löschen für einen Shop +rm -f /var/www/vhosts/SHOP/httpdocs/geoip_ratelimit/bans/*.ban -# Logs des Watcher-Service -journalctl -u geoip-crowdsec-watcher.service -f - -# Service neu starten -systemctl restart geoip-crowdsec-watcher.service +# Alle Counter zurücksetzen +rm -f /var/www/vhosts/SHOP/httpdocs/geoip_ratelimit/counts/*.count ``` ## 📁 Dateistruktur ### Pro Shop (in `/var/www/vhosts/SHOP/httpdocs/`) -**GeoIP-Modi:** +**GeoIP-Modus:** - `index.php.geoip_backup` - Backup der Original index.php - `geoip_blocking.php` - PHP-Blocking-Script - `geoip_ip_ranges.cache` - Gecachte IP-Ranges (erneuert alle 24h) - `geoip_blocked.log` - Log der Blocks -- `geoip_crowdsec_queue.log` - Queue für CrowdSec (nur +CrowdSec Modi) -**Bot-Only Modi (zusätzlich):** +**Bot-Only Modus:** +- `index.php.geoip_backup` - Backup der Original index.php +- `geoip_blocking.php` - PHP-Blocking-Script +- `geoip_blocked.log` - Log der Bot-Requests und Bans - `geoip_ratelimit/` - Rate-Limit Verzeichnis - - `bans/` - Aktive Bans (`.ban` Dateien) + - `bans/` - Aktive Bans (`.ban` Dateien, Format: `timestamp|botname`) - `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 +- `/var/lib/geoip/active_shops.json` - Tracking aktiver Shops ## ⚙️ Konfiguration @@ -423,7 +394,7 @@ expiry = datetime.now() + timedelta(hours=72) # Hier ändern ```python # Am Anfang des Scripts -DEFAULT_RATE_LIMIT = 30 # Requests pro Minute +DEFAULT_RATE_LIMIT = 30 # Requests pro Minute pro Bot-Typ DEFAULT_BAN_DURATION = 5 # Minuten ``` @@ -452,21 +423,20 @@ LINK11_IP = "128.65.223.106" # Hier ändern ### Was wird geblockt? -**GeoIP-Modi:** +**GeoIP-Modus:** - ✅ Alle IPs außerhalb der konfigurierten Region -- ✅ Auf PHP-Ebene: Sofortiger 403 Response -- ✅ Auf Firewall-Ebene (+CrowdSec): Alle Ports +- ✅ Sofortiger 403 Response -**Bot-Only Modi:** -- ✅ Erkannte Bots die das Rate-Limit überschreiten -- ✅ Temporärer Ban (konfigurierbare Dauer) +**Bot-Only Modus:** +- ✅ Erkannte Bot-Typen die das Rate-Limit überschreiten +- ✅ Temporärer Ban für den gesamten Bot-Typ - ❌ Bots unter dem Limit werden durchgelassen (gewollt!) ### Was wird NICHT geblockt? -- ✅ Alle IPs aus den erlaubten Ländern (GeoIP-Modi) -- ✅ Normaler User-Traffic (Bot-Only Modi) -- ✅ Bots unter dem Rate-Limit (Bot-Only Modi) +- ✅ Alle IPs aus den erlaubten Ländern (GeoIP-Modus) +- ✅ Normaler User-Traffic (Bot-Only Modus) +- ✅ Bots unter dem Rate-Limit (Bot-Only Modus) - ✅ Private IPs (192.168.x.x, 10.x.x.x, etc.) - ✅ Localhost (127.0.0.1) @@ -494,35 +464,16 @@ ls -la /var/www/vhosts/SHOP/httpdocs/geoip_ratelimit/ chmod -R 777 /var/www/vhosts/SHOP/httpdocs/geoip_ratelimit/ ``` -### Bots werden sofort geblockt (nicht rate-limited) +### Bots werden nicht erkannt -**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. +Prüfe ob der User-Agent in den Bot-Patterns enthalten ist: ```bash -# Version prüfen -grep "v3." 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 +# Im Log nach unbekannten Bots suchen +grep "Bot (.*)" /var/www/vhosts/SHOP/httpdocs/geoip_blocked.log ``` -### Watcher-Service läuft nicht - -```bash -# Status prüfen -systemctl status geoip-crowdsec-watcher.service - -# Logs prüfen -journalctl -u geoip-crowdsec-watcher.service -n 100 - -# Service neu starten -systemctl restart geoip-crowdsec-watcher.service -``` +Unbekannte Bots werden als `Bot (crawler)`, `Bot (spider)`, etc. erkannt, wenn sie generische Keywords enthalten. ### Rate-Limit Verzeichnisse sind leer trotz Bot-Traffic @@ -535,8 +486,6 @@ for dir in /var/www/vhosts/*/httpdocs/geoip_ratelimit; do done ``` -Ab v3.4.2 werden die Verzeichnisse automatisch mit 777 erstellt. - ## 📊 Performance ### PHP-Level Blocking (GeoIP) @@ -552,17 +501,12 @@ Ab v3.4.2 werden die Verzeichnisse automatisch mit 777 erstellt. - **Ban-Check**: ~0.5ms (schneller Pfad) - **Cleanup**: Probabilistisch (1% der Requests) -### CrowdSec Firewall Blocking - -- **Overhead**: 0ms (blockt vor PHP) -- **RAM**: ~20-50 MB (Watcher-Service) - ## 📝 Logs und Monitoring ### PHP-Level Logs ```bash -# Blockierte IPs/Bots für einen Shop +# Alle Log-Einträge für einen Shop tail -f /var/www/vhosts/SHOP/httpdocs/geoip_blocked.log # Nur BANNED Einträge (Rate-Limit überschritten) @@ -570,6 +514,9 @@ 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 + +# Nur BLOCKED Einträge (bereits gebannter Bot) +grep "BLOCKED (banned):" /var/www/vhosts/SHOP/httpdocs/geoip_blocked.log ``` ### Bot-Statistik erstellen @@ -582,67 +529,52 @@ grep -oP '(BOT|BANNED): \K[^|]+' /var/www/vhosts/SHOP/httpdocs/geoip_blocked.log ## 📚 Changelog +### v4.0.0 +- **BREAKING**: CrowdSec-Integration komplett entfernt +- **BREAKING**: Rate-Limiting jetzt nach **Bot-Typ** statt IP+UA +- **NEU**: Alle Requests eines Bot-Typs teilen sich EIN Limit +- **NEU**: Ban-Dateien speichern Bot-Namen (`timestamp|botname`) +- **NEU**: Anzeige der aktuell gebannten Bot-Typen mit Namen +- **NEU**: Top 3 Bot-Typen pro Shop in Gesamtübersicht +- **NEU**: Vereinfachte Modi: nur noch `geoip` und `bot` +- **ENTFERNT**: Watcher-Service (nicht mehr benötigt) +- **ENTFERNT**: CrowdSec Queue-Dateien +- **ENTFERNT**: Alle CrowdSec-Funktionen + ### v3.5.0 -- **NEU**: Erweiterte Bot-Erkennung mit **321 Bot-Patterns** (vorher ~35) -- **NEU**: 12 Bot-Kategorien: AI/LLM, Suchmaschinen, SEO, Social Media, E-Commerce, Archiv, Monitoring, Downloader, HTTP Libraries, Security Scanner, Automation, Feed Reader -- **NEU**: **32 generische Fallback-Patterns** für unbekannte Bots (bot, crawler, spider, etc.) -- **NEU**: Verbesserte Bot-Namen-Anzeige mit Kontext (z.B. "ClaudeBot (Anthropic)", "Bytespider (TikTok/ByteDance)") -- **NEU**: Amazon-Bots komplett: Amazonbot, Amazon-Kendra, AmazonBuyForMe, AMZNKAssocBot -- **NEU**: Alle wichtigen AI-Crawler: ChatGPT, Claude, Gemini, Perplexity, Cohere, Mistral, DeepSeek, etc. -- **NEU**: Deutsche Preisvergleiche: Idealo, Billiger.de, Guenstiger.de, Ladenzeile -- **NEU**: Security Scanner Erkennung: Nessus, SQLMap, Nikto, Burp Suite, OWASP ZAP, etc. +- Erweiterte Bot-Erkennung mit **321 Bot-Patterns** +- 12 Bot-Kategorien +- **32 generische Fallback-Patterns** -### v3.4.5 -- **FIX**: Regex delimiter escape für curl pattern - -### 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 - -### 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()` - -### v3.4.1 -- **FIX**: Bot-Namen werden jetzt korrekt in Statistiken angezeigt -- Bot-Name wird direkt aus Log extrahiert (BOT: / BANNED: Prefix) -- Fallback auf User-Agent Detection wenn nötig - -### v3.4.0 -- **NEU**: File-basiertes Rate-Limiting für Bot-Only Modus -- **NEU**: Konfigurierbare Rate-Limits (Requests/Minute, Ban-Dauer) -- **NEU**: Sliding Window Counter Algorithmus -- **NEU**: Probabilistisches Cleanup (1% der Requests) -- **NEU**: Ban-Check als schneller Pfad (vor Bot-Detection) +### v3.4.x +- Rate-Limit Logik korrigiert +- Verzeichnis-Berechtigungen (0o777) +- Bot-Namen in Statistiken ### 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) +- Option [7] - Nur direkte Shops aktivieren +- Link11-Erkennung per DNS-Lookup +- Farbcodierung im Menü ### 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**: 30+ Bot-Patterns (GPTBot, ClaudeBot, Googlebot, etc.) +- Bot-Only Blocking Modus +- 4 Blocking-Modi ### 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 +- Eurozone+GB Region (22 Länder) +- Cache-Validierung +- Fail-Open Mechanismus ### v3.0.0 -- **NEU**: DACH-Support (DE, AT, CH) -- Systemd-Service für Watcher +- DACH-Support - CrowdSec-Integration - Multi-Shop-Management --- -**Version**: 3.5.0 +**Version**: 4.0.0 **Letztes Update**: Dezember 2025 **Status**: Production Ready ✅ **Bot-Patterns**: 321 spezifisch + 32 generisch = 353 total +**Rate-Limiting**: Pro Bot-Typ (nicht pro IP) **Erlaubte Regionen**: 🇩🇪🇦🇹🇨🇭 DACH | 🇪🇺 Eurozone+GB | 🤖 Bot-Only (weltweit) \ No newline at end of file