diff --git a/README.md b/README.md index 81e87ad..85d337d 100644 --- a/README.md +++ b/README.md @@ -16,10 +16,10 @@ Dieses Tool ermöglicht es, einzelne oder alle Shops auf einem Plesk-Server temp - ✅ **Automatische Synchronisation**: Blockierte IPs werden automatisch an CrowdSec weitergegeben - ✅ **Multi-Shop-Management**: Verwaltung mehrerer Shops auf einem Server - ✅ **Bulk-Operationen**: Alle Shops gleichzeitig aktivieren/deaktivieren -- ✅ **Gesamtübersicht**: Logs und Statistiken über alle Shops hinweg (Top 100 IPs) +- ✅ **Gesamtübersicht**: Logs und Statistiken über alle Shops hinweg (Top 50 IPs) - ✅ **Bot-Erkennung**: Automatische Identifikation von bekannten Bots/Crawlern - ✅ **Link11-Erkennung**: Farbige Anzeige ob Shop hinter Link11 CDN ist -- ✅ **Auto-Deaktivierung**: Blocking läuft nach 72 Stunden automatisch ab +- ✅ **Auto-Deaktivierung**: PHP-Blocking UND CrowdSec-Bans laufen 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 @@ -100,6 +100,7 @@ if (empty($allowed_ranges)) { - Blockt Nicht-Region-IPs sofort mit HTTP 403 - Schreibt blockierte IPs in Queue-Datei für CrowdSec - **Fail-Open** bei Cache-Problemen +- **Auto-Deaktivierung** nach 72 Stunden #### Komponente 2: Python Watcher (systemd service) - Läuft permanent im Hintergrund als root @@ -241,6 +242,23 @@ Modus wählen [1/2]: 5. **Modus wählen** (PHP+CrowdSec oder Nur PHP) 6. Bestätigen mit `ja` +**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 +- **Cache wird generiert und validiert** +- Shop wird für Tracking registriert +- Blocking ist sofort aktiv +- Erlaubt werden nur IPs aus gewählter Region + +**Was passiert (Nur PHP Modus):** +- Backup der `index.php` wird erstellt +- `geoip_blocking.php` wird erstellt (ohne CrowdSec-Queue) +- **Cache wird generiert und validiert** +- Shop wird für Tracking registriert +- Blocking ist sofort aktiv +- Kein Watcher-Service nötig + **Beispielausgabe:** ``` 🔧 Aktiviere 🇪🇺 Eurozone + GB GeoIP-Blocking für: shop.example.com @@ -273,82 +291,187 @@ Modus wählen [1/2]: 1. Script starten: `python3 geoip_shop_blocker.py` 2. Option `[5] 🚀 ALLE aktivieren` wählen -3. Liste der zu aktivierenden Shops wird angezeigt +3. Liste der zu aktivierenden Shops wird angezeigt (farbig nach Link11-Status) 4. **Geo-Region wählen** (gilt für alle Shops) 5. **Modus wählen** (gilt für alle Shops) 6. Bestätigen mit `ja` +**Beispielausgabe:** +``` +══════════════════════════════════════════════════════════════ + GeoIP-Blocking für ALLE Shops aktivieren +══════════════════════════════════════════════════════════════ + +📋 5 Shop(s): + • shop1.example.com [Link11] ← grün + • shop2.example.com [Direkt] ← rot + • shop3.example.com [Link11] + ... + +🌍 Wähle die Geo-Region: + [1] 🇩🇪🇦🇹🇨🇭 DACH - Deutschland, Österreich, Schweiz + [2] 🇪🇺 Eurozone+GB - 22 Länder + +Region wählen [1/2]: 2 + +🔧 Wähle den Blocking-Modus: + [1] PHP + CrowdSec (IPs werden an CrowdSec gemeldet) + [2] Nur PHP (keine CrowdSec-Synchronisation) + +Modus wählen [1/2]: 2 + +⚠️ Region: 🇪🇺 Eurozone + GB + Modus: Nur PHP 📝 + +Fortfahren? (ja/nein): ja + +══════════════════════════════════════════════════════════════ + +[1/5] shop1.example.com + ⏳ Cache generieren... + ✅ Aktiviert (12,345 Ranges) +... + +══════════════════════════════════════════════════════════════ + ✅ 5 Shop(s) aktiviert + 🛡️ Fail-Open bei Cache-Fehlern aktiv +══════════════════════════════════════════════════════════════ +``` + +### Blocking deaktivieren (einzelner Shop) + +1. Script starten: `python3 geoip_shop_blocker.py` +2. Option `[2] Deaktivieren (einzeln)` wählen +3. Shop aus der Liste auswählen (zeigt Region und Modus an) +4. Bestätigen mit `ja` + +**Was passiert:** +- Original `index.php` wird wiederhergestellt +- Alle PHP-Dateien werden gelöscht (inkl. Cache) +- 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_blocker.py` +2. Option `[6] 🛑 ALLE deaktivieren` wählen +3. Liste der aktiven Shops wird angezeigt (mit Region-Icons) +4. Bestätigen mit `ja` + +### Logs anzeigen + +1. Script starten: `python3 geoip_shop_blocker.py` +2. Option `[3] Logs anzeigen` wählen +3. Auswahl treffen: + +``` +📋 Logs für: + [0] 📊 ALLE (Zusammenfassung) + [1] shop1.example.com [Link11] 🇪🇺 🛡️ + [2] shop2.example.com [Direkt] 🇩🇪🇦🇹🇨🇭 📝 + ... +``` + +Die Icons zeigen: +- 🛡️ = PHP + CrowdSec Modus +- 📝 = Nur PHP Modus +- 🇪🇺 = Eurozone+GB Region +- 🇩🇪🇦🇹🇨🇭 = DACH Region +- `[Link11]` grün = hinter Link11 CDN +- `[Direkt]` rot = direkt erreichbar + +#### Option [0]: Gesamtübersicht aller Shops + +Zeigt eine aggregierte Statistik über alle aktiven Shops: + +``` +══════════════════════════════════════════════════════════════════════ + 📊 GESAMTÜBERSICHT ALLER SHOPS +══════════════════════════════════════════════════════════════════════ + Grün = hinter Link11 | Rot = Direkt + +📝 PHP-Blocks gesamt: 5037 (⌀ 125.3 req/min, Laufzeit: 40m) + ├─ shop1.example.com 🇪🇺: 923 (23.0 req/min, seit 40m) ████████████████████ + │ └─➤ Top: 216.244.66.196 (DotBot) - 30x, 0.7 req/min + ├─ shop2.example.com 🇩🇪🇦🇹🇨🇭: 412 (10.3 req/min, seit 40m) ████████████ + │ └─➤ Top: 40.77.167.48 (Bingbot) - 25x, 0.6 req/min + └─ shop3.example.com 🇪🇺: 312 (7.8 req/min, seit 40m) ████████ + └─➤ Top: 52.167.144.139 (Bingbot) - 18x, 0.4 req/min + +🛡️ CrowdSec-Bans gesamt: 892 + ├─ shop1.example.com 🇪🇺: 401 ████████████████ + ├─ shop2.example.com 🇩🇪🇦🇹🇨🇭: 298 ███████████ + └─ shop3.example.com 🇪🇺: 193 ███████ + +🔥 Top 50 blockierte IPs (alle Shops): + 40.113.19.56 (Bingbot): 146 (3.6 req/min) → shop1.example.com [89x] █████████████ + 185.220.101.34 (Unbekannt): 127 (3.2 req/min) → shop2.example.com [65x] ██████████ + 45.95.169.22 (SemrushBot): 89 (2.2 req/min) → shop1.example.com [52x] ███████ + ... + +══════════════════════════════════════════════════════════════════════ +``` + +**Enthält:** +- Legende für Link11-Farben +- PHP-Blocks pro Shop mit req/min, Laufzeit und visuellen Balken +- **Top-IP pro Shop** mit Bot-Erkennung und req/min +- CrowdSec-Bans pro Shop (nur für PHP+CrowdSec Shops, farbig nach Link11) +- **Top 50** der am häufigsten blockierten IPs mit: + - Bot-Erkennung + - req/min + - Top-Shop für diese IP (farbig nach Link11) + - Visuelle Balken + +#### Option [1-n]: Einzelner Shop + +Zeigt detaillierte Logs für einen spezifischen Shop: + +``` +══════════════════════════════════════════════════════════════════════ +📊 shop1.example.com | 🇪🇺 Eurozone + GB +══════════════════════════════════════════════════════════════════════ +⏱️ Laufzeit: 2h 30m +📈 Blocks: 1234 (8.2 req/min) +✅ Cache: 12,345 Ranges + +📝 Letzte 30 Blocks: +[2025-12-09 10:24:57] IP: 202.8.43.232 | UA: Bytespider | URI: /produkt-123 +[2025-12-09 10:24:55] IP: 45.95.169.22 | UA: SemrushBot/7 | URI: /kategorie +... + +🔥 Top 10 IPs: + 202.8.43.232 (Bytespider): 127x + 45.95.169.22 (SemrushBot): 89x + 40.77.167.48 (Bingbot): 67x + ... +``` + +Bei PHP-only Shops wird angezeigt: +``` +📝 CrowdSec-Synchronisation ist für diesen Shop deaktiviert (PHP-only Modus) +``` + ### Status prüfen Option `[4] Status` zeigt: ``` 📊 2/5 Shops aktiv - shop1.example.com [Link11] 🇩🇪🇦🇹🇨🇭 🛡️ - 1234 blocks, 2h 30m, Cache: ✅3,456 - shop2.example.com [Direkt] 🇪🇺 📝 - 567 blocks, 1h 15m, Cache: ✅12,345 + shop1.example.com [Link11] 🇪🇺 🛡️ + 1234 blocks, 2h 30m, Cache: ✅12,345 + shop2.example.com [Direkt] 🇩🇪🇦🇹🇨🇭 📝 + 567 blocks, 1h 15m, Cache: ✅3,456 ``` -**Legende:** -- 🟢 `[Link11]` = Shop ist hinter Link11 CDN -- 🔴 `[Direkt]` = Shop ist direkt erreichbar -- 🇩🇪🇦🇹🇨🇭 = DACH Region -- 🇪🇺 = Eurozone+GB Region -- 🛡️ = PHP + CrowdSec Modus -- 📝 = Nur PHP Modus -- ✅ = Cache valide mit Anzahl Ranges -- ⚠️ = Cache-Problem - -### Logs anzeigen - -Option `[3] Logs anzeigen` bietet: - -``` -📋 Logs für: - [0] 📊 ALLE (Zusammenfassung) - [1] shop1.example.com [Link11] 🇩🇪🇦🇹🇨🇭 🛡️ - [2] shop2.example.com [Direkt] 🇪🇺 📝 -``` - -#### Gesamtübersicht (Option 0) - -``` -════════════════════════════════════════════════════════════════ - 📊 GESAMTÜBERSICHT -════════════════════════════════════════════════════════════════ - - shop1.example.com 🇩🇪🇦🇹🇨🇭: 1234 (5.2 req/min) - shop2.example.com 🇪🇺: 567 (2.1 req/min) - -📊 Gesamt: 1801 Blocks - -🔥 Top 20 IPs: - 185.220.101.34 (Bytespider): 127x - 45.95.169.22 (SemrushBot): 89x - 194.26.192.64 (Unbekannt): 67x -``` - -#### Einzelner Shop - -Zeigt detaillierte Logs mit Bot-Erkennung: - -``` -════════════════════════════════════════════════════════════════ -📊 shop.example.com | 🇪🇺 Eurozone + GB -════════════════════════════════════════════════════════════════ -⏱️ Laufzeit: 2h 30m -📈 Blocks: 1234 (8.2 req/min) -✅ Cache: 12,345 Ranges - -📝 Letzte 30 Blocks: -[2025-12-09 10:24:57] IP: 202.8.43.232 | UA: Bytespider | URI: /produkt-123 -... - -🔥 Top 10 IPs: - 202.8.43.232 (Bytespider): 127x - 45.95.169.22 (SemrushBot): 89x -``` +**Zeigt pro Shop:** +- Link11-Status (farbig) +- Geo-Region Icon +- Modus Icon (🛡️ oder 📝) +- Anzahl Blocks +- Laufzeit +- Cache-Status (✅ mit Anzahl oder ⚠️ bei Problemen) ## 🔧 Erweiterte Verwendung @@ -372,7 +495,7 @@ php -r 'echo count(unserialize(file_get_contents("/var/www/vhosts/SHOP/httpdocs/ ### Manuell CrowdSec Decisions prüfen ```bash -# Alle Decisions anzeigen +# Alle Decisions anzeigen (mit vollständiger Liste) cscli decisions list --limit 0 # Nur GeoIP-Blocks anzeigen @@ -382,14 +505,23 @@ cscli decisions list --limit 0 | grep "GeoIP" cscli decisions list --limit 0 | grep "shop.example.com" ``` -### Alle GeoIP-Decisions löschen +### 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 cscli decisions delete --ip "$ip" 2>/dev/null; done; \ -done && echo "✅ Alle GeoIP-Decisions gelöscht" +while cscli decisions list -o raw --limit 0 | grep -q "GeoIP"; do cscli decisions list -o raw --limit 0 | grep "GeoIP" | cut -d',' -f3 | cut -d':' -f2 | while read ip; do echo "🗑️ Lösche: $ip"; cscli decisions delete --ip "$ip" 2>/dev/null; done; done && echo "✅ Alle GeoIP-Decisions gelöscht" +``` + +### Firewall-Statistiken prüfen + +```bash +# Geblockte Pakete in iptables +iptables -L -n -v | grep crowdsec + +# IPs im CrowdSec ipset +ipset list crowdsec-blacklists-5 | head -50 + +# Prüfe ob eine bestimmte IP gebannt ist +ipset test crowdsec-blacklists-5 1.2.3.4 ``` ### Systemd-Service verwalten @@ -405,6 +537,19 @@ 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/`) @@ -415,7 +560,7 @@ systemctl restart geoip-crowdsec-watcher.service | `geoip_blocking.php` | PHP-Blocking-Script | | `geoip_ip_ranges.cache` | Gecachte IP-Ranges (erneuert alle 24h) | | `geoip_blocked.log` | Log der PHP-Level Blocks | -| `geoip_crowdsec_queue.log` | Queue für CrowdSec (nur PHP+CrowdSec) | +| `geoip_crowdsec_queue.log` | Queue für CrowdSec-Synchronisation (nur PHP+CrowdSec) | ### System-weit @@ -423,7 +568,43 @@ systemctl restart geoip-crowdsec-watcher.service |-------|--------------| | `/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 und Region) | + +## ⚙️ Konfiguration + +### Blocking-Dauer ändern + +Standardmäßig 72 Stunden. Zum Ändern editiere das Python-Script: + +```python +# In activate_blocking() und activate_all_shops() +expiry = datetime.now() + timedelta(hours=72) # Hier ändern +``` + +### Watcher-Intervall ändern + +Standard: 5 Sekunden. Im Watcher-Script: + +```python +CHECK_INTERVAL = 5 # In Sekunden +``` + +### IP-Range-Cache-Dauer ändern + +Standard: 24 Stunden. Im PHP-Script: + +```php +$cache_duration = 86400; // In Sekunden +``` + +### Mindest-Ranges für Cache-Validierung ändern + +```python +MIN_RANGES = { + "dach": 1000, # Minimum für DACH + "eurozone": 5000 # Minimum für Eurozone+GB +} +``` ## 🛡️ Sicherheit @@ -431,11 +612,11 @@ systemctl restart geoip-crowdsec-watcher.service - ✅ Alle IPs außerhalb der gewählten Region - ✅ Auf PHP-Ebene: Sofortiger 403 Response -- ✅ Auf Firewall-Ebene (nur PHP+CrowdSec): Alle Ports +- ✅ Auf Firewall-Ebene (nur PHP+CrowdSec): Alle Ports (HTTP, HTTPS, SSH, FTP, etc.) ### Was wird NICHT geblockt? -- ✅ Alle IPs aus der gewählten Region +- ✅ Alle IPs aus der gewählten Region (basierend auf RIPE/ipdeny.com Daten) - ✅ Private IPs (192.168.x.x, 10.x.x.x, etc.) - ✅ Localhost (127.0.0.1) - ✅ Bei Cache-Fehlern: Alle IPs (Fail-Open) @@ -449,11 +630,58 @@ systemctl restart geoip-crowdsec-watcher.service **Wir nutzen Fail-Open** - lieber kurzzeitig keinen Schutz als alle Kunden aussperren! +### Auto-Deaktivierung nach 72 Stunden + +Beide Blocking-Mechanismen laufen automatisch aus: + +1. **PHP-Blocking**: Das Script prüft ein Ablaufdatum und macht `return` nach 72h +2. **CrowdSec-Bans**: Werden mit `--duration 72h` erstellt + +**Sicherheitsfeature**: Falls jemand vergisst zu deaktivieren, läuft der Schutz automatisch aus. + +## 🌐 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**. + +### Link11 Erkennung + +Das Script erkennt automatisch ob ein Shop hinter Link11 ist: +- 🟢 Grün `[Link11]` = Shop resolves zu 128.65.223.106 +- 🔴 Rot `[Direkt]` = Shop ist direkt erreichbar + +### 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 403 für ALLE Besucher -**Mögliche Ursache**: Korrupter Cache +**Mögliche Ursache**: Korrupter Cache (sollte mit v3.1.0 durch Fail-Open verhindert werden) ```bash # Cache prüfen @@ -478,16 +706,22 @@ python3 geoip_shop_blocker.py # Option 2 curl -v https://www.ipdeny.com/ipblocks/data/aggregated/de-aggregated.zone | head -20 ``` +**Hinweis**: Bei Cache-Fehlern greift Fail-Open - Traffic wird durchgelassen! + ### Shop zeigt 500 Error +**Ursache**: PHP-Syntax-Fehler oder falsche Einbindung + ```bash -# PHP-Fehler-Log prüfen +# Prüfe PHP-Fehler-Log tail -50 /var/www/vhosts/SHOP/logs/error_log -# Original wiederherstellen +# Stelle Original-Index wieder her cd /var/www/vhosts/SHOP/httpdocs mv index.php.geoip_backup index.php -rm geoip_blocking.php geoip_ip_ranges.cache + +# Deaktiviere via Script +python3 geoip_shop_blocker.py # Option 2 ``` ### Watcher-Service läuft nicht @@ -503,27 +737,59 @@ journalctl -u geoip-crowdsec-watcher.service -n 100 systemctl restart geoip-crowdsec-watcher.service ``` -## 🌐 CDN/Reverse-Proxy Hinweise +### CrowdSec Decisions werden nicht erstellt -### Problem bei CDN-Nutzung +```bash +# Prüfe ob Queue-Datei beschrieben wird +tail -f /var/www/vhosts/SHOP/httpdocs/geoip_crowdsec_queue.log -``` -Client (202.8.43.232) → CDN (85.131.143.x) → Dein Server - ↓ - iptables sieht nur CDN-IP! +# 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 ``` -### Lösung: PHP-only Modus +### Firewall blockt nicht (trotz CrowdSec-Ban) -Das PHP-Script liest die echte IP - funktioniert auch hinter CDN/Proxy. +**Mögliche Ursachen:** -**Empfehlung für CDN-Nutzer:** Wähle **[2] Nur PHP** bei der Aktivierung. +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 + ``` -### Link11 Erkennung +### Cleanup nach Deaktivierung unvollständig -Das Script erkennt automatisch ob ein Shop hinter Link11 ist: -- 🟢 Grün = hinter Link11 (IP 128.65.223.106) -- 🔴 Rot = Direkt erreichbar +```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" +``` + +### Migration von älteren Versionen + +Falls du von einer älteren Version wechselst: + +```bash +# 1. Alle aktiven Shops deaktivieren (alte Version) +python3 geoip_shop_manager_old.py # Option 6 (alle deaktivieren) + +# 2. Alte Cache-Dateien löschen +rm /var/www/vhosts/*/httpdocs/dach_ip_ranges.cache + +# 3. Neue Version verwenden +python3 geoip_shop_blocker.py # Shops wieder aktivieren +``` ## 📊 Performance @@ -531,8 +797,14 @@ Das Script erkennt automatisch ob ein Shop hinter Link11 ist: | Region | Overhead pro Request | Erster Request | Cache-Dauer | |--------|---------------------|----------------|-------------| -| DACH | ~2-5ms | ~200-400ms | 24h | -| Eurozone+GB | ~5-10ms | ~800-1200ms | 24h | +| 🇩🇪🇦🇹🇨🇭 DACH | ~2-5ms | ~200-400ms | 24h | +| 🇪🇺 Eurozone+GB | ~5-10ms | ~800-1200ms | 24h | + +### CrowdSec Firewall Blocking (nur PHP+CrowdSec Modus) + +- **Overhead**: 0ms (blockt vor PHP) +- **RAM**: ~20-50 MB (Watcher-Service) +- **Geblockte Pakete**: Werden gar nicht erst an Apache weitergeleitet ### Empfohlene Limits @@ -542,34 +814,68 @@ Das Script erkennt automatisch ob ein Shop hinter Link11 ist: | Mittel | 4-8 GB | 50 | | Groß | 16+ GB | Unbegrenzt | -## 📝 Changelog +## 📝 Logs und Monitoring -### v3.1.0 (Dezember 2025) -- ✅ **Cache-Validierung** bei Aktivierung -- ✅ **Fail-Open** bei Cache-Fehlern -- ✅ **Selbstheilender Cache** (automatische Regeneration) -- ✅ Mindest-Range-Prüfung pro Region (DACH: 1000, Eurozone: 5000) +### PHP-Level Logs -### v3.0.0 -- ✅ **Eurozone+GB Region** (22 Länder) -- ✅ Region-Icons in Status/Logs -- ✅ Dynamische PHP-Länder-Arrays -- ✅ Bot-Erkennung in Logs -- ✅ Link11-Erkennung (farbige Anzeige) -- ✅ req/min Statistiken +```bash +# Blockierte IPs für einen Shop +tail -f /var/www/vhosts/SHOP/httpdocs/geoip_blocked.log -### v2.2.0 -- ✅ Modus-Auswahl (PHP+CrowdSec oder Nur PHP) -- ✅ Top 100 blockierte IPs in Gesamtübersicht +# Statistik +wc -l /var/www/vhosts/SHOP/httpdocs/geoip_blocked.log +``` -### v2.1.0 -- ✅ Bulk-Operationen (alle aktivieren/deaktivieren) -- ✅ Gesamtübersicht in Logs +### CrowdSec Logs -### v2.0.0 -- ✅ DACH-Support (DE, AT, CH) -- ✅ CrowdSec-Integration -- ✅ Systemd-Service +```bash +# Watcher-Service Logs (Echtzeit) +journalctl -u geoip-crowdsec-watcher.service -f + +# CrowdSec-Agent Logs +tail -f /var/log/crowdsec.log + +# Firewall-Bouncer Logs +journalctl -u crowdsec-firewall-bouncer.service -f +``` + +### Statistiken + +```bash +# Geblockte Pakete zählen +iptables -L -n -v | grep crowdsec-blacklists-5 + +# Anzahl aktiver Bans +cscli decisions list --limit 0 | grep "GeoIP" | wc -l + +# Top 10 blockierte IPs (PHP-Level) +cat /var/www/vhosts/SHOP/httpdocs/geoip_blocked.log | \ + grep -oP 'IP: \K[0-9.]+' | sort | uniq -c | sort -rn | head -10 +``` + +## 🔐 Best Practices + +### Vor Aktivierung + +1. ✅ Backup erstellen (macht das Script automatisch) +2. ✅ Sicherstellen, dass Admin-Zugriff aus gewählter Region kommt +3. ✅ **Region wählen** (DACH für DACH-only, Eurozone für EU-weit) +4. ✅ **Modus wählen** (PHP+CrowdSec für direkte Server, PHP-only für CDN) +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 (nur bei PHP+CrowdSec) +4. ✅ Server-Performance monitoren +5. ✅ Cache-Status im Status-Menü prüfen + +### Nach Deaktivierung + +1. ✅ Prüfen ob alle Decisions entfernt wurden (nur bei PHP+CrowdSec) +2. ✅ Backup-Dateien können gelöscht werden (optional) +3. ✅ Logs archivieren (falls benötigt) ## ⚠️ Wichtige Hinweise @@ -579,12 +885,20 @@ Das Script erkennt automatisch ob ein Shop hinter Link11 ist: - **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 empfohlen + ### Empfehlungen - ✅ Nur temporär nutzen (Notfälle, Angriffe) - ✅ Nicht als permanente Lösung +- ✅ Kombinieren mit anderen Security-Maßnahmen +- ✅ Regelmäßig Logs prüfen (Gesamtübersicht für schnellen Überblick) - ✅ Bei CDN: PHP-only Modus verwenden -- ✅ Regelmäßig Status/Cache prüfen ## 📄 Lizenz @@ -594,10 +908,70 @@ MIT License - **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. Prüfe den Cache-Status im Status-Menü +4. Erstelle ein GitHub Issue mit: + - Fehlerbeschreibung + - Relevante Logs + - System-Infos (OS, PHP-Version, CrowdSec-Version) + - **Verwendete Region** (DACH oder Eurozone+GB) + - **Verwendeter Modus** (PHP+CrowdSec oder PHP-only) + +## 📚 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.1.0 +**Letztes Update**: Dezember 2025 **Status**: Production Ready ✅ -**Regionen**: 🇩🇪🇦🇹🇨🇭 DACH | 🇪🇺 Eurozone+GB (22 Länder) -**Features**: Cache-Validierung 🛡️ | Fail-Open 🔓 | Bot-Erkennung 🤖 \ No newline at end of file +**Regionen**: 🇩🇪🇦🇹🇨🇭 DACH (3 Länder) | 🇪🇺 Eurozone+GB (22 Länder) +**Features**: Cache-Validierung 🛡️ | Fail-Open 🔓 | Bot-Erkennung 🤖 | Link11-Erkennung 🌐 + +### Changelog + +#### v3.1.0 +- **NEU**: Cache-Validierung bei Aktivierung +- **NEU**: Fail-Open bei Cache-Fehlern (kein Total-Lockout mehr) +- **NEU**: Selbstheilender Cache (automatische Regeneration bei Korruption) +- **NEU**: Mindest-Range-Prüfung pro Region (DACH: 1000, Eurozone: 5000) +- **NEU**: Cache-Status in Status-Anzeige (✅ oder ⚠️) + +#### v3.0.0 +- **NEU**: Eurozone+GB Region (22 Länder) +- **NEU**: Region-Auswahl bei Aktivierung +- **NEU**: Region-Icons in Status/Logs (🇩🇪🇦🇹🇨🇭 oder 🇪🇺) +- **NEU**: Bot-Erkennung in Logs (GPTBot, Googlebot, Bingbot, etc.) +- **NEU**: Link11-Erkennung (farbige Anzeige) +- **NEU**: req/min Statistiken pro Shop und IP +- **NEU**: Top-IP pro Shop in Gesamtübersicht +- Cache-Datei umbenannt zu `geoip_ip_ranges.cache` + +#### 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**: Top 100 blockierte IPs in Gesamtübersicht (jetzt Top 50) +- **FIX**: CrowdSec Cleanup nutzt jetzt `--limit 0` für vollständige Löschung + +#### 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 + +#### 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