README.md aktualisiert
This commit is contained in:
618
README.md
618
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
|
- ✅ **Automatische Synchronisation**: Blockierte IPs werden automatisch an CrowdSec weitergegeben
|
||||||
- ✅ **Multi-Shop-Management**: Verwaltung mehrerer Shops auf einem Server
|
- ✅ **Multi-Shop-Management**: Verwaltung mehrerer Shops auf einem Server
|
||||||
- ✅ **Bulk-Operationen**: Alle Shops gleichzeitig aktivieren/deaktivieren
|
- ✅ **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
|
- ✅ **Bot-Erkennung**: Automatische Identifikation von bekannten Bots/Crawlern
|
||||||
- ✅ **Link11-Erkennung**: Farbige Anzeige ob Shop hinter Link11 CDN ist
|
- ✅ **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
|
- ✅ **Systemd-Service**: Automatischer Start beim Booten
|
||||||
- ✅ **Sauberes Cleanup**: Vollständige Deinstallation bei Deaktivierung
|
- ✅ **Sauberes Cleanup**: Vollständige Deinstallation bei Deaktivierung
|
||||||
- ✅ **Plesk-kompatibel**: Funktioniert mit Plesk-verwalteten Shops
|
- ✅ **Plesk-kompatibel**: Funktioniert mit Plesk-verwalteten Shops
|
||||||
@@ -100,6 +100,7 @@ if (empty($allowed_ranges)) {
|
|||||||
- Blockt Nicht-Region-IPs sofort mit HTTP 403
|
- Blockt Nicht-Region-IPs sofort mit HTTP 403
|
||||||
- Schreibt blockierte IPs in Queue-Datei für CrowdSec
|
- Schreibt blockierte IPs in Queue-Datei für CrowdSec
|
||||||
- **Fail-Open** bei Cache-Problemen
|
- **Fail-Open** bei Cache-Problemen
|
||||||
|
- **Auto-Deaktivierung** nach 72 Stunden
|
||||||
|
|
||||||
#### Komponente 2: Python Watcher (systemd service)
|
#### Komponente 2: Python Watcher (systemd service)
|
||||||
- Läuft permanent im Hintergrund als root
|
- 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)
|
5. **Modus wählen** (PHP+CrowdSec oder Nur PHP)
|
||||||
6. Bestätigen mit `ja`
|
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:**
|
**Beispielausgabe:**
|
||||||
```
|
```
|
||||||
🔧 Aktiviere 🇪🇺 Eurozone + GB GeoIP-Blocking für: shop.example.com
|
🔧 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`
|
1. Script starten: `python3 geoip_shop_blocker.py`
|
||||||
2. Option `[5] 🚀 ALLE aktivieren` wählen
|
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)
|
4. **Geo-Region wählen** (gilt für alle Shops)
|
||||||
5. **Modus wählen** (gilt für alle Shops)
|
5. **Modus wählen** (gilt für alle Shops)
|
||||||
6. Bestätigen mit `ja`
|
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
|
### Status prüfen
|
||||||
|
|
||||||
Option `[4] Status` zeigt:
|
Option `[4] Status` zeigt:
|
||||||
|
|
||||||
```
|
```
|
||||||
📊 2/5 Shops aktiv
|
📊 2/5 Shops aktiv
|
||||||
shop1.example.com [Link11] 🇩🇪🇦🇹🇨🇭 🛡️
|
shop1.example.com [Link11] 🇪🇺 🛡️
|
||||||
1234 blocks, 2h 30m, Cache: ✅3,456
|
1234 blocks, 2h 30m, Cache: ✅12,345
|
||||||
shop2.example.com [Direkt] 🇪🇺 📝
|
shop2.example.com [Direkt] 🇩🇪🇦🇹🇨🇭 📝
|
||||||
567 blocks, 1h 15m, Cache: ✅12,345
|
567 blocks, 1h 15m, Cache: ✅3,456
|
||||||
```
|
```
|
||||||
|
|
||||||
**Legende:**
|
**Zeigt pro Shop:**
|
||||||
- 🟢 `[Link11]` = Shop ist hinter Link11 CDN
|
- Link11-Status (farbig)
|
||||||
- 🔴 `[Direkt]` = Shop ist direkt erreichbar
|
- Geo-Region Icon
|
||||||
- 🇩🇪🇦🇹🇨🇭 = DACH Region
|
- Modus Icon (🛡️ oder 📝)
|
||||||
- 🇪🇺 = Eurozone+GB Region
|
- Anzahl Blocks
|
||||||
- 🛡️ = PHP + CrowdSec Modus
|
- Laufzeit
|
||||||
- 📝 = Nur PHP Modus
|
- Cache-Status (✅ mit Anzahl oder ⚠️ bei Problemen)
|
||||||
- ✅ = 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
|
|
||||||
```
|
|
||||||
|
|
||||||
## 🔧 Erweiterte Verwendung
|
## 🔧 Erweiterte Verwendung
|
||||||
|
|
||||||
@@ -372,7 +495,7 @@ php -r 'echo count(unserialize(file_get_contents("/var/www/vhosts/SHOP/httpdocs/
|
|||||||
### Manuell CrowdSec Decisions prüfen
|
### Manuell CrowdSec Decisions prüfen
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
# Alle Decisions anzeigen
|
# Alle Decisions anzeigen (mit vollständiger Liste)
|
||||||
cscli decisions list --limit 0
|
cscli decisions list --limit 0
|
||||||
|
|
||||||
# Nur GeoIP-Blocks anzeigen
|
# Nur GeoIP-Blocks anzeigen
|
||||||
@@ -382,14 +505,23 @@ cscli decisions list --limit 0 | grep "GeoIP"
|
|||||||
cscli decisions list --limit 0 | grep "shop.example.com"
|
cscli decisions list --limit 0 | grep "shop.example.com"
|
||||||
```
|
```
|
||||||
|
|
||||||
### Alle GeoIP-Decisions löschen
|
### Alle GeoIP-Decisions löschen (Einzeiler)
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
while cscli decisions list -o raw --limit 0 | grep -q "GeoIP"; do \
|
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"
|
||||||
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; \
|
### Firewall-Statistiken prüfen
|
||||||
done && echo "✅ Alle GeoIP-Decisions gelöscht"
|
|
||||||
|
```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
|
### Systemd-Service verwalten
|
||||||
@@ -405,6 +537,19 @@ journalctl -u geoip-crowdsec-watcher.service -f
|
|||||||
systemctl restart geoip-crowdsec-watcher.service
|
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
|
## 📁 Dateistruktur
|
||||||
|
|
||||||
### Pro Shop (in `/var/www/vhosts/SHOP/httpdocs/`)
|
### 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_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) |
|
||||||
| `geoip_blocked.log` | Log der PHP-Level Blocks |
|
| `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
|
### System-weit
|
||||||
|
|
||||||
@@ -423,7 +568,43 @@ systemctl restart geoip-crowdsec-watcher.service
|
|||||||
|-------|--------------|
|
|-------|--------------|
|
||||||
| `/usr/local/bin/geoip_crowdsec_watcher.py` | Watcher-Service Script |
|
| `/usr/local/bin/geoip_crowdsec_watcher.py` | Watcher-Service Script |
|
||||||
| `/etc/systemd/system/geoip-crowdsec-watcher.service` | Systemd Service |
|
| `/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
|
## 🛡️ Sicherheit
|
||||||
|
|
||||||
@@ -431,11 +612,11 @@ systemctl restart geoip-crowdsec-watcher.service
|
|||||||
|
|
||||||
- ✅ Alle IPs außerhalb der gewählten Region
|
- ✅ Alle IPs außerhalb der gewählten Region
|
||||||
- ✅ Auf PHP-Ebene: Sofortiger 403 Response
|
- ✅ 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?
|
### 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.)
|
- ✅ Private IPs (192.168.x.x, 10.x.x.x, etc.)
|
||||||
- ✅ Localhost (127.0.0.1)
|
- ✅ Localhost (127.0.0.1)
|
||||||
- ✅ Bei Cache-Fehlern: Alle IPs (Fail-Open)
|
- ✅ 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!
|
**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
|
## 🐛 Troubleshooting
|
||||||
|
|
||||||
### Shop zeigt 403 für ALLE Besucher
|
### 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
|
```bash
|
||||||
# Cache prüfen
|
# 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
|
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
|
### Shop zeigt 500 Error
|
||||||
|
|
||||||
|
**Ursache**: PHP-Syntax-Fehler oder falsche Einbindung
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
# PHP-Fehler-Log prüfen
|
# Prüfe PHP-Fehler-Log
|
||||||
tail -50 /var/www/vhosts/SHOP/logs/error_log
|
tail -50 /var/www/vhosts/SHOP/logs/error_log
|
||||||
|
|
||||||
# Original wiederherstellen
|
# Stelle Original-Index wieder her
|
||||||
cd /var/www/vhosts/SHOP/httpdocs
|
cd /var/www/vhosts/SHOP/httpdocs
|
||||||
mv index.php.geoip_backup index.php
|
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
|
### Watcher-Service läuft nicht
|
||||||
@@ -503,27 +737,59 @@ journalctl -u geoip-crowdsec-watcher.service -n 100
|
|||||||
systemctl restart geoip-crowdsec-watcher.service
|
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
|
||||||
|
|
||||||
```
|
# Prüfe Watcher-Logs
|
||||||
Client (202.8.43.232) → CDN (85.131.143.x) → Dein Server
|
journalctl -u geoip-crowdsec-watcher.service -f
|
||||||
↓
|
|
||||||
iptables sieht nur CDN-IP!
|
# 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:
|
```bash
|
||||||
- 🟢 Grün = hinter Link11 (IP 128.65.223.106)
|
# Manuelle Bereinigung aller GeoIP-Decisions (Einzeiler mit Fortschritt)
|
||||||
- 🔴 Rot = Direkt erreichbar
|
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
|
## 📊 Performance
|
||||||
|
|
||||||
@@ -531,8 +797,14 @@ Das Script erkennt automatisch ob ein Shop hinter Link11 ist:
|
|||||||
|
|
||||||
| Region | Overhead pro Request | Erster Request | Cache-Dauer |
|
| Region | Overhead pro Request | Erster Request | Cache-Dauer |
|
||||||
|--------|---------------------|----------------|-------------|
|
|--------|---------------------|----------------|-------------|
|
||||||
| DACH | ~2-5ms | ~200-400ms | 24h |
|
| 🇩🇪🇦🇹🇨🇭 DACH | ~2-5ms | ~200-400ms | 24h |
|
||||||
| Eurozone+GB | ~5-10ms | ~800-1200ms | 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
|
### Empfohlene Limits
|
||||||
|
|
||||||
@@ -542,34 +814,68 @@ Das Script erkennt automatisch ob ein Shop hinter Link11 ist:
|
|||||||
| Mittel | 4-8 GB | 50 |
|
| Mittel | 4-8 GB | 50 |
|
||||||
| Groß | 16+ GB | Unbegrenzt |
|
| Groß | 16+ GB | Unbegrenzt |
|
||||||
|
|
||||||
## 📝 Changelog
|
## 📝 Logs und Monitoring
|
||||||
|
|
||||||
### v3.1.0 (Dezember 2025)
|
### PHP-Level Logs
|
||||||
- ✅ **Cache-Validierung** bei Aktivierung
|
|
||||||
- ✅ **Fail-Open** bei Cache-Fehlern
|
|
||||||
- ✅ **Selbstheilender Cache** (automatische Regeneration)
|
|
||||||
- ✅ Mindest-Range-Prüfung pro Region (DACH: 1000, Eurozone: 5000)
|
|
||||||
|
|
||||||
### v3.0.0
|
```bash
|
||||||
- ✅ **Eurozone+GB Region** (22 Länder)
|
# Blockierte IPs für einen Shop
|
||||||
- ✅ Region-Icons in Status/Logs
|
tail -f /var/www/vhosts/SHOP/httpdocs/geoip_blocked.log
|
||||||
- ✅ Dynamische PHP-Länder-Arrays
|
|
||||||
- ✅ Bot-Erkennung in Logs
|
|
||||||
- ✅ Link11-Erkennung (farbige Anzeige)
|
|
||||||
- ✅ req/min Statistiken
|
|
||||||
|
|
||||||
### v2.2.0
|
# Statistik
|
||||||
- ✅ Modus-Auswahl (PHP+CrowdSec oder Nur PHP)
|
wc -l /var/www/vhosts/SHOP/httpdocs/geoip_blocked.log
|
||||||
- ✅ Top 100 blockierte IPs in Gesamtübersicht
|
```
|
||||||
|
|
||||||
### v2.1.0
|
### CrowdSec Logs
|
||||||
- ✅ Bulk-Operationen (alle aktivieren/deaktivieren)
|
|
||||||
- ✅ Gesamtübersicht in Logs
|
|
||||||
|
|
||||||
### v2.0.0
|
```bash
|
||||||
- ✅ DACH-Support (DE, AT, CH)
|
# Watcher-Service Logs (Echtzeit)
|
||||||
- ✅ CrowdSec-Integration
|
journalctl -u geoip-crowdsec-watcher.service -f
|
||||||
- ✅ Systemd-Service
|
|
||||||
|
# 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
|
## ⚠️ 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
|
- **Geoblocking**: Kann gegen EU-Verordnungen verstoßen bei B2C-Geschäften
|
||||||
- **Haftung**: Nur für technische Notfälle/DDoS-Abwehr empfohlen
|
- **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
|
### Empfehlungen
|
||||||
|
|
||||||
- ✅ Nur temporär nutzen (Notfälle, Angriffe)
|
- ✅ Nur temporär nutzen (Notfälle, Angriffe)
|
||||||
- ✅ Nicht als permanente Lösung
|
- ✅ 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
|
- ✅ Bei CDN: PHP-only Modus verwenden
|
||||||
- ✅ Regelmäßig Status/Cache prüfen
|
|
||||||
|
|
||||||
## 📄 Lizenz
|
## 📄 Lizenz
|
||||||
|
|
||||||
@@ -594,10 +908,70 @@ MIT License
|
|||||||
|
|
||||||
- **IP-Ranges**: [ipdeny.com](https://www.ipdeny.com/) (RIPE-basiert)
|
- **IP-Ranges**: [ipdeny.com](https://www.ipdeny.com/) (RIPE-basiert)
|
||||||
- **CrowdSec**: [crowdsec.net](https://www.crowdsec.net/)
|
- **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
|
**Version**: 3.1.0
|
||||||
|
**Letztes Update**: Dezember 2025
|
||||||
**Status**: Production Ready ✅
|
**Status**: Production Ready ✅
|
||||||
**Regionen**: 🇩🇪🇦🇹🇨🇭 DACH | 🇪🇺 Eurozone+GB (22 Länder)
|
**Regionen**: 🇩🇪🇦🇹🇨🇭 DACH (3 Länder) | 🇪🇺 Eurozone+GB (22 Länder)
|
||||||
**Features**: Cache-Validierung 🛡️ | Fail-Open 🔓 | Bot-Erkennung 🤖
|
**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
|
||||||
Reference in New Issue
Block a user