From b162c1655fd0bb9d71dd420b3012417a65e27125 Mon Sep 17 00:00:00 2001 From: thomasciesla Date: Mon, 8 Dec 2025 18:14:23 +0100 Subject: [PATCH] README.md aktualisiert --- README.md | 280 ++++++++++++++++++++++++++++++++++++++++-------------- 1 file changed, 207 insertions(+), 73 deletions(-) diff --git a/README.md b/README.md index 38a46cc..6c21e20 100644 --- a/README.md +++ b/README.md @@ -2,56 +2,69 @@ **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 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 - ✅ **DACH-Region erlaubt**: Deutschland (DE), Österreich (AT), Schweiz (CH) - ✅ **Präzises Blocking**: PHP prüft gegen vollständige DACH IP-Ranges (keine Fehlblockierungen) -- ✅ **Doppelter Schutz**: PHP-Level + Firewall-Level (CrowdSec) +- ✅ **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 +- ✅ **Gesamtübersicht**: Logs und Statistiken über alle Shops hinweg (Top 100 IPs) - ✅ **Auto-Deaktivierung**: Blocking läuft nach 72 Stunden automatisch ab - ✅ **Systemd-Service**: Automatischer Start beim Booten - ✅ **Sauberes Cleanup**: Vollständige Deinstallation bei Deaktivierung - ✅ **Plesk-kompatibel**: Funktioniert mit Plesk-verwalteten Shops +- ✅ **CDN-kompatibel**: PHP-only Modus für Link11, Cloudflare & Co. ## 🏗️ Architektur -### Komponente 1: PHP-Script +### Modus 1: PHP + CrowdSec 🛡️ + +#### Komponente 1: PHP-Script - Wird in die `index.php` des Shops integriert - Lädt DACH IP-Ranges von ipdeny.com (DE, AT, CH) - Prüft jede Anfrage gegen diese Ranges - Blockt Nicht-DACH-IPs sofort mit HTTP 403 - Schreibt blockierte IPs in Queue-Datei für CrowdSec -### Komponente 2: Python Watcher (systemd service) +#### 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 +#### Komponente 3: CrowdSec Firewall Bouncer - Blockiert IPs auf Firewall-Ebene (iptables/nftables) - Schützt ALLE Services (HTTP, HTTPS, SSH, FTP, etc.) - Übernimmt Bans für 72 Stunden - Deutlich performanter als PHP-Checks +### Modus 2: Nur PHP 📝 + +- Nur das PHP-Script wird aktiviert +- Keine CrowdSec-Synchronisation +- Kein Watcher-Service nötig +- **Ideal für Server hinter CDN/Proxy** (Link11, Cloudflare, etc.) + +> **Hinweis**: Bei Servern hinter einem CDN/Reverse-Proxy (wie Link11, Cloudflare, Hetzner LB) sieht iptables nur die Proxy-IP, nicht die echte Client-IP. In diesem Fall ist der **PHP-only Modus** die bessere Wahl, da PHP die echte IP aus dem `X-Forwarded-For` Header liest. + ## 📋 Voraussetzungen - **Betriebssystem**: Ubuntu Server (getestet auf 24.04) -- **Webserver**: Apache mit mod_rewrite +- **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 -- **CrowdSec Firewall Bouncer**: Installiert und konfiguriert +- **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 +### CrowdSec Installation prüfen (nur für PHP+CrowdSec Modus) ```bash # Prüfe ob CrowdSec läuft @@ -106,14 +119,37 @@ Das war's! Das Script ist vollständig selbstverwaltend. [0] Beenden ``` +### Blocking-Modus wählen + +Bei jeder Aktivierung (einzeln oder alle) wird nach dem Modus gefragt: + +``` +🔧 Wähle den Blocking-Modus: + [1] PHP + CrowdSec (IPs werden an CrowdSec gemeldet) + [2] Nur PHP (keine CrowdSec-Synchronisation) + +Modus wählen [1/2]: +``` + +**Wann welchen Modus wählen?** + +| Situation | Empfohlener Modus | +|-----------|-------------------| +| Server direkt im Internet | PHP + CrowdSec 🛡️ | +| Server hinter CDN (Link11, Cloudflare) | Nur PHP 📝 | +| CrowdSec nicht installiert | Nur PHP 📝 | +| Minimaler Overhead gewünscht | Nur PHP 📝 | +| Maximaler Schutz (alle Ports) | PHP + CrowdSec 🛡️ | + ### Blocking aktivieren (einzelner Shop) 1. Script starten: `python3 geoip_shop_manager.py` 2. Option `[1] GeoIP-Blocking AKTIVIEREN (einzeln)` wählen 3. Shop aus der Liste auswählen -4. Bestätigen mit `ja` +4. **Modus wählen** (PHP+CrowdSec oder Nur PHP) +5. Bestätigen mit `ja` -**Was passiert:** +**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 @@ -121,19 +157,20 @@ Das war's! Das Script ist vollständig selbstverwaltend. - Blocking ist sofort aktiv - Erlaubt werden nur IPs aus: 🇩🇪 Deutschland, 🇦🇹 Österreich, 🇨🇭 Schweiz +**Was passiert (Nur PHP Modus):** +- Backup der `index.php` wird erstellt +- `geoip_blocking.php` wird erstellt (ohne CrowdSec-Queue) +- Shop wird für Tracking registriert +- Blocking ist sofort aktiv +- Kein Watcher-Service nötig + ### Blocking für ALLE Shops aktivieren 1. Script starten: `python3 geoip_shop_manager.py` 2. Option `[5] 🚀 ALLE Shops aktivieren` wählen 3. Liste der zu aktivierenden Shops wird angezeigt -4. Bestätigen mit `ja` - -**Was passiert:** -- Zeigt alle Shops an, die noch nicht geschützt sind -- Installiert den Watcher-Service (falls noch nicht vorhanden) -- Aktiviert das Blocking für jeden Shop nacheinander -- Zeigt Fortschritt während der Aktivierung -- Am Ende: Zusammenfassung mit Erfolgs-/Fehlerzählung +4. **Modus wählen** (gilt für alle Shops) +5. Bestätigen mit `ja` **Beispielausgabe:** ``` @@ -148,10 +185,22 @@ Das war's! Das Script ist vollständig selbstverwaltend. • shop3.example.com ... -[1/5] Aktiviere: shop1.example.com - ✅ Aktiviert (bis 2025-12-11 14:30) +🔧 Wähle den Blocking-Modus: + [1] PHP + CrowdSec (IPs werden an CrowdSec gemeldet) + [2] Nur PHP (keine CrowdSec-Synchronisation) -[2/5] Aktiviere: shop2.example.com +Modus wählen [1/2]: 2 + +⚠️ Dies aktiviert den Schutz für alle oben genannten Shops! + Modus: Nur PHP 📝 + +Fortfahren? (ja/nein): ja + +══════════════════════════════════════════════════════════════ + Starte Aktivierung (Nur PHP 📝)... +══════════════════════════════════════════════════════════════ + +[1/5] Aktiviere: shop1.example.com ✅ Aktiviert (bis 2025-12-11 14:30) ... @@ -163,6 +212,7 @@ Das war's! Das Script ist vollständig selbstverwaltend. ❌ Fehlgeschlagen: 0 🇩🇪 🇦🇹 🇨🇭 Nur DACH-Traffic erlaubt + 🔧 Modus: Nur PHP 📝 ⏰ Gültig für 72 Stunden ══════════════════════════════════════════════════════════════ ``` @@ -171,15 +221,15 @@ Das war's! Das Script ist vollständig selbstverwaltend. 1. Script starten: `python3 geoip_shop_manager.py` 2. Option `[2] GeoIP-Blocking DEAKTIVIEREN (einzeln)` wählen -3. Shop aus der Liste auswä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 -- Alle CrowdSec-Decisions werden entfernt +- Bei PHP+CrowdSec Modus: Alle CrowdSec-Decisions werden entfernt - Shop wird deregistriert -- Bei LETZTEM Shop: Systemd-Service wird deinstalliert +- Bei LETZTEM Shop mit CrowdSec: Systemd-Service wird deinstalliert ### Blocking für ALLE Shops deaktivieren @@ -191,8 +241,8 @@ Das war's! Das Script ist vollständig selbstverwaltend. **Was passiert:** - Zeigt alle Shops mit aktivem Blocking - Deaktiviert das Blocking für jeden Shop nacheinander -- Entfernt alle zugehörigen CrowdSec-Decisions -- Deinstalliert den Watcher-Service am Ende +- 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 @@ -204,11 +254,15 @@ Das war's! Das Script ist vollständig selbstverwaltend. ``` 📋 Logs anzeigen für: [0] 📊 ALLE Shops (Zusammenfassung) - [1] shop1.example.com - [2] shop2.example.com + [1] shop1.example.com 🛡️ + [2] shop2.example.com 📝 ... ``` +Die Icons zeigen den Modus: +- 🛡️ = PHP + CrowdSec +- 📝 = Nur PHP + #### Option [0]: Gesamtübersicht aller Shops Zeigt eine aggregierte Statistik über alle aktiven Shops: @@ -228,7 +282,7 @@ Zeigt eine aggregierte Statistik über alle aktiven Shops: ├─ shop2.example.com: 298 ███████████ └─ shop3.example.com: 193 ███████ -🔥 Top 10 blockierte IPs (alle Shops): +🔥 Top 100 blockierte IPs (alle Shops): 185.220.101.34: 127 █████████████████████████ 45.95.169.22: 89 █████████████████ 194.26.192.64: 67 █████████████ @@ -239,36 +293,76 @@ Zeigt eine aggregierte Statistik über alle aktiven Shops: **Enthält:** - PHP-Blocks pro Shop mit visuellen Balken -- CrowdSec-Bans pro Shop -- Top 10 der am häufigsten blockierten IPs über alle Shops hinweg +- CrowdSec-Bans pro Shop (nur für PHP+CrowdSec Shops) +- Top 100 der am häufigsten blockierten IPs über alle Shops hinweg #### Option [1-n]: Einzelner Shop Zeigt detaillierte Logs für einen spezifischen Shop: -- PHP-Level Blocks (letzte 50 Einträge) -- CrowdSec Firewall Bans (letzte 20 mit Ablaufzeit) -- Gesamtstatistiken + +``` +📊 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 anzeigen` zeigt: - Anzahl verfügbarer Shops - Anzahl aktiver Blockings -- Liste aller Shops mit aktivem Blocking +- Liste aller Shops mit aktivem Blocking **und deren Modus** + +``` +📊 Status: + Shops gesamt: 15 + Aktive DACH-Blockings: 5 + ✓ shop1.example.com [PHP+CS] 🛡️ + ✓ shop2.example.com [PHP] 📝 + ✓ shop3.example.com [PHP] 📝 + ✓ shop4.example.com [PHP+CS] 🛡️ + ✓ shop5.example.com [PHP] 📝 +``` ## 🔧 Erweiterte Verwendung ### Manuell CrowdSec Decisions prüfen ```bash -# Alle Decisions anzeigen -cscli decisions list +# Alle Decisions anzeigen (mit vollständiger Liste) +cscli decisions list --limit 0 # Nur GeoIP-Blocks anzeigen -cscli decisions list | grep "GeoIP" +cscli decisions list --limit 0 | grep "GeoIP" # Decisions für einen bestimmten Shop -cscli decisions list | grep "uhlig-kakteen.de" +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 @@ -318,13 +412,13 @@ cscli decisions delete --ip DEINE_IP - `geoip_blocking.php` - PHP-Blocking-Script - `dach_ip_ranges.cache` - Gecachte DACH IP-Ranges (erneuert alle 24h) - `geoip_blocked.log` - Log der PHP-Level Blocks -- `geoip_crowdsec_queue.log` - Queue für CrowdSec-Synchronisation +- `geoip_crowdsec_queue.log` - Queue für CrowdSec-Synchronisation (nur PHP+CrowdSec Modus) ### System-weit - `/usr/local/bin/geoip_crowdsec_watcher.py` - Watcher-Service Script - `/etc/systemd/system/geoip-crowdsec-watcher.service` - Systemd Service -- `/var/lib/crowdsec/geoip_active_shops.json` - Tracking aktiver Shops +- `/var/lib/crowdsec/geoip_active_shops.json` - Tracking aktiver Shops (inkl. Modus) ## ⚙️ Konfiguration @@ -378,8 +472,8 @@ Füge weitere Ländercodes hinzu (z.B. `'nl'` für Niederlande, `'be'` für Belg ### Was wird geblockt? - ✅ Alle IPs außerhalb der DACH IP-Ranges (DE, AT, CH) -- ✅ Auf allen Ebenen: HTTP, HTTPS, SSH, FTP, SMTP, etc. (durch CrowdSec) -- ✅ Auch wenn sie den PHP-Check umgehen (Firewall blockt) +- ✅ Auf PHP-Ebene: Sofortiger 403 Response +- ✅ Auf Firewall-Ebene (nur PHP+CrowdSec): Alle Ports (HTTP, HTTPS, SSH, FTP, etc.) ### Was wird NICHT geblockt? @@ -402,6 +496,38 @@ DACH-IPs können nur geblockt werden, wenn: 2. Die IP über einen ausländischen VPN/Proxy kommt 3. Die ipdeny.com Daten veraltet sind (wird täglich aktualisiert) +## 🌐 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: 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 PHP**. + +### 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 +``` + ## 🐛 Troubleshooting ### Shop zeigt 500 Error @@ -448,21 +574,19 @@ cscli decisions list | grep "1.2.3.4" cscli decisions delete --ip 1.2.3.4 ``` -### Firewall blockt nicht +### Firewall blockt nicht (trotz CrowdSec-Ban) -```bash -# Prüfe ob Bouncer läuft -systemctl status crowdsec-firewall-bouncer +**Mögliche Ursachen:** -# Prüfe ob Bouncer registriert ist -cscli bouncers list - -# Prüfe iptables-Regeln -iptables -L -n -v | grep crowdsec - -# Prüfe ipset -ipset list crowdsec-blacklists-5 | head -20 -``` +1. **CDN/Reverse-Proxy aktiv** → 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 + ``` ### DACH-IPs werden geblockt @@ -494,13 +618,11 @@ foreach($ranges as $range) { ### Cleanup nach Deaktivierung unvollständig ```bash -# Manuelle Bereinigung aller GeoIP-Decisions -cscli decisions list -o raw | grep "GeoIP" | cut -d',' -f3 | cut -d':' -f2 | while read ip; do - cscli decisions delete --ip "$ip" 2>/dev/null -done +# 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 | grep "GeoIP" +cscli decisions list --limit 0 | grep "GeoIP" ``` ### Migration von der alten DE-Only Version @@ -522,12 +644,12 @@ python3 geoip_shop_manager.py # Shops wieder aktivieren ### PHP-Level Blocking -- **Overhead pro Request**: ~2-8ms (bei gecachten IP-Ranges, etwas mehr als DE-only wegen mehr Ranges) +- **Overhead pro Request**: ~2-8ms (bei gecachten IP-Ranges) - **Erster Request**: ~400-800ms (beim Download der IP-Ranges für 3 Länder) - **Cache-Dauer**: 24 Stunden -- **RAM-Verbrauch**: ~5-10 MB pro Shop (mehr Ranges als DE-only) +- **RAM-Verbrauch**: ~5-10 MB pro Shop -### CrowdSec Firewall Blocking +### CrowdSec Firewall Blocking (nur PHP+CrowdSec Modus) - **Overhead**: 0ms (blockt vor PHP) - **RAM**: ~20-50 MB (Watcher-Service) @@ -600,7 +722,7 @@ journalctl -u crowdsec-firewall-bouncer.service -f iptables -L -n -v | grep crowdsec-blacklists-5 # Anzahl aktiver Bans -cscli decisions list | grep "GeoIP" | wc -l +cscli decisions list --limit 0 | grep "GeoIP" | wc -l # Top 10 blockierte IPs (PHP-Level) cat /var/www/vhosts/SHOP/httpdocs/geoip_blocked.log | \ @@ -613,19 +735,20 @@ cat /var/www/vhosts/SHOP/httpdocs/geoip_blocked.log | \ 1. ✅ Backup erstellen (macht das Script automatisch) 2. ✅ Sicherstellen, dass Admin-Zugriff aus DACH-Region kommt -3. ✅ Test mit kurzer Dauer (kann im Script angepasst werden) -4. ✅ Monitoring einrichten +3. ✅ **Modus wählen** (PHP+CrowdSec für direkte Server, PHP-only für CDN) +4. ✅ Test mit kurzer Dauer (kann im Script angepasst werden) +5. ✅ 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 +3. ✅ CrowdSec-Statistiken beobachten (nur bei PHP+CrowdSec) 4. ✅ Server-Performance monitoren ### Nach Deaktivierung -1. ✅ Prüfen ob alle Decisions entfernt wurden +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) @@ -642,6 +765,7 @@ cat /var/www/vhosts/SHOP/httpdocs/geoip_blocked.log | \ - **API-Calls**: Bei vielen aktiven Shops könnten viele IPs in CrowdSec landen - **CrowdSec-Limits**: Kostenloser Tier hat API-Limits - **Netzwerk**: Kein Blocking möglich, wenn Server selbst unter DDoS steht +- **CDN**: Bei CDN-Nutzung ist PHP-only Modus empfohlen ### Empfehlungen @@ -649,6 +773,7 @@ cat /var/www/vhosts/SHOP/httpdocs/geoip_blocked.log | \ - ✅ 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 verwenden ## 🤝 Contributing @@ -680,6 +805,7 @@ Bei Problemen: - Fehlerbeschreibung - Relevante Logs - System-Infos (OS, PHP-Version, CrowdSec-Version) + - **Verwendeter Modus** (PHP+CrowdSec oder PHP-only) ## 📚 Weitere Dokumentation @@ -690,18 +816,26 @@ Bei Problemen: --- -**Version**: 2.1.0 (DACH) +**Version**: 2.2.0 (DACH) **Letztes Update**: Dezember 2025 **Status**: Production Ready ✅ **Erlaubte Länder**: 🇩🇪 Deutschland | 🇦🇹 Österreich | 🇨🇭 Schweiz ### Changelog +#### 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**: Top 10 blockierte IPs über alle Shops hinweg - **NEU**: Visuelle Balken in der Statistik-Anzeige - Verbessertes Menü-Layout mit Trennlinien