README.md aktualisiert
This commit is contained in:
274
README.md
274
README.md
@@ -2,56 +2,69 @@
|
|||||||
|
|
||||||
**Hybrid-System für temporäres GeoIP-Blocking auf Plesk-Servern mit mehreren Shops**
|
**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
|
## 🎯 Features
|
||||||
|
|
||||||
- ✅ **DACH-Region erlaubt**: Deutschland (DE), Österreich (AT), Schweiz (CH)
|
- ✅ **DACH-Region erlaubt**: Deutschland (DE), Österreich (AT), Schweiz (CH)
|
||||||
- ✅ **Präzises Blocking**: PHP prüft gegen vollständige DACH IP-Ranges (keine Fehlblockierungen)
|
- ✅ **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
|
- ✅ **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
|
- ✅ **Gesamtübersicht**: Logs und Statistiken über alle Shops hinweg (Top 100 IPs)
|
||||||
- ✅ **Auto-Deaktivierung**: Blocking läuft nach 72 Stunden automatisch ab
|
- ✅ **Auto-Deaktivierung**: Blocking läuft 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
|
||||||
|
- ✅ **CDN-kompatibel**: PHP-only Modus für Link11, Cloudflare & Co.
|
||||||
|
|
||||||
## 🏗️ Architektur
|
## 🏗️ Architektur
|
||||||
|
|
||||||
### Komponente 1: PHP-Script
|
### Modus 1: PHP + CrowdSec 🛡️
|
||||||
|
|
||||||
|
#### Komponente 1: PHP-Script
|
||||||
- Wird in die `index.php` des Shops integriert
|
- Wird in die `index.php` des Shops integriert
|
||||||
- Lädt DACH IP-Ranges von ipdeny.com (DE, AT, CH)
|
- Lädt DACH IP-Ranges von ipdeny.com (DE, AT, CH)
|
||||||
- Prüft jede Anfrage gegen diese Ranges
|
- Prüft jede Anfrage gegen diese Ranges
|
||||||
- Blockt Nicht-DACH-IPs sofort mit HTTP 403
|
- Blockt Nicht-DACH-IPs sofort mit HTTP 403
|
||||||
- Schreibt blockierte IPs in Queue-Datei für CrowdSec
|
- 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
|
- Läuft permanent im Hintergrund als root
|
||||||
- Überwacht Queue-Dateien aller aktiven Shops
|
- Überwacht Queue-Dateien aller aktiven Shops
|
||||||
- Fügt blockierte IPs automatisch zu CrowdSec hinzu
|
- Fügt blockierte IPs automatisch zu CrowdSec hinzu
|
||||||
- Vermeidet Duplikate durch In-Memory-Cache
|
- Vermeidet Duplikate durch In-Memory-Cache
|
||||||
- Prüft alle 5 Sekunden auf neue IPs
|
- 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)
|
- Blockiert IPs auf Firewall-Ebene (iptables/nftables)
|
||||||
- Schützt ALLE Services (HTTP, HTTPS, SSH, FTP, etc.)
|
- Schützt ALLE Services (HTTP, HTTPS, SSH, FTP, etc.)
|
||||||
- Übernimmt Bans für 72 Stunden
|
- Übernimmt Bans für 72 Stunden
|
||||||
- Deutlich performanter als PHP-Checks
|
- 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
|
## 📋 Voraussetzungen
|
||||||
|
|
||||||
- **Betriebssystem**: Ubuntu Server (getestet auf 24.04)
|
- **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
|
- **PHP**: Version 8.0 oder höher
|
||||||
- **Python**: Version 3.8 oder höher
|
- **Python**: Version 3.8 oder höher
|
||||||
- **CrowdSec**: Installiert und aktiv
|
- **CrowdSec**: Installiert und aktiv (nur für PHP+CrowdSec Modus)
|
||||||
- **CrowdSec Firewall Bouncer**: Installiert und konfiguriert
|
- **CrowdSec Firewall Bouncer**: Installiert und konfiguriert (nur für PHP+CrowdSec Modus)
|
||||||
- **Plesk**: Optional, aber empfohlen
|
- **Plesk**: Optional, aber empfohlen
|
||||||
- **Root-Zugriff**: Erforderlich für Installation und Verwaltung
|
- **Root-Zugriff**: Erforderlich für Installation und Verwaltung
|
||||||
|
|
||||||
### CrowdSec Installation prüfen
|
### CrowdSec Installation prüfen (nur für PHP+CrowdSec Modus)
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
# Prüfe ob CrowdSec läuft
|
# Prüfe ob CrowdSec läuft
|
||||||
@@ -106,14 +119,37 @@ Das war's! Das Script ist vollständig selbstverwaltend.
|
|||||||
[0] Beenden
|
[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)
|
### Blocking aktivieren (einzelner Shop)
|
||||||
|
|
||||||
1. Script starten: `python3 geoip_shop_manager.py`
|
1. Script starten: `python3 geoip_shop_manager.py`
|
||||||
2. Option `[1] GeoIP-Blocking AKTIVIEREN (einzeln)` wählen
|
2. Option `[1] GeoIP-Blocking AKTIVIEREN (einzeln)` wählen
|
||||||
3. Shop aus der Liste auswä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
|
- Bei ERSTEM Shop: Systemd-Service wird installiert und gestartet
|
||||||
- Backup der `index.php` wird erstellt
|
- Backup der `index.php` wird erstellt
|
||||||
- `geoip_blocking.php` wird erstellt und eingebunden
|
- `geoip_blocking.php` wird erstellt und eingebunden
|
||||||
@@ -121,19 +157,20 @@ Das war's! Das Script ist vollständig selbstverwaltend.
|
|||||||
- Blocking ist sofort aktiv
|
- Blocking ist sofort aktiv
|
||||||
- Erlaubt werden nur IPs aus: 🇩🇪 Deutschland, 🇦🇹 Österreich, 🇨🇭 Schweiz
|
- 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
|
### Blocking für ALLE Shops aktivieren
|
||||||
|
|
||||||
1. Script starten: `python3 geoip_shop_manager.py`
|
1. Script starten: `python3 geoip_shop_manager.py`
|
||||||
2. Option `[5] 🚀 ALLE Shops aktivieren` wählen
|
2. Option `[5] 🚀 ALLE Shops aktivieren` wählen
|
||||||
3. Liste der zu aktivierenden Shops wird angezeigt
|
3. Liste der zu aktivierenden Shops wird angezeigt
|
||||||
4. Bestätigen mit `ja`
|
4. **Modus wählen** (gilt für alle Shops)
|
||||||
|
5. 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
|
|
||||||
|
|
||||||
**Beispielausgabe:**
|
**Beispielausgabe:**
|
||||||
```
|
```
|
||||||
@@ -148,10 +185,22 @@ Das war's! Das Script ist vollständig selbstverwaltend.
|
|||||||
• shop3.example.com
|
• shop3.example.com
|
||||||
...
|
...
|
||||||
|
|
||||||
[1/5] Aktiviere: shop1.example.com
|
🔧 Wähle den Blocking-Modus:
|
||||||
✅ Aktiviert (bis 2025-12-11 14:30)
|
[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)
|
✅ Aktiviert (bis 2025-12-11 14:30)
|
||||||
...
|
...
|
||||||
|
|
||||||
@@ -163,6 +212,7 @@ Das war's! Das Script ist vollständig selbstverwaltend.
|
|||||||
❌ Fehlgeschlagen: 0
|
❌ Fehlgeschlagen: 0
|
||||||
|
|
||||||
🇩🇪 🇦🇹 🇨🇭 Nur DACH-Traffic erlaubt
|
🇩🇪 🇦🇹 🇨🇭 Nur DACH-Traffic erlaubt
|
||||||
|
🔧 Modus: Nur PHP 📝
|
||||||
⏰ Gültig für 72 Stunden
|
⏰ 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`
|
1. Script starten: `python3 geoip_shop_manager.py`
|
||||||
2. Option `[2] GeoIP-Blocking DEAKTIVIEREN (einzeln)` wählen
|
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`
|
4. Bestätigen mit `ja`
|
||||||
|
|
||||||
**Was passiert:**
|
**Was passiert:**
|
||||||
- Original `index.php` wird wiederhergestellt
|
- Original `index.php` wird wiederhergestellt
|
||||||
- Alle PHP-Dateien werden gelöscht
|
- Alle PHP-Dateien werden gelöscht
|
||||||
- Alle CrowdSec-Decisions werden entfernt
|
- Bei PHP+CrowdSec Modus: Alle CrowdSec-Decisions werden entfernt
|
||||||
- Shop wird deregistriert
|
- 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
|
### Blocking für ALLE Shops deaktivieren
|
||||||
|
|
||||||
@@ -191,8 +241,8 @@ Das war's! Das Script ist vollständig selbstverwaltend.
|
|||||||
**Was passiert:**
|
**Was passiert:**
|
||||||
- Zeigt alle Shops mit aktivem Blocking
|
- Zeigt alle Shops mit aktivem Blocking
|
||||||
- Deaktiviert das Blocking für jeden Shop nacheinander
|
- Deaktiviert das Blocking für jeden Shop nacheinander
|
||||||
- Entfernt alle zugehörigen CrowdSec-Decisions
|
- Entfernt alle zugehörigen CrowdSec-Decisions (nur bei PHP+CrowdSec Shops)
|
||||||
- Deinstalliert den Watcher-Service am Ende
|
- Deinstalliert den Watcher-Service am Ende (falls aktiv)
|
||||||
- Zusammenfassung mit Erfolgs-/Fehlerzählung
|
- Zusammenfassung mit Erfolgs-/Fehlerzählung
|
||||||
|
|
||||||
### Logs anzeigen
|
### Logs anzeigen
|
||||||
@@ -204,11 +254,15 @@ Das war's! Das Script ist vollständig selbstverwaltend.
|
|||||||
```
|
```
|
||||||
📋 Logs anzeigen für:
|
📋 Logs anzeigen für:
|
||||||
[0] 📊 ALLE Shops (Zusammenfassung)
|
[0] 📊 ALLE Shops (Zusammenfassung)
|
||||||
[1] shop1.example.com
|
[1] shop1.example.com 🛡️
|
||||||
[2] shop2.example.com
|
[2] shop2.example.com 📝
|
||||||
...
|
...
|
||||||
```
|
```
|
||||||
|
|
||||||
|
Die Icons zeigen den Modus:
|
||||||
|
- 🛡️ = PHP + CrowdSec
|
||||||
|
- 📝 = Nur PHP
|
||||||
|
|
||||||
#### Option [0]: Gesamtübersicht aller Shops
|
#### Option [0]: Gesamtübersicht aller Shops
|
||||||
|
|
||||||
Zeigt eine aggregierte Statistik über alle aktiven 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 ███████████
|
├─ shop2.example.com: 298 ███████████
|
||||||
└─ shop3.example.com: 193 ███████
|
└─ shop3.example.com: 193 ███████
|
||||||
|
|
||||||
🔥 Top 10 blockierte IPs (alle Shops):
|
🔥 Top 100 blockierte IPs (alle Shops):
|
||||||
185.220.101.34: 127 █████████████████████████
|
185.220.101.34: 127 █████████████████████████
|
||||||
45.95.169.22: 89 █████████████████
|
45.95.169.22: 89 █████████████████
|
||||||
194.26.192.64: 67 █████████████
|
194.26.192.64: 67 █████████████
|
||||||
@@ -239,36 +293,76 @@ Zeigt eine aggregierte Statistik über alle aktiven Shops:
|
|||||||
|
|
||||||
**Enthält:**
|
**Enthält:**
|
||||||
- PHP-Blocks pro Shop mit visuellen Balken
|
- PHP-Blocks pro Shop mit visuellen Balken
|
||||||
- CrowdSec-Bans pro Shop
|
- CrowdSec-Bans pro Shop (nur für PHP+CrowdSec Shops)
|
||||||
- Top 10 der am häufigsten blockierten IPs über alle Shops hinweg
|
- Top 100 der am häufigsten blockierten IPs über alle Shops hinweg
|
||||||
|
|
||||||
#### Option [1-n]: Einzelner Shop
|
#### Option [1-n]: Einzelner Shop
|
||||||
|
|
||||||
Zeigt detaillierte Logs für einen spezifischen 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
|
### Status prüfen
|
||||||
|
|
||||||
Option `[4] Status anzeigen` zeigt:
|
Option `[4] Status anzeigen` zeigt:
|
||||||
- Anzahl verfügbarer Shops
|
- Anzahl verfügbarer Shops
|
||||||
- Anzahl aktiver Blockings
|
- 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
|
## 🔧 Erweiterte Verwendung
|
||||||
|
|
||||||
### 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
|
cscli decisions list --limit 0
|
||||||
|
|
||||||
# Nur GeoIP-Blocks anzeigen
|
# Nur GeoIP-Blocks anzeigen
|
||||||
cscli decisions list | grep "GeoIP"
|
cscli decisions list --limit 0 | grep "GeoIP"
|
||||||
|
|
||||||
# Decisions für einen bestimmten Shop
|
# 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
|
### Firewall-Statistiken prüfen
|
||||||
@@ -318,13 +412,13 @@ cscli decisions delete --ip DEINE_IP
|
|||||||
- `geoip_blocking.php` - PHP-Blocking-Script
|
- `geoip_blocking.php` - PHP-Blocking-Script
|
||||||
- `dach_ip_ranges.cache` - Gecachte DACH IP-Ranges (erneuert alle 24h)
|
- `dach_ip_ranges.cache` - Gecachte DACH 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-Synchronisation
|
- `geoip_crowdsec_queue.log` - Queue für CrowdSec-Synchronisation (nur PHP+CrowdSec Modus)
|
||||||
|
|
||||||
### System-weit
|
### System-weit
|
||||||
|
|
||||||
- `/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)
|
||||||
|
|
||||||
## ⚙️ Konfiguration
|
## ⚙️ Konfiguration
|
||||||
|
|
||||||
@@ -378,8 +472,8 @@ Füge weitere Ländercodes hinzu (z.B. `'nl'` für Niederlande, `'be'` für Belg
|
|||||||
### Was wird geblockt?
|
### Was wird geblockt?
|
||||||
|
|
||||||
- ✅ Alle IPs außerhalb der DACH IP-Ranges (DE, AT, CH)
|
- ✅ Alle IPs außerhalb der DACH IP-Ranges (DE, AT, CH)
|
||||||
- ✅ Auf allen Ebenen: HTTP, HTTPS, SSH, FTP, SMTP, etc. (durch CrowdSec)
|
- ✅ Auf PHP-Ebene: Sofortiger 403 Response
|
||||||
- ✅ Auch wenn sie den PHP-Check umgehen (Firewall blockt)
|
- ✅ Auf Firewall-Ebene (nur PHP+CrowdSec): Alle Ports (HTTP, HTTPS, SSH, FTP, etc.)
|
||||||
|
|
||||||
### Was wird NICHT geblockt?
|
### 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
|
2. Die IP über einen ausländischen VPN/Proxy kommt
|
||||||
3. Die ipdeny.com Daten veraltet sind (wird täglich aktualisiert)
|
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
|
## 🐛 Troubleshooting
|
||||||
|
|
||||||
### Shop zeigt 500 Error
|
### Shop zeigt 500 Error
|
||||||
@@ -448,20 +574,18 @@ cscli decisions list | grep "1.2.3.4"
|
|||||||
cscli decisions delete --ip 1.2.3.4
|
cscli decisions delete --ip 1.2.3.4
|
||||||
```
|
```
|
||||||
|
|
||||||
### Firewall blockt nicht
|
### Firewall blockt nicht (trotz CrowdSec-Ban)
|
||||||
|
|
||||||
|
**Mögliche Ursachen:**
|
||||||
|
|
||||||
|
1. **CDN/Reverse-Proxy aktiv** → Wechsle zu PHP-only Modus
|
||||||
|
2. **Bouncer läuft nicht:**
|
||||||
```bash
|
```bash
|
||||||
# Prüfe ob Bouncer läuft
|
|
||||||
systemctl status crowdsec-firewall-bouncer
|
systemctl status crowdsec-firewall-bouncer
|
||||||
|
```
|
||||||
# Prüfe ob Bouncer registriert ist
|
3. **iptables-Regeln fehlen:**
|
||||||
cscli bouncers list
|
```bash
|
||||||
|
|
||||||
# Prüfe iptables-Regeln
|
|
||||||
iptables -L -n -v | grep crowdsec
|
iptables -L -n -v | grep crowdsec
|
||||||
|
|
||||||
# Prüfe ipset
|
|
||||||
ipset list crowdsec-blacklists-5 | head -20
|
|
||||||
```
|
```
|
||||||
|
|
||||||
### DACH-IPs werden geblockt
|
### DACH-IPs werden geblockt
|
||||||
@@ -494,13 +618,11 @@ foreach($ranges as $range) {
|
|||||||
### Cleanup nach Deaktivierung unvollständig
|
### Cleanup nach Deaktivierung unvollständig
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
# Manuelle Bereinigung aller GeoIP-Decisions
|
# Manuelle Bereinigung aller GeoIP-Decisions (Einzeiler mit Fortschritt)
|
||||||
cscli decisions list -o raw | grep "GeoIP" | cut -d',' -f3 | cut -d':' -f2 | while read ip; 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 delete --ip "$ip" 2>/dev/null
|
|
||||||
done
|
|
||||||
|
|
||||||
# Prüfen
|
# Prüfen
|
||||||
cscli decisions list | grep "GeoIP"
|
cscli decisions list --limit 0 | grep "GeoIP"
|
||||||
```
|
```
|
||||||
|
|
||||||
### Migration von der alten DE-Only Version
|
### Migration von der alten DE-Only Version
|
||||||
@@ -522,12 +644,12 @@ python3 geoip_shop_manager.py # Shops wieder aktivieren
|
|||||||
|
|
||||||
### PHP-Level Blocking
|
### 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)
|
- **Erster Request**: ~400-800ms (beim Download der IP-Ranges für 3 Länder)
|
||||||
- **Cache-Dauer**: 24 Stunden
|
- **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)
|
- **Overhead**: 0ms (blockt vor PHP)
|
||||||
- **RAM**: ~20-50 MB (Watcher-Service)
|
- **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
|
iptables -L -n -v | grep crowdsec-blacklists-5
|
||||||
|
|
||||||
# Anzahl aktiver Bans
|
# 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)
|
# Top 10 blockierte IPs (PHP-Level)
|
||||||
cat /var/www/vhosts/SHOP/httpdocs/geoip_blocked.log | \
|
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)
|
1. ✅ Backup erstellen (macht das Script automatisch)
|
||||||
2. ✅ Sicherstellen, dass Admin-Zugriff aus DACH-Region kommt
|
2. ✅ Sicherstellen, dass Admin-Zugriff aus DACH-Region kommt
|
||||||
3. ✅ Test mit kurzer Dauer (kann im Script angepasst werden)
|
3. ✅ **Modus wählen** (PHP+CrowdSec für direkte Server, PHP-only für CDN)
|
||||||
4. ✅ Monitoring einrichten
|
4. ✅ Test mit kurzer Dauer (kann im Script angepasst werden)
|
||||||
|
5. ✅ Monitoring einrichten
|
||||||
|
|
||||||
### Während aktivem Blocking
|
### Während aktivem Blocking
|
||||||
|
|
||||||
1. ✅ Logs regelmäßig prüfen (Gesamtübersicht nutzen!)
|
1. ✅ Logs regelmäßig prüfen (Gesamtübersicht nutzen!)
|
||||||
2. ✅ Auf Fehlblockierungen achten (sehr selten)
|
2. ✅ Auf Fehlblockierungen achten (sehr selten)
|
||||||
3. ✅ CrowdSec-Statistiken beobachten
|
3. ✅ CrowdSec-Statistiken beobachten (nur bei PHP+CrowdSec)
|
||||||
4. ✅ Server-Performance monitoren
|
4. ✅ Server-Performance monitoren
|
||||||
|
|
||||||
### Nach Deaktivierung
|
### 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)
|
2. ✅ Backup-Dateien können gelöscht werden (optional)
|
||||||
3. ✅ Logs archivieren (falls benötigt)
|
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
|
- **API-Calls**: Bei vielen aktiven Shops könnten viele IPs in CrowdSec landen
|
||||||
- **CrowdSec-Limits**: Kostenloser Tier hat API-Limits
|
- **CrowdSec-Limits**: Kostenloser Tier hat API-Limits
|
||||||
- **Netzwerk**: Kein Blocking möglich, wenn Server selbst unter DDoS steht
|
- **Netzwerk**: Kein Blocking möglich, wenn Server selbst unter DDoS steht
|
||||||
|
- **CDN**: Bei CDN-Nutzung ist PHP-only Modus empfohlen
|
||||||
|
|
||||||
### Empfehlungen
|
### Empfehlungen
|
||||||
|
|
||||||
@@ -649,6 +773,7 @@ cat /var/www/vhosts/SHOP/httpdocs/geoip_blocked.log | \
|
|||||||
- ✅ Nicht als permanente Lösung
|
- ✅ Nicht als permanente Lösung
|
||||||
- ✅ Kombinieren mit anderen Security-Maßnahmen
|
- ✅ Kombinieren mit anderen Security-Maßnahmen
|
||||||
- ✅ Regelmäßig Logs prüfen (Gesamtübersicht für schnellen Überblick)
|
- ✅ Regelmäßig Logs prüfen (Gesamtübersicht für schnellen Überblick)
|
||||||
|
- ✅ Bei CDN: PHP-only Modus verwenden
|
||||||
|
|
||||||
## 🤝 Contributing
|
## 🤝 Contributing
|
||||||
|
|
||||||
@@ -680,6 +805,7 @@ Bei Problemen:
|
|||||||
- Fehlerbeschreibung
|
- Fehlerbeschreibung
|
||||||
- Relevante Logs
|
- Relevante Logs
|
||||||
- System-Infos (OS, PHP-Version, CrowdSec-Version)
|
- System-Infos (OS, PHP-Version, CrowdSec-Version)
|
||||||
|
- **Verwendeter Modus** (PHP+CrowdSec oder PHP-only)
|
||||||
|
|
||||||
## 📚 Weitere Dokumentation
|
## 📚 Weitere Dokumentation
|
||||||
|
|
||||||
@@ -690,18 +816,26 @@ Bei Problemen:
|
|||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
**Version**: 2.1.0 (DACH)
|
**Version**: 2.2.0 (DACH)
|
||||||
**Letztes Update**: Dezember 2025
|
**Letztes Update**: Dezember 2025
|
||||||
**Status**: Production Ready ✅
|
**Status**: Production Ready ✅
|
||||||
**Erlaubte Länder**: 🇩🇪 Deutschland | 🇦🇹 Österreich | 🇨🇭 Schweiz
|
**Erlaubte Länder**: 🇩🇪 Deutschland | 🇦🇹 Österreich | 🇨🇭 Schweiz
|
||||||
|
|
||||||
### Changelog
|
### 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
|
#### v2.1.0
|
||||||
- **NEU**: Option [5] - Alle Shops gleichzeitig aktivieren
|
- **NEU**: Option [5] - Alle Shops gleichzeitig aktivieren
|
||||||
- **NEU**: Option [6] - Alle Shops gleichzeitig deaktivieren
|
- **NEU**: Option [6] - Alle Shops gleichzeitig deaktivieren
|
||||||
- **NEU**: Gesamtübersicht in Logs (Option [0]) mit aggregierten Statistiken
|
- **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
|
- **NEU**: Visuelle Balken in der Statistik-Anzeige
|
||||||
- Verbessertes Menü-Layout mit Trennlinien
|
- Verbessertes Menü-Layout mit Trennlinien
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user