README.md aktualisiert
This commit is contained in:
468
README.md
468
README.md
@@ -9,13 +9,15 @@ Dieses Tool ermöglicht es, einzelne oder alle Shops auf einem Plesk-Server temp
|
|||||||
- ✅ **DACH-Region erlaubt**: Deutschland (DE), Österreich (AT), Schweiz (CH)
|
- ✅ **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)
|
||||||
- ✅ **Flexibler Modus**: Wahl zwischen "PHP + CrowdSec" oder "Nur PHP"
|
- ✅ **Flexibler Modus**: Wahl zwischen "PHP + CrowdSec" oder "Nur PHP"
|
||||||
|
- ✅ **Bot-Only Modus**: Nur Bots blocken, Shop bleibt weltweit erreichbar
|
||||||
|
- ✅ **Rate-Limiting**: Konfigurierbares Rate-Limit für Bot-Blocking mit temporären Bans
|
||||||
- ✅ **Doppelter Schutz**: PHP-Level + Firewall-Level (CrowdSec) - optional
|
- ✅ **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
|
||||||
- ✅ **Link11-Erkennung**: Automatische Erkennung ob Shop hinter Link11 CDN steht
|
- ✅ **Link11-Erkennung**: Automatische Erkennung ob Shop hinter Link11 CDN steht
|
||||||
- ✅ **Nur direkte Shops**: Option um nur Shops ohne CDN-Schutz zu aktivieren
|
- ✅ **Nur direkte Shops**: Option um nur Shops ohne CDN-Schutz zu aktivieren
|
||||||
- ✅ **Gesamtübersicht**: Logs und Statistiken über alle Shops hinweg (Top 100 IPs)
|
- ✅ **Gesamtübersicht**: Logs und Statistiken über alle Shops hinweg (Top 50 IPs)
|
||||||
- ✅ **Auto-Deaktivierung**: Blocking läuft nach 72 Stunden automatisch ab
|
- ✅ **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
|
||||||
@@ -55,6 +57,70 @@ Dieses Tool ermöglicht es, einzelne oder alle Shops auf einem Plesk-Server temp
|
|||||||
|
|
||||||
> **Hinweis**: Bei Servern hinter einem CDN/Reverse-Proxy (wie Link11, Cloudflare, Hetzner LB) sieht iptables nur die Proxy-IP, nicht die echte Client-IP. In diesem Fall ist der **PHP-only Modus** die bessere Wahl, da PHP die echte IP aus dem `X-Forwarded-For` Header liest.
|
> **Hinweis**: Bei Servern hinter einem CDN/Reverse-Proxy (wie Link11, Cloudflare, Hetzner LB) sieht iptables nur die Proxy-IP, nicht die echte Client-IP. In diesem Fall ist der **PHP-only Modus** die bessere Wahl, da PHP die echte IP aus dem `X-Forwarded-For` Header liest.
|
||||||
|
|
||||||
|
### Modus 3: Bot-Only 🤖
|
||||||
|
|
||||||
|
- Blockt nur bekannte Bots/Crawler (30+ Patterns)
|
||||||
|
- Shop bleibt weltweit für normale Besucher erreichbar
|
||||||
|
- **Mit Rate-Limiting**: Bots werden nach X Requests/Minute temporär gebannt
|
||||||
|
- Ideal um AI-Crawler (GPTBot, ClaudeBot, etc.) fernzuhalten
|
||||||
|
- Verfügbar mit oder ohne CrowdSec-Integration
|
||||||
|
|
||||||
|
## 🚦 Rate-Limiting (Bot-Only Modus)
|
||||||
|
|
||||||
|
Im Bot-Only Modus wird ein konfigurierbares Rate-Limiting angewendet:
|
||||||
|
|
||||||
|
### Funktionsweise
|
||||||
|
|
||||||
|
```
|
||||||
|
Bot-Request kommt rein
|
||||||
|
│
|
||||||
|
▼
|
||||||
|
┌───────────────────┐
|
||||||
|
│ Ist IP+UA gebannt?│──── Ja ───▶ 403 + Exit (sofort)
|
||||||
|
└───────────────────┘
|
||||||
|
│ Nein
|
||||||
|
▼
|
||||||
|
┌───────────────────┐
|
||||||
|
│ Bot erkannt? │──── Nein ──▶ Weiter (normaler Traffic)
|
||||||
|
└───────────────────┘
|
||||||
|
│ Ja
|
||||||
|
▼
|
||||||
|
┌───────────────────┐
|
||||||
|
│ Counter erhöhen │
|
||||||
|
│ Limit erreicht? │──── Ja ───▶ Ban erstellen + 403
|
||||||
|
└───────────────────┘
|
||||||
|
│ Nein
|
||||||
|
▼
|
||||||
|
403 (normal)
|
||||||
|
```
|
||||||
|
|
||||||
|
### Konfiguration bei Aktivierung
|
||||||
|
|
||||||
|
```
|
||||||
|
🚦 Rate-Limit Konfiguration:
|
||||||
|
Requests pro Minute bevor Ban [30]: _
|
||||||
|
Ban-Dauer in Minuten [5]: _
|
||||||
|
```
|
||||||
|
|
||||||
|
### Technische Details
|
||||||
|
|
||||||
|
- **Speicherung**: File-basiert (kein Redis/Memcached nötig)
|
||||||
|
- **Identifier**: MD5-Hash aus IP + User-Agent
|
||||||
|
- **Algorithmus**: Sliding Window Counter (1 Minute Fenster)
|
||||||
|
- **Cleanup**: Probabilistisch (1% der Requests)
|
||||||
|
- **Retry-After**: Gebannte Clients erhalten Header mit verbleibender Ban-Zeit
|
||||||
|
|
||||||
|
### Verzeichnisstruktur
|
||||||
|
|
||||||
|
```
|
||||||
|
httpdocs/
|
||||||
|
└── geoip_ratelimit/
|
||||||
|
├── bans/
|
||||||
|
│ └── {hash}.ban # Inhalt: Unix-Timestamp (ban bis)
|
||||||
|
└── counts/
|
||||||
|
└── {hash}.count # Inhalt: window_start|count
|
||||||
|
```
|
||||||
|
|
||||||
## 📋 Voraussetzungen
|
## 📋 Voraussetzungen
|
||||||
|
|
||||||
- **Betriebssystem**: Ubuntu Server (getestet auf 24.04)
|
- **Betriebssystem**: Ubuntu Server (getestet auf 24.04)
|
||||||
@@ -128,44 +194,62 @@ Bei jeder Aktivierung (einzeln oder alle) wird nach dem Modus gefragt:
|
|||||||
|
|
||||||
```
|
```
|
||||||
🔧 Wähle den Blocking-Modus:
|
🔧 Wähle den Blocking-Modus:
|
||||||
[1] PHP + CrowdSec (IPs werden an CrowdSec gemeldet)
|
[1] 🌍 GeoIP + CrowdSec (IPs werden an CrowdSec gemeldet)
|
||||||
[2] Nur PHP (keine CrowdSec-Synchronisation)
|
[2] 🌍 Nur GeoIP (keine CrowdSec-Synchronisation)
|
||||||
|
[3] 🤖 Nur Bot-Blocking (weltweit erreichbar, mit CrowdSec)
|
||||||
|
[4] 🤖 Nur Bot-Blocking (weltweit erreichbar, ohne CrowdSec)
|
||||||
|
|
||||||
Modus wählen [1/2]:
|
Modus wählen [1/2/3/4]:
|
||||||
```
|
```
|
||||||
|
|
||||||
**Wann welchen Modus wählen?**
|
**Wann welchen Modus wählen?**
|
||||||
|
|
||||||
| Situation | Empfohlener Modus |
|
| Situation | Empfohlener Modus |
|
||||||
|-----------|-------------------|
|
|-----------|-------------------|
|
||||||
| Server direkt im Internet | PHP + CrowdSec 🛡️ |
|
| Server direkt im Internet | GeoIP + CrowdSec 🛡️ |
|
||||||
| Server hinter CDN (Link11, Cloudflare) | Nur PHP 📝 |
|
| Server hinter CDN (Link11, Cloudflare) | Nur GeoIP 📝 |
|
||||||
| CrowdSec nicht installiert | Nur PHP 📝 |
|
| Nur Bots blocken, Shop weltweit erreichbar | Bot-Only 🤖 |
|
||||||
| Minimaler Overhead gewünscht | Nur PHP 📝 |
|
| CrowdSec nicht installiert | Nur GeoIP 📝 oder Bot-Only 🤖 |
|
||||||
| Maximaler Schutz (alle Ports) | PHP + CrowdSec 🛡️ |
|
| Minimaler Overhead gewünscht | Nur GeoIP 📝 |
|
||||||
|
| Maximaler Schutz (alle Ports) | GeoIP + CrowdSec 🛡️ |
|
||||||
|
|
||||||
|
### Bot-Only Modus mit Rate-Limiting
|
||||||
|
|
||||||
|
Wenn du Modus [3] oder [4] wählst, wirst du zusätzlich nach dem Rate-Limit gefragt:
|
||||||
|
|
||||||
|
```
|
||||||
|
🚦 Rate-Limit Konfiguration:
|
||||||
|
Requests pro Minute bevor Ban [30]: 20
|
||||||
|
Ban-Dauer in Minuten [5]: 10
|
||||||
|
|
||||||
|
✅ Rate-Limit: 20 req/min
|
||||||
|
✅ Ban-Dauer: 10 Minuten
|
||||||
|
```
|
||||||
|
|
||||||
|
**Empfohlene Werte:**
|
||||||
|
|
||||||
|
| Szenario | Rate-Limit | Ban-Dauer |
|
||||||
|
|----------|------------|-----------|
|
||||||
|
| Normale Abwehr | 30 req/min | 5 min |
|
||||||
|
| Aggressive Bots | 10 req/min | 15 min |
|
||||||
|
| Sehr strikt | 5 req/min | 30 min |
|
||||||
|
|
||||||
### Blocking aktivieren (einzelner Shop)
|
### Blocking aktivieren (einzelner Shop)
|
||||||
|
|
||||||
1. Script starten: `python3 geoip_shop_manager.py`
|
1. Script starten: `python3 geoip_shop_manager.py`
|
||||||
2. Option `[1] Aktivieren (einzeln)` wählen
|
2. Option `[1] Aktivieren (einzeln)` wählen
|
||||||
3. Shop aus der Liste auswählen
|
3. Shop aus der Liste auswählen
|
||||||
4. **Modus wählen** (PHP+CrowdSec oder Nur PHP)
|
4. **Modus wählen** (GeoIP oder Bot-Only, mit/ohne CrowdSec)
|
||||||
5. Bestätigen mit `ja`
|
5. Bei Bot-Only: **Rate-Limit konfigurieren**
|
||||||
|
6. Bestätigen mit `ja`
|
||||||
|
|
||||||
**Was passiert (PHP + CrowdSec Modus):**
|
**Was passiert (Bot-Only Modus):**
|
||||||
- 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 mit Bot-Patterns und Rate-Limiting
|
||||||
|
- Rate-Limit Verzeichnisse werden erstellt (`geoip_ratelimit/bans/`, `geoip_ratelimit/counts/`)
|
||||||
- Shop wird für Tracking registriert
|
- Shop wird für Tracking registriert
|
||||||
- Blocking ist sofort aktiv
|
- Blocking ist sofort aktiv
|
||||||
- Erlaubt werden nur IPs aus: 🇩🇪 Deutschland, 🇦🇹 Österreich, 🇨🇭 Schweiz
|
- 30+ Bot-Patterns werden erkannt und geblockt
|
||||||
|
|
||||||
**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
|
||||||
|
|
||||||
@@ -173,31 +257,53 @@ Modus wählen [1/2]:
|
|||||||
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
|
||||||
4. **Modus wählen** (gilt für alle Shops)
|
4. **Modus wählen** (gilt für alle Shops)
|
||||||
5. Bestätigen mit `ja`
|
5. Bei Bot-Only: **Rate-Limit konfigurieren** (gilt für alle Shops)
|
||||||
|
6. Bestätigen mit `ja`
|
||||||
|
|
||||||
**Beispielausgabe:**
|
**Beispielausgabe (Bot-Only):**
|
||||||
```
|
```
|
||||||
══════════════════════════════════════════════════════════════
|
══════════════════════════════════════════════════════════════
|
||||||
Blocking für ALLE Shops aktivieren
|
Blocking für ALLE Shops aktivieren
|
||||||
══════════════════════════════════════════════════════════════
|
══════════════════════════════════════════════════════════════
|
||||||
|
|
||||||
📋 Folgende 5 Shop(s) werden aktiviert:
|
📋 5 Shop(s):
|
||||||
|
|
||||||
• shop1.example.com [Link11]
|
• shop1.example.com [Link11]
|
||||||
• shop2.example.com [Direkt]
|
• shop2.example.com [Direkt]
|
||||||
• shop3.example.com [Direkt]
|
|
||||||
...
|
...
|
||||||
|
|
||||||
🔧 Wähle den Blocking-Modus:
|
🔧 Wähle den Blocking-Modus:
|
||||||
[1] PHP + CrowdSec (IPs werden an CrowdSec gemeldet)
|
[1] 🌍 GeoIP + CrowdSec (IPs werden an CrowdSec gemeldet)
|
||||||
[2] Nur PHP (keine CrowdSec-Synchronisation)
|
[2] 🌍 Nur GeoIP (keine CrowdSec-Synchronisation)
|
||||||
|
[3] 🤖 Nur Bot-Blocking (weltweit erreichbar, mit CrowdSec)
|
||||||
|
[4] 🤖 Nur Bot-Blocking (weltweit erreichbar, ohne CrowdSec)
|
||||||
|
|
||||||
Modus wählen [1/2]: 2
|
Modus wählen [1/2/3/4]: 4
|
||||||
|
|
||||||
⚠️ Dies aktiviert den Schutz für alle oben genannten Shops!
|
🚦 Rate-Limit Konfiguration:
|
||||||
Modus: Nur PHP 📝
|
Requests pro Minute bevor Ban [30]: 30
|
||||||
|
Ban-Dauer in Minuten [5]: 5
|
||||||
|
|
||||||
|
✅ Rate-Limit: 30 req/min
|
||||||
|
✅ Ban-Dauer: 5 Minuten
|
||||||
|
|
||||||
|
⚠️ Modus: Nur Bot-Block 🤖
|
||||||
|
Rate-Limit: 30 req/min, Ban: 5 min
|
||||||
|
|
||||||
Fortfahren? (ja/nein): ja
|
Fortfahren? (ja/nein): ja
|
||||||
|
|
||||||
|
══════════════════════════════════════════════════════════════
|
||||||
|
|
||||||
|
[1/5] shop1.example.com
|
||||||
|
✅ Aktiviert (32 Bot-Patterns, 30 req/min)
|
||||||
|
|
||||||
|
[2/5] shop2.example.com
|
||||||
|
✅ Aktiviert (32 Bot-Patterns, 30 req/min)
|
||||||
|
...
|
||||||
|
|
||||||
|
══════════════════════════════════════════════════════════════
|
||||||
|
✅ 5 Shop(s) aktiviert
|
||||||
|
🚦 Rate-Limit: 30 req/min, Ban: 5 min
|
||||||
|
══════════════════════════════════════════════════════════════
|
||||||
```
|
```
|
||||||
|
|
||||||
### Blocking nur für DIREKTE Shops aktivieren (ohne Link11)
|
### Blocking nur für DIREKTE Shops aktivieren (ohne Link11)
|
||||||
@@ -208,7 +314,8 @@ Diese Option ist besonders nützlich, wenn du einen Mix aus Shops hast - einige
|
|||||||
2. Option `[7] 🎯 Nur DIREKTE aktivieren (ohne Link11)` wählen
|
2. Option `[7] 🎯 Nur DIREKTE aktivieren (ohne Link11)` wählen
|
||||||
3. Liste zeigt welche Shops aktiviert/übersprungen werden
|
3. Liste zeigt welche Shops aktiviert/übersprungen werden
|
||||||
4. **Modus wählen** (gilt für alle direkten Shops)
|
4. **Modus wählen** (gilt für alle direkten Shops)
|
||||||
5. Bestätigen mit `ja`
|
5. Bei Bot-Only: **Rate-Limit konfigurieren**
|
||||||
|
6. Bestätigen mit `ja`
|
||||||
|
|
||||||
**Beispielausgabe:**
|
**Beispielausgabe:**
|
||||||
```
|
```
|
||||||
@@ -226,41 +333,6 @@ Diese Option ist besonders nützlich, wenn du einen Mix aus Shops hast - einige
|
|||||||
⏭️ 2 Shop(s) hinter Link11 werden übersprungen:
|
⏭️ 2 Shop(s) hinter Link11 werden übersprungen:
|
||||||
• shop1.example.com [Link11]
|
• shop1.example.com [Link11]
|
||||||
• shop3.example.com [Link11]
|
• shop3.example.com [Link11]
|
||||||
|
|
||||||
🔧 Wähle den Blocking-Modus:
|
|
||||||
[1] 🌍 GeoIP + CrowdSec (IPs werden an CrowdSec gemeldet)
|
|
||||||
[2] 🌍 Nur GeoIP (keine CrowdSec-Synchronisation)
|
|
||||||
[3] 🤖 Nur Bot-Blocking (weltweit erreichbar, mit CrowdSec)
|
|
||||||
[4] 🤖 Nur Bot-Blocking (weltweit erreichbar, ohne CrowdSec)
|
|
||||||
|
|
||||||
Modus wählen [1/2/3/4]: 1
|
|
||||||
|
|
||||||
⚠️ Modus: GeoIP + CrowdSec 🛡️
|
|
||||||
Region: 🇩🇪🇦🇹🇨🇭 DACH
|
|
||||||
Aktiviert: 3 direkte Shop(s)
|
|
||||||
Übersprungen: 2 Link11-Shop(s)
|
|
||||||
|
|
||||||
Fortfahren? (ja/nein): ja
|
|
||||||
|
|
||||||
══════════════════════════════════════════════════════════════
|
|
||||||
|
|
||||||
[1/3] shop2.example.com
|
|
||||||
⏳ Cache generieren...
|
|
||||||
✅ Aktiviert (8,234 Ranges)
|
|
||||||
|
|
||||||
[2/3] shop4.example.com
|
|
||||||
⏳ Cache generieren...
|
|
||||||
✅ Aktiviert (8,234 Ranges)
|
|
||||||
|
|
||||||
[3/3] shop5.example.com
|
|
||||||
⏳ Cache generieren...
|
|
||||||
✅ Aktiviert (8,234 Ranges)
|
|
||||||
|
|
||||||
══════════════════════════════════════════════════════════════
|
|
||||||
✅ 3 direkte Shop(s) aktiviert
|
|
||||||
⏭️ 2 Link11-Shop(s) übersprungen
|
|
||||||
🛡️ Fail-Open bei Cache-Fehlern aktiv
|
|
||||||
══════════════════════════════════════════════════════════════
|
|
||||||
```
|
```
|
||||||
|
|
||||||
**Warum diese Option?**
|
**Warum diese Option?**
|
||||||
@@ -279,6 +351,7 @@ Fortfahren? (ja/nein): 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
|
||||||
|
- Rate-Limit Verzeichnis wird gelöscht (Bot-Only Modus)
|
||||||
- Bei PHP+CrowdSec Modus: Alle CrowdSec-Decisions werden entfernt
|
- Bei PHP+CrowdSec Modus: Alle CrowdSec-Decisions werden entfernt
|
||||||
- Shop wird deregistriert
|
- Shop wird deregistriert
|
||||||
- Bei LETZTEM Shop mit CrowdSec: Systemd-Service wird deinstalliert
|
- Bei LETZTEM Shop mit CrowdSec: Systemd-Service wird deinstalliert
|
||||||
@@ -294,6 +367,7 @@ Fortfahren? (ja/nein): ja
|
|||||||
- 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 (nur bei PHP+CrowdSec Shops)
|
- Entfernt alle zugehörigen CrowdSec-Decisions (nur bei PHP+CrowdSec Shops)
|
||||||
|
- Löscht alle Rate-Limit Daten (Bot-Only Shops)
|
||||||
- Deinstalliert den Watcher-Service am Ende (falls aktiv)
|
- Deinstalliert den Watcher-Service am Ende (falls aktiv)
|
||||||
- Zusammenfassung mit Erfolgs-/Fehlerzählung
|
- Zusammenfassung mit Erfolgs-/Fehlerzählung
|
||||||
|
|
||||||
@@ -307,13 +381,15 @@ Fortfahren? (ja/nein): ja
|
|||||||
📋 Logs anzeigen für:
|
📋 Logs anzeigen für:
|
||||||
[0] 📊 ALLE Shops (Zusammenfassung)
|
[0] 📊 ALLE Shops (Zusammenfassung)
|
||||||
[1] shop1.example.com 🛡️ [Link11]
|
[1] shop1.example.com 🛡️ [Link11]
|
||||||
[2] shop2.example.com 📝 [Direkt]
|
[2] shop2.example.com 🤖 [Direkt]
|
||||||
...
|
...
|
||||||
```
|
```
|
||||||
|
|
||||||
Die Icons zeigen den Modus:
|
Die Icons zeigen den Modus:
|
||||||
- 🛡️ = PHP + CrowdSec
|
- 🛡️ = GeoIP + CrowdSec
|
||||||
- 📝 = Nur PHP
|
- 📝 = Nur GeoIP
|
||||||
|
- 🤖🛡️ = Bot-Only + CrowdSec
|
||||||
|
- 🤖 = Nur Bot-Only
|
||||||
|
|
||||||
Die Farbcodierung zeigt den CDN-Status:
|
Die Farbcodierung zeigt den CDN-Status:
|
||||||
- **Grün** = hinter Link11
|
- **Grün** = hinter Link11
|
||||||
@@ -330,15 +406,23 @@ Zeigt eine aggregierte Statistik über alle aktiven Shops:
|
|||||||
Grün = hinter Link11 | Rot = Direkt
|
Grün = hinter Link11 | Rot = Direkt
|
||||||
|
|
||||||
📝 Blocks gesamt: 1.247 (⌀ 12.3 req/min, Laufzeit: 1h 41m)
|
📝 Blocks gesamt: 1.247 (⌀ 12.3 req/min, Laufzeit: 1h 41m)
|
||||||
├─ shop1.example.com 🇩🇪🇦🇹🇨🇭 🛡️: 523 (5.2 req/min, seit 1h 41m) █████████████████████
|
├─ shop1.example.com 🤖 🤖: 523 (5.2 req/min, seit 1h 41m) █████████████████████
|
||||||
│ └─➤ Top: 185.220.101.34 (GPTBot) - 127x, 1.3 req/min
|
│ └─➤ Top: 185.220.101.34 (GPTBot) - 127x, 1.3 req/min
|
||||||
├─ shop2.example.com 🇩🇪🇦🇹🇨🇭 📝: 412 (4.1 req/min, seit 1h 40m) ████████████████
|
├─ shop2.example.com 🤖 🤖: 412 (4.1 req/min, seit 1h 40m) ████████████████
|
||||||
│ └─➤ Top: 45.95.169.22 (Bytespider) - 89x, 0.9 req/min
|
│ └─➤ Top: 45.95.169.22 (Bytespider) - 89x, 0.9 req/min
|
||||||
└─ shop3.example.com 🇩🇪🇦🇹🇨🇭 🛡️: 312 (3.1 req/min, seit 1h 39m) ████████████
|
└─ shop3.example.com 🤖 🤖: 312 (3.1 req/min, seit 1h 39m) ████████████
|
||||||
|
|
||||||
🛡️ CrowdSec-Bans gesamt: 892
|
🚫 Rate-Limit Bans: 45 ausgelöst, 12 aktiv
|
||||||
├─ shop1.example.com 🇩🇪🇦🇹🇨🇭 🛡️: 401 ████████████████
|
├─ shop1.example.com 🤖 🤖: 20 bans (5 aktiv) ██████████
|
||||||
└─ shop3.example.com 🇩🇪🇦🇹🇨🇭 🛡️: 491 ███████████████████
|
├─ shop2.example.com 🤖 🤖: 15 bans (4 aktiv) ███████
|
||||||
|
└─ shop3.example.com 🤖 🤖: 10 bans (3 aktiv) █████
|
||||||
|
|
||||||
|
🤖 Bot-Statistik (alle Shops):
|
||||||
|
Bingbot: 234x ███████████████████████████████████████████████
|
||||||
|
GPTBot: 189x █████████████████████████████████████
|
||||||
|
Googlebot: 156x ███████████████████████████████
|
||||||
|
Bytespider: 98x ███████████████████
|
||||||
|
...
|
||||||
|
|
||||||
🔥 Top 50 blockierte IPs (alle Shops):
|
🔥 Top 50 blockierte IPs (alle Shops):
|
||||||
185.220.101.34 (GPTBot): 127 (1.3 req/min) → shop1.example.com [127x] █████████████████████████
|
185.220.101.34 (GPTBot): 127 (1.3 req/min) → shop1.example.com [127x] █████████████████████████
|
||||||
@@ -351,7 +435,9 @@ Zeigt eine aggregierte Statistik über alle aktiven Shops:
|
|||||||
**Enthält:**
|
**Enthält:**
|
||||||
- PHP-Blocks pro Shop mit visuellen Balken und req/min
|
- PHP-Blocks pro Shop mit visuellen Balken und req/min
|
||||||
- Top-IP pro Shop mit Bot-Erkennung
|
- Top-IP pro Shop mit Bot-Erkennung
|
||||||
- CrowdSec-Bans pro Shop (nur für PHP+CrowdSec Shops)
|
- **Rate-Limit Bans**: Anzahl ausgelöster und aktiver Bans (Bot-Only Modus)
|
||||||
|
- **Bot-Statistik**: Welche Bots wie oft geblockt wurden
|
||||||
|
- CrowdSec-Bans pro Shop (nur für CrowdSec-Modi)
|
||||||
- Top 50 der am häufigsten blockierten IPs über alle Shops hinweg
|
- Top 50 der am häufigsten blockierten IPs über alle Shops hinweg
|
||||||
|
|
||||||
#### Option [1-n]: Einzelner Shop
|
#### Option [1-n]: Einzelner Shop
|
||||||
@@ -359,29 +445,30 @@ Zeigt eine aggregierte Statistik über alle aktiven Shops:
|
|||||||
Zeigt detaillierte Logs für einen spezifischen Shop:
|
Zeigt detaillierte Logs für einen spezifischen Shop:
|
||||||
|
|
||||||
```
|
```
|
||||||
📊 Logs für shop1.example.com [PHP + CrowdSec 🛡️]
|
══════════════════════════════════════════════════════════════════════
|
||||||
|
📊 shop1.example.com | 🤖 Bot-Only 🤖
|
||||||
|
══════════════════════════════════════════════════════════════════════
|
||||||
|
⏱️ Laufzeit: 1h 41m
|
||||||
|
📈 Blocks: 523 (5.2 req/min)
|
||||||
|
🤖 Bot-Patterns: 32 aktiv
|
||||||
|
🚦 Rate-Limit: 30 req/min, Ban: 5 min
|
||||||
|
🚫 Bans: 20 ausgelöst, 5 aktiv
|
||||||
|
|
||||||
📝 PHP-Blocks:
|
🤖 Bot-Statistik:
|
||||||
================================================================================
|
Bingbot: 234x ███████████████████████████████████████████████
|
||||||
[2025-12-08 17:24:57] IP: 202.8.43.232 | UA: Mozilla/5.0 ... | URI: /produkt-123
|
GPTBot: 189x █████████████████████████████████████
|
||||||
|
Googlebot: 100x ████████████████████
|
||||||
|
|
||||||
|
📝 Letzte 30 Blocks:
|
||||||
|
[2025-12-09 18:45:23] BOT: Bingbot | IP: 40.77.167.75 | Count: 15/30 | URI: /
|
||||||
|
[2025-12-09 18:45:24] BOT: Bingbot | IP: 40.77.167.75 | Count: 16/30 | URI: /produkt
|
||||||
|
[2025-12-09 18:45:25] BANNED: Bingbot | IP: 40.77.167.75 | Exceeded 30 req/min | Ban: 5m
|
||||||
...
|
...
|
||||||
================================================================================
|
|
||||||
Gesamt: 523
|
|
||||||
|
|
||||||
🛡️ CrowdSec Decisions:
|
🔥 Top 10 IPs:
|
||||||
================================================================================
|
40.77.167.75 (Bingbot): 234x
|
||||||
Aktive Bans: 401
|
52.167.144.140 (Bingbot): 89x
|
||||||
|
...
|
||||||
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
|
||||||
@@ -390,15 +477,17 @@ 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 **und deren Modus**
|
- Liste aller Shops mit aktivem Blocking **und deren Modus**
|
||||||
|
- Rate-Limit Konfiguration (Bot-Only Modus)
|
||||||
|
- Aktive Bans (Bot-Only Modus)
|
||||||
- Link11-Status (farbcodiert)
|
- Link11-Status (farbcodiert)
|
||||||
|
|
||||||
```
|
```
|
||||||
📊 Status: 5/15 Shops aktiv
|
📊 Status: 5/15 Shops aktiv
|
||||||
shop1.example.com [Link11] 🇩🇪🇦🇹🇨🇭 🛡️
|
shop1.example.com [Link11] 🤖 🤖
|
||||||
523 blocks, 1h 41m, Cache: ✅8,234
|
523 blocks, 1h 41m, 32 Bot-Patterns, 30 req/min, 5 aktive Bans
|
||||||
shop2.example.com [Direkt] 🇩🇪🇦🇹🇨🇭 📝
|
shop2.example.com [Direkt] 🇩🇪🇦🇹🇨🇭 🛡️
|
||||||
412 blocks, 1h 40m, Cache: ✅8,234
|
412 blocks, 1h 40m, Cache: ✅8,234
|
||||||
shop3.example.com [Direkt] 🇩🇪🇦🇹🇨🇭 🛡️
|
shop3.example.com [Direkt] 🇩🇪🇦🇹🇨🇭 📝
|
||||||
312 blocks, 1h 39m, Cache: ✅8,234
|
312 blocks, 1h 39m, Cache: ✅8,234
|
||||||
```
|
```
|
||||||
|
|
||||||
@@ -423,6 +512,32 @@ cscli decisions list --limit 0 | grep "shop.example.com"
|
|||||||
while cscli decisions list -o raw --limit 0 | grep -q "GeoIP"; do cscli decisions list -o raw --limit 0 | grep "GeoIP" | cut -d',' -f3 | cut -d':' -f2 | while read ip; do echo "🗑️ Lösche: $ip"; cscli decisions delete --ip "$ip" 2>/dev/null; done; done && echo "✅ Alle GeoIP-Decisions gelöscht"
|
while cscli decisions list -o raw --limit 0 | grep -q "GeoIP"; do cscli decisions list -o raw --limit 0 | grep "GeoIP" | cut -d',' -f3 | cut -d':' -f2 | while read ip; do echo "🗑️ Lösche: $ip"; cscli decisions delete --ip "$ip" 2>/dev/null; done; done && echo "✅ Alle GeoIP-Decisions gelöscht"
|
||||||
```
|
```
|
||||||
|
|
||||||
|
### Rate-Limit Bans manuell prüfen (Bot-Only Modus)
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Aktive Bans für einen Shop anzeigen
|
||||||
|
ls -la /var/www/vhosts/SHOP/httpdocs/geoip_ratelimit/bans/
|
||||||
|
|
||||||
|
# Anzahl aktiver Bans
|
||||||
|
find /var/www/vhosts/SHOP/httpdocs/geoip_ratelimit/bans/ -name "*.ban" | wc -l
|
||||||
|
|
||||||
|
# Ban-Inhalt prüfen (Unix-Timestamp bis wann gebannt)
|
||||||
|
cat /var/www/vhosts/SHOP/httpdocs/geoip_ratelimit/bans/*.ban
|
||||||
|
|
||||||
|
# Request-Counter prüfen
|
||||||
|
cat /var/www/vhosts/SHOP/httpdocs/geoip_ratelimit/counts/*.count
|
||||||
|
```
|
||||||
|
|
||||||
|
### Rate-Limit Bans manuell löschen
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Alle Bans für einen Shop löschen
|
||||||
|
rm /var/www/vhosts/SHOP/httpdocs/geoip_ratelimit/bans/*.ban
|
||||||
|
|
||||||
|
# Alle Counter zurücksetzen
|
||||||
|
rm /var/www/vhosts/SHOP/httpdocs/geoip_ratelimit/counts/*.count
|
||||||
|
```
|
||||||
|
|
||||||
### Firewall-Statistiken prüfen
|
### Firewall-Statistiken prüfen
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
@@ -468,15 +583,18 @@ cscli decisions delete --ip DEINE_IP
|
|||||||
|
|
||||||
- `index.php.geoip_backup` - Backup der Original index.php
|
- `index.php.geoip_backup` - Backup der Original index.php
|
||||||
- `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, nur GeoIP-Modi)
|
||||||
- `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 (nur PHP+CrowdSec Modus)
|
- `geoip_crowdsec_queue.log` - Queue für CrowdSec-Synchronisation (nur CrowdSec-Modi)
|
||||||
|
- `geoip_ratelimit/` - Rate-Limit Daten (nur Bot-Only Modus)
|
||||||
|
- `bans/` - Aktive Bans (Hash → Unix-Timestamp)
|
||||||
|
- `counts/` - Request-Counter (Hash → window_start|count)
|
||||||
|
|
||||||
### System-weit
|
### 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 (inkl. Modus)
|
- `/var/lib/crowdsec/geoip_active_shops.json` - Tracking aktiver Shops (inkl. Modus, Rate-Limit Config)
|
||||||
|
|
||||||
## ⚙️ Konfiguration
|
## ⚙️ Konfiguration
|
||||||
|
|
||||||
@@ -489,13 +607,12 @@ Standardmäßig 72 Stunden. Zum Ändern editiere das Python-Script:
|
|||||||
expiry = datetime.now() + timedelta(hours=72) # Hier ändern
|
expiry = datetime.now() + timedelta(hours=72) # Hier ändern
|
||||||
```
|
```
|
||||||
|
|
||||||
Und im PHP-Script Template:
|
### Rate-Limit Defaults ändern
|
||||||
|
|
||||||
```python
|
```python
|
||||||
# Zeile ~30-50
|
# Am Anfang des Scripts
|
||||||
GEOIP_SCRIPT = '''<?php
|
DEFAULT_RATE_LIMIT = 30 # Requests pro Minute
|
||||||
// Auto-disable after 72 hours
|
DEFAULT_BAN_DURATION = 5 # Minuten
|
||||||
$expiry_date = strtotime('{expiry_timestamp}');
|
|
||||||
'''
|
|
||||||
```
|
```
|
||||||
|
|
||||||
### Watcher-Intervall ändern
|
### Watcher-Intervall ändern
|
||||||
@@ -525,6 +642,18 @@ $countries = ['de', 'at', 'ch']; // Germany, Austria, Switzerland
|
|||||||
|
|
||||||
Füge weitere Ländercodes hinzu (z.B. `'nl'` für Niederlande, `'be'` für Belgien). Die verfügbaren Ländercodes findest du unter: https://www.ipdeny.com/ipblocks/data/aggregated/
|
Füge weitere Ländercodes hinzu (z.B. `'nl'` für Niederlande, `'be'` für Belgien). Die verfügbaren Ländercodes findest du unter: https://www.ipdeny.com/ipblocks/data/aggregated/
|
||||||
|
|
||||||
|
### Bot-Patterns erweitern
|
||||||
|
|
||||||
|
Im Python-Script findest du das Dictionary `BOT_PATTERNS`:
|
||||||
|
|
||||||
|
```python
|
||||||
|
BOT_PATTERNS = {
|
||||||
|
'GPTBot': r'GPTBot',
|
||||||
|
'ClaudeBot': r'ClaudeBot',
|
||||||
|
# Weitere Patterns hinzufügen...
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
### Link11-IP ändern
|
### Link11-IP ändern
|
||||||
|
|
||||||
Falls Link11 eine andere IP verwendet, kann diese im Script angepasst werden:
|
Falls Link11 eine andere IP verwendet, kann diese im Script angepasst werden:
|
||||||
@@ -538,30 +667,32 @@ LINK11_IP = "128.65.223.106" # Hier ändern
|
|||||||
|
|
||||||
### Was wird geblockt?
|
### Was wird geblockt?
|
||||||
|
|
||||||
|
**GeoIP-Modi:**
|
||||||
- ✅ Alle IPs außerhalb der konfigurierten Region (DACH oder Eurozone)
|
- ✅ Alle IPs außerhalb der konfigurierten Region (DACH oder Eurozone)
|
||||||
- ✅ Auf PHP-Ebene: Sofortiger 403 Response
|
- ✅ Auf PHP-Ebene: Sofortiger 403 Response
|
||||||
- ✅ Auf Firewall-Ebene (nur PHP+CrowdSec): Alle Ports (HTTP, HTTPS, SSH, FTP, etc.)
|
- ✅ Auf Firewall-Ebene (nur PHP+CrowdSec): Alle Ports (HTTP, HTTPS, SSH, FTP, etc.)
|
||||||
|
|
||||||
|
**Bot-Only Modus:**
|
||||||
|
- ✅ 30+ bekannte Bot-Patterns (GPTBot, ClaudeBot, Bingbot, etc.)
|
||||||
|
- ✅ Bots die das Rate-Limit überschreiten werden temporär gebannt
|
||||||
|
- ✅ Normale Besucher weltweit erlaubt
|
||||||
|
|
||||||
### Was wird NICHT geblockt?
|
### Was wird NICHT geblockt?
|
||||||
|
|
||||||
- ✅ Alle IPs aus den erlaubten Ländern (basierend auf RIPE/ipdeny.com Daten)
|
- ✅ Alle IPs aus den erlaubten Ländern (GeoIP-Modi)
|
||||||
|
- ✅ Normale Besucher ohne Bot-User-Agent (Bot-Only Modus)
|
||||||
- ✅ 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)
|
||||||
|
|
||||||
### Fehlblockierungen vermeiden
|
### Erkannte Bot-Patterns
|
||||||
|
|
||||||
Das System nutzt die **offiziellen IP-Zuweisungen** von ipdeny.com:
|
| Kategorie | Bots |
|
||||||
- Basiert auf RIPE-Daten
|
|-----------|------|
|
||||||
- Täglich aktualisiert
|
| AI-Crawler | GPTBot, OAI-SearchBot, ChatGPT-User, ClaudeBot, Claude-User, anthropic-ai, PerplexityBot |
|
||||||
- Umfasst alle Provider der konfigurierten Länder
|
| Suchmaschinen | Googlebot, Google-Extended, AdsBot-Google, Bingbot, BingPreview, msnbot, DuckDuckBot, YandexBot, Baiduspider |
|
||||||
- Präzise CIDR-Prüfung
|
| Social Media | FacebookBot, LinkedInBot, Twitterbot, Slackbot |
|
||||||
|
| SEO-Tools | AhrefsBot, SemrushBot, MJ12bot, DotBot, DataForSeoBot |
|
||||||
**Risiko für Fehlblockierungen: Minimal**
|
| Andere | Applebot, Amazonbot, Bytespider, PetalBot, UptimeRobot, Pingdom, curl, python-requests, Wget, Scrapy |
|
||||||
|
|
||||||
Erlaubte IPs können nur geblockt werden, wenn:
|
|
||||||
1. Der Provider die IP-Range außerhalb der erlaubten Region registriert hat (extrem selten)
|
|
||||||
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
|
## 🌐 CDN/Reverse-Proxy Hinweise
|
||||||
|
|
||||||
@@ -584,7 +715,7 @@ Das PHP-Script liest die echte IP aus dem `X-Forwarded-For` Header:
|
|||||||
- Blockt zuverlässig auf Anwendungsebene
|
- Blockt zuverlässig auf Anwendungsebene
|
||||||
- Kein unnötiger CrowdSec-Overhead
|
- Kein unnötiger CrowdSec-Overhead
|
||||||
|
|
||||||
**Empfehlung für CDN-Nutzer:** Wähle bei der Aktivierung den Modus **[2] Nur PHP**.
|
**Empfehlung für CDN-Nutzer:** Wähle bei der Aktivierung den Modus **[2] Nur GeoIP** oder **[4] Nur Bot-Block**.
|
||||||
|
|
||||||
### Lösung 2: Option [7] - Nur direkte Shops
|
### Lösung 2: Option [7] - Nur direkte Shops
|
||||||
|
|
||||||
@@ -625,6 +756,23 @@ mv index.php.geoip_backup index.php
|
|||||||
python3 geoip_shop_manager.py # Option 2
|
python3 geoip_shop_manager.py # Option 2
|
||||||
```
|
```
|
||||||
|
|
||||||
|
### Rate-Limit funktioniert nicht (Bot-Only Modus)
|
||||||
|
|
||||||
|
**Ursache**: Berechtigungsprobleme bei den Rate-Limit Verzeichnissen
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Prüfe Berechtigungen
|
||||||
|
ls -la /var/www/vhosts/SHOP/httpdocs/geoip_ratelimit/
|
||||||
|
|
||||||
|
# Fix: Berechtigungen korrigieren
|
||||||
|
chmod -R 777 /var/www/vhosts/SHOP/httpdocs/geoip_ratelimit/
|
||||||
|
|
||||||
|
# Oder für alle Shops:
|
||||||
|
for dir in /var/www/vhosts/*/httpdocs/geoip_ratelimit; do
|
||||||
|
[ -d "$dir" ] && chmod -R 777 "$dir" && echo "Fixed: $dir"
|
||||||
|
done
|
||||||
|
```
|
||||||
|
|
||||||
### Watcher-Service läuft nicht
|
### Watcher-Service läuft nicht
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
@@ -716,14 +864,21 @@ dig +short shop.example.com
|
|||||||
|
|
||||||
## 📊 Performance
|
## 📊 Performance
|
||||||
|
|
||||||
### PHP-Level Blocking
|
### PHP-Level Blocking (GeoIP)
|
||||||
|
|
||||||
- **Overhead pro Request**: ~2-8ms (bei gecachten IP-Ranges)
|
- **Overhead pro Request**: ~2-8ms (bei gecachten IP-Ranges)
|
||||||
- **Erster Request**: ~400-800ms (beim Download der IP-Ranges)
|
- **Erster Request**: ~400-800ms (beim Download der IP-Ranges)
|
||||||
- **Cache-Dauer**: 24 Stunden
|
- **Cache-Dauer**: 24 Stunden
|
||||||
- **RAM-Verbrauch**: ~5-10 MB pro Shop
|
- **RAM-Verbrauch**: ~5-10 MB pro Shop
|
||||||
|
|
||||||
### CrowdSec Firewall Blocking (nur PHP+CrowdSec Modus)
|
### PHP-Level Blocking (Bot-Only mit Rate-Limiting)
|
||||||
|
|
||||||
|
- **Overhead pro Request**: ~1-3ms (File-basierte Checks)
|
||||||
|
- **Ban-Check**: ~0.5ms (einzelner File-Read)
|
||||||
|
- **Counter-Update**: ~1-2ms (File-Lock + Write)
|
||||||
|
- **Speicherplatz**: ~1 KB pro aktiver Bot (Hash-Dateien)
|
||||||
|
|
||||||
|
### CrowdSec Firewall Blocking (nur CrowdSec-Modi)
|
||||||
|
|
||||||
- **Overhead**: 0ms (blockt vor PHP)
|
- **Overhead**: 0ms (blockt vor PHP)
|
||||||
- **RAM**: ~20-50 MB (Watcher-Service)
|
- **RAM**: ~20-50 MB (Watcher-Service)
|
||||||
@@ -774,6 +929,9 @@ tail -f /var/www/vhosts/SHOP/httpdocs/geoip_blocked.log
|
|||||||
|
|
||||||
# Statistik
|
# Statistik
|
||||||
wc -l /var/www/vhosts/SHOP/httpdocs/geoip_blocked.log
|
wc -l /var/www/vhosts/SHOP/httpdocs/geoip_blocked.log
|
||||||
|
|
||||||
|
# Nur BANNED Einträge (Rate-Limit überschritten)
|
||||||
|
grep "BANNED:" /var/www/vhosts/SHOP/httpdocs/geoip_blocked.log
|
||||||
```
|
```
|
||||||
|
|
||||||
### CrowdSec Logs
|
### CrowdSec Logs
|
||||||
@@ -801,6 +959,10 @@ 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 | \
|
||||||
grep -oP 'IP: \K[0-9.]+' | sort | uniq -c | sort -rn | head -10
|
grep -oP 'IP: \K[0-9.]+' | sort | uniq -c | sort -rn | head -10
|
||||||
|
|
||||||
|
# Top 10 gebannte Bots (Bot-Only Modus)
|
||||||
|
grep "BOT:" /var/www/vhosts/SHOP/httpdocs/geoip_blocked.log | \
|
||||||
|
grep -oP 'BOT: \K[^ |]+' | sort | uniq -c | sort -rn | head -10
|
||||||
```
|
```
|
||||||
|
|
||||||
## 🔐 Best Practices
|
## 🔐 Best Practices
|
||||||
@@ -808,25 +970,28 @@ cat /var/www/vhosts/SHOP/httpdocs/geoip_blocked.log | \
|
|||||||
### Vor Aktivierung
|
### Vor Aktivierung
|
||||||
|
|
||||||
1. ✅ Backup erstellen (macht das Script automatisch)
|
1. ✅ Backup erstellen (macht das Script automatisch)
|
||||||
2. ✅ Sicherstellen, dass Admin-Zugriff aus erlaubter Region kommt
|
2. ✅ Sicherstellen, dass Admin-Zugriff aus erlaubter Region kommt (GeoIP-Modi)
|
||||||
3. ✅ **Link11-Status prüfen** (farbcodiert im Script)
|
3. ✅ **Link11-Status prüfen** (farbcodiert im Script)
|
||||||
4. ✅ **Modus wählen** (PHP+CrowdSec für direkte Server, PHP-only für CDN)
|
4. ✅ **Modus wählen** (GeoIP vs. Bot-Only, mit/ohne CrowdSec)
|
||||||
5. ✅ Bei gemischtem Setup: **Option [7]** für nur direkte Shops nutzen
|
5. ✅ **Rate-Limit konfigurieren** (Bot-Only Modus)
|
||||||
6. ✅ Test mit kurzer Dauer (kann im Script angepasst werden)
|
6. ✅ Bei gemischtem Setup: **Option [7]** für nur direkte Shops nutzen
|
||||||
7. ✅ Monitoring einrichten
|
7. ✅ Test mit kurzer Dauer (kann im Script angepasst werden)
|
||||||
|
8. ✅ 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 (nur bei PHP+CrowdSec)
|
3. ✅ CrowdSec-Statistiken beobachten (nur bei CrowdSec-Modi)
|
||||||
4. ✅ Server-Performance monitoren
|
4. ✅ Rate-Limit Bans prüfen (Bot-Only Modus)
|
||||||
|
5. ✅ Server-Performance monitoren
|
||||||
|
|
||||||
### Nach Deaktivierung
|
### Nach Deaktivierung
|
||||||
|
|
||||||
1. ✅ Prüfen ob alle Decisions entfernt wurden (nur bei PHP+CrowdSec)
|
1. ✅ Prüfen ob alle Decisions entfernt wurden (nur bei CrowdSec-Modi)
|
||||||
2. ✅ Backup-Dateien können gelöscht werden (optional)
|
2. ✅ Rate-Limit Verzeichnis wird automatisch gelöscht (Bot-Only Modus)
|
||||||
3. ✅ Logs archivieren (falls benötigt)
|
3. ✅ Backup-Dateien können gelöscht werden (optional)
|
||||||
|
4. ✅ Logs archivieren (falls benötigt)
|
||||||
|
|
||||||
## ⚠️ Wichtige Hinweise
|
## ⚠️ Wichtige Hinweise
|
||||||
|
|
||||||
@@ -842,6 +1007,7 @@ cat /var/www/vhosts/SHOP/httpdocs/geoip_blocked.log | \
|
|||||||
- **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 oder Option [7] empfohlen
|
- **CDN**: Bei CDN-Nutzung ist PHP-only Modus oder Option [7] empfohlen
|
||||||
|
- **Rate-Limiting**: File-basiert, funktioniert ohne Redis/Memcached
|
||||||
|
|
||||||
### Empfehlungen
|
### Empfehlungen
|
||||||
|
|
||||||
@@ -850,6 +1016,7 @@ cat /var/www/vhosts/SHOP/httpdocs/geoip_blocked.log | \
|
|||||||
- ✅ 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 oder Option [7] verwenden
|
- ✅ Bei CDN: PHP-only Modus oder Option [7] verwenden
|
||||||
|
- ✅ Bot-Only Modus für gezielte Bot-Abwehr ohne GeoBlocking
|
||||||
|
|
||||||
## 🤝 Contributing
|
## 🤝 Contributing
|
||||||
|
|
||||||
@@ -881,7 +1048,8 @@ 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)
|
- **Verwendeter Modus** (GeoIP/Bot-Only, mit/ohne CrowdSec)
|
||||||
|
- **Rate-Limit Konfiguration** (Bot-Only Modus)
|
||||||
- **Link11-Status** der betroffenen Shops
|
- **Link11-Status** der betroffenen Shops
|
||||||
|
|
||||||
## 📚 Weitere Dokumentation
|
## 📚 Weitere Dokumentation
|
||||||
@@ -893,13 +1061,31 @@ Bei Problemen:
|
|||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
**Version**: 3.3.0
|
**Version**: 3.4.2
|
||||||
**Letztes Update**: Dezember 2025
|
**Letztes Update**: Dezember 2025
|
||||||
**Status**: Production Ready ✅
|
**Status**: Production Ready ✅
|
||||||
**Erlaubte Regionen**: 🇩🇪🇦🇹🇨🇭 DACH | 🇪🇺 Eurozone+GB | 🤖 Bot-Only
|
**Erlaubte Regionen**: 🇩🇪🇦🇹🇨🇭 DACH | 🇪🇺 Eurozone+GB | 🤖 Bot-Only (weltweit)
|
||||||
|
|
||||||
### Changelog
|
### Changelog
|
||||||
|
|
||||||
|
#### v3.4.2
|
||||||
|
- **FIX**: Verzeichnis-Berechtigungen für Rate-Limit (777 statt 755)
|
||||||
|
- PHP läuft als anderer User als root - Verzeichnisse müssen für alle schreibbar sein
|
||||||
|
|
||||||
|
#### v3.4.1
|
||||||
|
- **FIX**: Bot-Namen werden jetzt korrekt in Statistiken angezeigt
|
||||||
|
- Bot-Name wird direkt aus dem Log extrahiert (`BOT:` / `BANNED:`) statt aus UA geparst
|
||||||
|
|
||||||
|
#### v3.4.0
|
||||||
|
- **NEU**: File-basiertes Rate-Limiting für Bot-Only Modus
|
||||||
|
- **NEU**: Konfigurierbare Rate-Limits (Requests/Minute) bei Aktivierung
|
||||||
|
- **NEU**: Konfigurierbare Ban-Dauer bei Überschreitung
|
||||||
|
- **NEU**: Sliding Window Counter Algorithmus
|
||||||
|
- **NEU**: Automatisches Cleanup abgelaufener Bans (probabilistisch)
|
||||||
|
- **NEU**: Retry-After Header bei gebannten Requests
|
||||||
|
- **NEU**: Rate-Limit Statistiken in Logs und Gesamtübersicht
|
||||||
|
- **NEU**: Verzeichnisstruktur `geoip_ratelimit/bans/` und `geoip_ratelimit/counts/`
|
||||||
|
|
||||||
#### v3.3.0
|
#### v3.3.0
|
||||||
- **NEU**: Option [7] - Nur direkte Shops aktivieren (ohne Link11)
|
- **NEU**: Option [7] - Nur direkte Shops aktivieren (ohne Link11)
|
||||||
- **NEU**: Automatische Link11-Erkennung per DNS-Lookup
|
- **NEU**: Automatische Link11-Erkennung per DNS-Lookup
|
||||||
|
|||||||
Reference in New Issue
Block a user