From d852b2ec5f19765e849acd0ae2e23f3960d72785 Mon Sep 17 00:00:00 2001 From: thomasciesla Date: Tue, 9 Dec 2025 18:45:21 +0100 Subject: [PATCH] README.md aktualisiert --- README.md | 468 ++++++++++++++++++++++++++++++++++++++---------------- 1 file changed, 327 insertions(+), 141 deletions(-) diff --git a/README.md b/README.md index 8d465cd..5b327bc 100644 --- a/README.md +++ b/README.md @@ -9,13 +9,15 @@ Dieses Tool ermöglicht es, einzelne oder alle Shops auf einem Plesk-Server temp - ✅ **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 - ✅ **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 - ✅ **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) +- ✅ **Gesamtübersicht**: Logs und Statistiken über alle Shops hinweg (Top 50 IPs) - ✅ **Auto-Deaktivierung**: Blocking läuft nach 72 Stunden automatisch ab - ✅ **Systemd-Service**: Automatischer Start beim Booten - ✅ **Sauberes Cleanup**: Vollständige Deinstallation bei Deaktivierung @@ -55,6 +57,70 @@ Dieses Tool ermöglicht es, einzelne oder alle Shops auf einem Plesk-Server temp > **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-Only 🤖 + +- 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 + +## 🚦 Rate-Limiting (Bot-Only Modus) + +Im Bot-Only Modus wird ein konfigurierbares Rate-Limiting angewendet: + +### Funktionsweise + +``` +Bot-Request kommt rein + │ + ▼ +┌───────────────────┐ +│ Ist IP+UA gebannt?│──── Ja ───▶ 403 + Exit (sofort) +└───────────────────┘ + │ Nein + ▼ +┌───────────────────┐ +│ Bot erkannt? │──── Nein ──▶ Weiter (normaler Traffic) +└───────────────────┘ + │ Ja + ▼ +┌───────────────────┐ +│ Counter erhöhen │ +│ Limit erreicht? │──── Ja ───▶ Ban erstellen + 403 +└───────────────────┘ + │ Nein + ▼ + 403 (normal) +``` + +### Konfiguration bei Aktivierung + +``` +🚦 Rate-Limit Konfiguration: + Requests pro Minute bevor Ban [30]: _ + Ban-Dauer in Minuten [5]: _ +``` + +### 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 + +### Verzeichnisstruktur + +``` +httpdocs/ +└── geoip_ratelimit/ + ├── bans/ + │ └── {hash}.ban # Inhalt: Unix-Timestamp (ban bis) + └── counts/ + └── {hash}.count # Inhalt: window_start|count +``` + ## 📋 Voraussetzungen - **Betriebssystem**: Ubuntu Server (getestet auf 24.04) @@ -128,44 +194,62 @@ Bei jeder Aktivierung (einzeln oder alle) wird nach dem Modus gefragt: ``` 🔧 Wähle den Blocking-Modus: - [1] PHP + CrowdSec (IPs werden an CrowdSec gemeldet) - [2] Nur PHP (keine CrowdSec-Synchronisation) + [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]: +Modus wählen [1/2/3/4]: ``` **Wann welchen Modus wählen?** | Situation | Empfohlener Modus | |-----------|-------------------| -| Server direkt im Internet | PHP + CrowdSec 🛡️ | -| Server hinter CDN (Link11, Cloudflare) | Nur PHP 📝 | -| CrowdSec nicht installiert | Nur PHP 📝 | -| Minimaler Overhead gewünscht | Nur PHP 📝 | -| Maximaler Schutz (alle Ports) | PHP + CrowdSec 🛡️ | +| 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 🛡️ | + +### Bot-Only Modus mit Rate-Limiting + +Wenn du Modus [3] oder [4] wählst, wirst du zusätzlich nach dem Rate-Limit gefragt: + +``` +🚦 Rate-Limit Konfiguration: + Requests pro Minute bevor Ban [30]: 20 + Ban-Dauer in Minuten [5]: 10 + + ✅ Rate-Limit: 20 req/min + ✅ Ban-Dauer: 10 Minuten +``` + +**Empfohlene Werte:** + +| 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** (PHP+CrowdSec oder Nur PHP) -5. Bestätigen mit `ja` +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 (PHP + CrowdSec Modus):** -- Bei ERSTEM Shop: Systemd-Service wird installiert und gestartet +**Was passiert (Bot-Only Modus):** - Backup der `index.php` wird erstellt -- `geoip_blocking.php` wird erstellt und eingebunden +- `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 -- Erlaubt werden nur IPs aus: 🇩🇪 Deutschland, 🇦🇹 Österreich, 🇨🇭 Schweiz - -**Was passiert (Nur PHP Modus):** -- Backup der `index.php` wird erstellt -- `geoip_blocking.php` wird erstellt (ohne CrowdSec-Queue) -- Shop wird für Tracking registriert -- Blocking ist sofort aktiv -- Kein Watcher-Service nötig +- 30+ Bot-Patterns werden erkannt und geblockt ### Blocking für ALLE Shops aktivieren @@ -173,31 +257,53 @@ Modus wählen [1/2]: 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` +5. Bei Bot-Only: **Rate-Limit konfigurieren** (gilt für alle Shops) +6. Bestätigen mit `ja` -**Beispielausgabe:** +**Beispielausgabe (Bot-Only):** ``` ══════════════════════════════════════════════════════════════ Blocking für ALLE Shops aktivieren ══════════════════════════════════════════════════════════════ -📋 Folgende 5 Shop(s) werden aktiviert: - +📋 5 Shop(s): • 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) + [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]: 2 +Modus wählen [1/2/3/4]: 4 -⚠️ Dies aktiviert den Schutz für alle oben genannten Shops! - Modus: Nur PHP 📝 +🚦 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 🤖 + Rate-Limit: 30 req/min, Ban: 5 min Fortfahren? (ja/nein): ja + +══════════════════════════════════════════════════════════════ + +[1/5] shop1.example.com + ✅ Aktiviert (32 Bot-Patterns, 30 req/min) + +[2/5] shop2.example.com + ✅ Aktiviert (32 Bot-Patterns, 30 req/min) +... + +══════════════════════════════════════════════════════════════ + ✅ 5 Shop(s) aktiviert + 🚦 Rate-Limit: 30 req/min, Ban: 5 min +══════════════════════════════════════════════════════════════ ``` ### Blocking nur für DIREKTE Shops aktivieren (ohne Link11) @@ -208,7 +314,8 @@ Diese Option ist besonders nützlich, wenn du einen Mix aus Shops hast - einige 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` +5. Bei Bot-Only: **Rate-Limit konfigurieren** +6. Bestätigen mit `ja` **Beispielausgabe:** ``` @@ -226,41 +333,6 @@ Diese Option ist besonders nützlich, wenn du einen Mix aus Shops hast - einige ⏭️ 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?** @@ -279,6 +351,7 @@ Fortfahren? (ja/nein): 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 @@ -294,6 +367,7 @@ Fortfahren? (ja/nein): ja - 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 @@ -307,13 +381,15 @@ Fortfahren? (ja/nein): ja 📋 Logs anzeigen für: [0] 📊 ALLE Shops (Zusammenfassung) [1] shop1.example.com 🛡️ [Link11] - [2] shop2.example.com 📝 [Direkt] + [2] shop2.example.com 🤖 [Direkt] ... ``` Die Icons zeigen den Modus: -- 🛡️ = PHP + CrowdSec -- 📝 = Nur PHP +- 🛡️ = GeoIP + CrowdSec +- 📝 = Nur GeoIP +- 🤖🛡️ = Bot-Only + CrowdSec +- 🤖 = Nur Bot-Only Die Farbcodierung zeigt den CDN-Status: - **Grün** = hinter Link11 @@ -330,15 +406,23 @@ Zeigt eine aggregierte Statistik über alle aktiven 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) █████████████████████ + ├─ 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) ████████████████ + ├─ 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) ████████████ + └─ shop3.example.com 🤖 🤖: 312 (3.1 req/min, seit 1h 39m) ████████████ -🛡️ CrowdSec-Bans gesamt: 892 - ├─ shop1.example.com 🇩🇪🇦🇹🇨🇭 🛡️: 401 ████████████████ - └─ shop3.example.com 🇩🇪🇦🇹🇨🇭 🛡️: 491 ███████████████████ +🚫 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] █████████████████████████ @@ -351,7 +435,9 @@ Zeigt eine aggregierte Statistik über alle aktiven Shops: **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) +- **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 @@ -359,29 +445,30 @@ Zeigt eine aggregierte Statistik über alle aktiven Shops: Zeigt detaillierte Logs für einen spezifischen Shop: ``` -📊 Logs für shop1.example.com [PHP + CrowdSec 🛡️] +══════════════════════════════════════════════════════════════════════ +📊 shop1.example.com | 🤖 Bot-Only 🤖 +══════════════════════════════════════════════════════════════════════ +⏱️ Laufzeit: 1h 41m +📈 Blocks: 523 (5.2 req/min) +🤖 Bot-Patterns: 32 aktiv +🚦 Rate-Limit: 30 req/min, Ban: 5 min +🚫 Bans: 20 ausgelöst, 5 aktiv -📝 PHP-Blocks: -================================================================================ -[2025-12-08 17:24:57] IP: 202.8.43.232 | UA: Mozilla/5.0 ... | URI: /produkt-123 +🤖 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 ... -================================================================================ -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) +🔥 Top 10 IPs: + 40.77.167.75 (Bingbot): 234x + 52.167.144.140 (Bingbot): 89x + ... ``` ### Status prüfen @@ -390,15 +477,17 @@ 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: 5/15 Shops aktiv - shop1.example.com [Link11] 🇩🇪🇦🇹🇨🇭 🛡️ - 523 blocks, 1h 41m, Cache: ✅8,234 - shop2.example.com [Direkt] 🇩🇪🇦🇹🇨🇭 📝 + 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] 🇩🇪🇦🇹🇨🇭 🛡️ + shop3.example.com [Direkt] 🇩🇪🇦🇹🇨🇭 📝 312 blocks, 1h 39m, Cache: ✅8,234 ``` @@ -423,6 +512,32 @@ cscli decisions list --limit 0 | grep "shop.example.com" 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" ``` +### 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/ + +# 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 @@ -468,15 +583,18 @@ cscli decisions delete --ip DEINE_IP - `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_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 PHP+CrowdSec Modus) +- `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) ### 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) +- `/var/lib/crowdsec/geoip_active_shops.json` - Tracking aktiver Shops (inkl. Modus, Rate-Limit Config) ## ⚙️ Konfiguration @@ -489,13 +607,12 @@ Standardmäßig 72 Stunden. Zum Ändern editiere das Python-Script: expiry = datetime.now() + timedelta(hours=72) # Hier ändern ``` -Und im PHP-Script Template: +### Rate-Limit Defaults ändern + ```python -# Zeile ~30-50 -GEOIP_SCRIPT = '''