603 lines
19 KiB
Markdown
603 lines
19 KiB
Markdown
# GeoIP Shop Blocker Manager v3.1.0
|
|
|
|
**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 einer gewählten Geo-Region zu sperren. Es kombiniert PHP-Level-Blocking mit optionaler CrowdSec Firewall-Integration für maximalen Schutz.
|
|
|
|
## 🎯 Features
|
|
|
|
- ✅ **Zwei Geo-Regionen**: DACH (3 Länder) oder Eurozone+GB (22 Länder)
|
|
- ✅ **Präzises Blocking**: PHP prüft gegen vollständige IP-Ranges (keine Fehlblockierungen)
|
|
- ✅ **Flexibler Modus**: Wahl zwischen "PHP + CrowdSec" oder "Nur PHP"
|
|
- ✅ **Cache-Validierung**: Sofortige Prüfung bei Aktivierung
|
|
- ✅ **Fail-Open**: Bei Cache-Fehlern wird Traffic durchgelassen (nicht blockiert)
|
|
- ✅ **Selbstheilender Cache**: Korrupte Cache-Dateien werden automatisch regeneriert
|
|
- ✅ **Doppelter Schutz**: PHP-Level + Firewall-Level (CrowdSec) - optional
|
|
- ✅ **Automatische Synchronisation**: Blockierte IPs werden automatisch an CrowdSec weitergegeben
|
|
- ✅ **Multi-Shop-Management**: Verwaltung mehrerer Shops auf einem Server
|
|
- ✅ **Bulk-Operationen**: Alle Shops gleichzeitig aktivieren/deaktivieren
|
|
- ✅ **Gesamtübersicht**: Logs und Statistiken über alle Shops hinweg (Top 100 IPs)
|
|
- ✅ **Bot-Erkennung**: Automatische Identifikation von bekannten Bots/Crawlern
|
|
- ✅ **Link11-Erkennung**: Farbige Anzeige ob Shop hinter Link11 CDN ist
|
|
- ✅ **Auto-Deaktivierung**: Blocking läuft nach 72 Stunden automatisch ab
|
|
- ✅ **Systemd-Service**: Automatischer Start beim Booten
|
|
- ✅ **Sauberes Cleanup**: Vollständige Deinstallation bei Deaktivierung
|
|
- ✅ **Plesk-kompatibel**: Funktioniert mit Plesk-verwalteten Shops
|
|
- ✅ **CDN-kompatibel**: PHP-only Modus für Link11, Cloudflare & Co.
|
|
|
|
## 🌍 Geo-Regionen
|
|
|
|
| Region | Icon | Länder | Beschreibung |
|
|
|--------|------|--------|--------------|
|
|
| **DACH** | 🇩🇪🇦🇹🇨🇭 | 3 | Deutschland, Österreich, Schweiz |
|
|
| **Eurozone+GB** | 🇪🇺 | 22 | DE, AT, CH, BE, CY, EE, ES, FI, FR, GB, GR, HR, IE, IT, LT, LU, LV, MT, NL, PT, SI, SK |
|
|
|
|
### Wann welche Region?
|
|
|
|
| Situation | Empfohlene Region |
|
|
|-----------|-------------------|
|
|
| Nur deutschsprachige Kunden | 🇩🇪🇦🇹🇨🇭 DACH |
|
|
| EU-weiter Versand | 🇪🇺 Eurozone+GB |
|
|
| Schnellere Performance gewünscht | 🇩🇪🇦🇹🇨🇭 DACH (weniger IP-Ranges) |
|
|
| Maximale Abdeckung | 🇪🇺 Eurozone+GB |
|
|
|
|
### Performance-Vergleich
|
|
|
|
| Region | IP-Ranges | RAM-Verbrauch | Cache-Größe |
|
|
|--------|-----------|---------------|-------------|
|
|
| 🇩🇪🇦🇹🇨🇭 DACH | ~3.000-4.000 | ~5-10 MB | ~100-200 KB |
|
|
| 🇪🇺 Eurozone+GB | ~12.000-15.000 | ~15-25 MB | ~500-900 KB |
|
|
|
|
## 🆕 Neu in v3.1.0: Cache-Validierung & Fail-Open
|
|
|
|
### Problem gelöst
|
|
Korrupte Cache-Dateien führten dazu, dass **alle IPs blockiert** wurden (403 für jeden Besucher).
|
|
|
|
### Lösung
|
|
1. **Cache-Validierung bei Aktivierung**: Cache wird sofort generiert und auf Mindestanzahl geprüft
|
|
2. **Fail-Open im PHP**: Bei Cache-Fehlern wird Traffic **durchgelassen** statt blockiert
|
|
3. **Selbstheilung**: Korrupter Cache wird automatisch gelöscht und neu generiert
|
|
|
|
```
|
|
DACH: min. 1.000 IP-Ranges erwartet
|
|
Eurozone: min. 5.000 IP-Ranges erwartet
|
|
```
|
|
|
|
### Wie funktioniert Fail-Open?
|
|
|
|
```php
|
|
// Im PHP-Script:
|
|
if (!is_array($allowed_ranges) || count($allowed_ranges) < $min_ranges) {
|
|
// Cache korrupt oder unvollständig → löschen
|
|
@unlink($cache_file);
|
|
|
|
// Neu laden versuchen...
|
|
$allowed_ranges = download_allowed_ranges($allowed_countries);
|
|
}
|
|
|
|
// Wenn immer noch keine gültigen Ranges → Traffic durchlassen!
|
|
if (empty($allowed_ranges)) {
|
|
error_log("GeoIP FAIL-OPEN: Could not load valid IP ranges");
|
|
return; // Allow traffic instead of blocking everything
|
|
}
|
|
```
|
|
|
|
**Vorteile:**
|
|
- Kein Total-Lockout bei Cache-Problemen
|
|
- Selbstheilend (regeneriert automatisch)
|
|
- Sicherer als Fail-Closed
|
|
- Validierung bereits bei Aktivierung
|
|
|
|
## 🏗️ Architektur
|
|
|
|
### Modus 1: PHP + CrowdSec 🛡️
|
|
|
|
#### Komponente 1: PHP-Script
|
|
- Wird in die `index.php` des Shops integriert
|
|
- Lädt IP-Ranges von ipdeny.com (je nach Region)
|
|
- Prüft jede Anfrage gegen diese Ranges
|
|
- **Validiert Cache** auf Mindestanzahl
|
|
- Blockt Nicht-Region-IPs sofort mit HTTP 403
|
|
- Schreibt blockierte IPs in Queue-Datei für CrowdSec
|
|
- **Fail-Open** bei Cache-Problemen
|
|
|
|
#### Komponente 2: Python Watcher (systemd service)
|
|
- Läuft permanent im Hintergrund als root
|
|
- Überwacht Queue-Dateien aller aktiven Shops
|
|
- Fügt blockierte IPs automatisch zu CrowdSec hinzu
|
|
- Vermeidet Duplikate durch In-Memory-Cache
|
|
- Prüft alle 5 Sekunden auf neue IPs
|
|
|
|
#### Komponente 3: CrowdSec Firewall Bouncer
|
|
- Blockiert IPs auf Firewall-Ebene (iptables/nftables)
|
|
- Schützt ALLE Services (HTTP, HTTPS, SSH, FTP, etc.)
|
|
- Übernimmt Bans für 72 Stunden
|
|
- Deutlich performanter als PHP-Checks
|
|
|
|
### Modus 2: Nur PHP 📝
|
|
|
|
- Nur das PHP-Script wird aktiviert
|
|
- Keine CrowdSec-Synchronisation
|
|
- Kein Watcher-Service nötig
|
|
- **Ideal für Server hinter CDN/Proxy** (Link11, Cloudflare, etc.)
|
|
|
|
> **Hinweis**: Bei Servern hinter einem CDN/Reverse-Proxy (wie Link11, Cloudflare, Hetzner LB) sieht iptables nur die Proxy-IP, nicht die echte Client-IP. In diesem Fall ist der **PHP-only Modus** die bessere Wahl, da PHP die echte IP aus dem `X-Forwarded-For` Header liest.
|
|
|
|
## 📋 Voraussetzungen
|
|
|
|
- **Betriebssystem**: Ubuntu Server (getestet auf 24.04)
|
|
- **Webserver**: Apache mit mod_rewrite (oder nginx)
|
|
- **PHP**: Version 8.0 oder höher
|
|
- **Python**: Version 3.8 oder höher
|
|
- **CrowdSec**: Installiert und aktiv (nur für PHP+CrowdSec Modus)
|
|
- **CrowdSec Firewall Bouncer**: Installiert und konfiguriert (nur für PHP+CrowdSec Modus)
|
|
- **Plesk**: Optional, aber empfohlen
|
|
- **Root-Zugriff**: Erforderlich für Installation und Verwaltung
|
|
|
|
### CrowdSec Installation prüfen (nur für PHP+CrowdSec Modus)
|
|
|
|
```bash
|
|
# Prüfe ob CrowdSec läuft
|
|
systemctl status crowdsec
|
|
|
|
# Prüfe ob Firewall Bouncer aktiv ist
|
|
cscli bouncers list
|
|
|
|
# Sollte zeigen:
|
|
# cs-firewall-bouncer-... mit ✔️ Valid und Recent Last API pull
|
|
```
|
|
|
|
Falls CrowdSec noch nicht installiert ist:
|
|
```bash
|
|
curl -s https://packagecloud.io/install/repositories/crowdsec/crowdsec/script.deb.sh | sudo bash
|
|
apt-get update
|
|
apt-get install crowdsec crowdsec-firewall-bouncer-iptables
|
|
```
|
|
|
|
## 🚀 Installation
|
|
|
|
### 1. Script herunterladen
|
|
|
|
```bash
|
|
# Als root
|
|
cd /root
|
|
wget https://git.jtl-hosting.de/thomasciesla/geoip_shop_manager/raw/branch/main/geoip_shop_blocker.py
|
|
chmod +x geoip_shop_blocker.py
|
|
```
|
|
|
|
### 2. Script ausführen
|
|
|
|
```bash
|
|
python3 geoip_shop_blocker.py
|
|
```
|
|
|
|
Das war's! Das Script ist vollständig selbstverwaltend.
|
|
|
|
## 📖 Verwendung
|
|
|
|
### Hauptmenü
|
|
|
|
```
|
|
════════════════════════════════════════════════════════════════
|
|
GeoIP Shop Blocker Manager v3.1.0
|
|
🇩🇪🇦🇹🇨🇭 DACH | 🇪🇺 Eurozone+GB (22 Länder)
|
|
🛡️ Mit Cache-Validierung und Fail-Open
|
|
════════════════════════════════════════════════════════════════
|
|
✅ CrowdSec
|
|
✅ Watcher-Service
|
|
|
|
────────────────────────────────────────
|
|
[1] Aktivieren (einzeln)
|
|
[2] Deaktivieren (einzeln)
|
|
[3] Logs anzeigen
|
|
[4] Status
|
|
────────────────────────────────────────
|
|
[5] 🚀 ALLE aktivieren
|
|
[6] 🛑 ALLE deaktivieren
|
|
────────────────────────────────────────
|
|
[0] Beenden
|
|
```
|
|
|
|
### Geo-Region wählen
|
|
|
|
Bei jeder Aktivierung wird zuerst nach der Region gefragt:
|
|
|
|
```
|
|
🌍 Wähle die Geo-Region:
|
|
[1] 🇩🇪🇦🇹🇨🇭 DACH - Deutschland, Österreich, Schweiz
|
|
[2] 🇪🇺 Eurozone+GB - 22 Länder
|
|
|
|
Region wählen [1/2]:
|
|
```
|
|
|
|
### Blocking-Modus wählen
|
|
|
|
Danach wird nach dem Modus gefragt:
|
|
|
|
```
|
|
🔧 Wähle den Blocking-Modus:
|
|
[1] PHP + CrowdSec (IPs werden an CrowdSec gemeldet)
|
|
[2] Nur PHP (keine CrowdSec-Synchronisation)
|
|
|
|
Modus wählen [1/2]:
|
|
```
|
|
|
|
**Wann welchen Modus wählen?**
|
|
|
|
| Situation | Empfohlener Modus |
|
|
|-----------|-------------------|
|
|
| Server direkt im Internet | PHP + CrowdSec 🛡️ |
|
|
| Server hinter CDN (Link11, Cloudflare) | Nur PHP 📝 |
|
|
| CrowdSec nicht installiert | Nur PHP 📝 |
|
|
| Minimaler Overhead gewünscht | Nur PHP 📝 |
|
|
| Maximaler Schutz (alle Ports) | PHP + CrowdSec 🛡️ |
|
|
|
|
### Blocking aktivieren (einzelner Shop)
|
|
|
|
1. Script starten: `python3 geoip_shop_blocker.py`
|
|
2. Option `[1] Aktivieren (einzeln)` wählen
|
|
3. Shop aus der Liste auswählen (farbig: 🟢 Link11, 🔴 Direkt)
|
|
4. **Geo-Region wählen** (DACH oder Eurozone+GB)
|
|
5. **Modus wählen** (PHP+CrowdSec oder Nur PHP)
|
|
6. Bestätigen mit `ja`
|
|
|
|
**Beispielausgabe:**
|
|
```
|
|
🔧 Aktiviere 🇪🇺 Eurozone + GB GeoIP-Blocking für: shop.example.com
|
|
Erlaubt: 22 Länder: DE, AT, CH, BE, CY, EE, ES, FI, FR, GB, GR, HR, IE, IT, LT, LU, LV, MT, NL, PT, SI, SK
|
|
Modus: PHP + CrowdSec
|
|
════════════════════════════════════════════════════════════════
|
|
|
|
[1/4] Installiere CrowdSec-Watcher-Service...
|
|
✅ Service gestartet
|
|
|
|
[2/4] Aktiviere PHP-Blocking...
|
|
✅ PHP-Blocking aktiviert
|
|
|
|
[3/4] Generiere IP-Range-Cache (22 Länder)...
|
|
✅ Cache generiert: 12,345 IP-Ranges
|
|
|
|
[4/4] Registriere Shop...
|
|
✅ Shop registriert
|
|
|
|
════════════════════════════════════════════════════════════════
|
|
✅ 🇪🇺 Eurozone + GB GeoIP-Blocking aktiviert
|
|
Shop: shop.example.com
|
|
IP-Ranges: 12,345
|
|
Gültig bis: 2025-12-12 10:30:00 CET
|
|
🛡️ Fail-Open: Bei Cache-Fehlern wird Traffic durchgelassen
|
|
════════════════════════════════════════════════════════════════
|
|
```
|
|
|
|
### Blocking für ALLE Shops aktivieren
|
|
|
|
1. Script starten: `python3 geoip_shop_blocker.py`
|
|
2. Option `[5] 🚀 ALLE aktivieren` wählen
|
|
3. Liste der zu aktivierenden Shops wird angezeigt
|
|
4. **Geo-Region wählen** (gilt für alle Shops)
|
|
5. **Modus wählen** (gilt für alle Shops)
|
|
6. Bestätigen mit `ja`
|
|
|
|
### Status prüfen
|
|
|
|
Option `[4] Status` zeigt:
|
|
|
|
```
|
|
📊 2/5 Shops aktiv
|
|
shop1.example.com [Link11] 🇩🇪🇦🇹🇨🇭 🛡️
|
|
1234 blocks, 2h 30m, Cache: ✅3,456
|
|
shop2.example.com [Direkt] 🇪🇺 📝
|
|
567 blocks, 1h 15m, Cache: ✅12,345
|
|
```
|
|
|
|
**Legende:**
|
|
- 🟢 `[Link11]` = Shop ist hinter Link11 CDN
|
|
- 🔴 `[Direkt]` = Shop ist direkt erreichbar
|
|
- 🇩🇪🇦🇹🇨🇭 = DACH Region
|
|
- 🇪🇺 = Eurozone+GB Region
|
|
- 🛡️ = PHP + CrowdSec Modus
|
|
- 📝 = Nur PHP Modus
|
|
- ✅ = Cache valide mit Anzahl Ranges
|
|
- ⚠️ = Cache-Problem
|
|
|
|
### Logs anzeigen
|
|
|
|
Option `[3] Logs anzeigen` bietet:
|
|
|
|
```
|
|
📋 Logs für:
|
|
[0] 📊 ALLE (Zusammenfassung)
|
|
[1] shop1.example.com [Link11] 🇩🇪🇦🇹🇨🇭 🛡️
|
|
[2] shop2.example.com [Direkt] 🇪🇺 📝
|
|
```
|
|
|
|
#### Gesamtübersicht (Option 0)
|
|
|
|
```
|
|
════════════════════════════════════════════════════════════════
|
|
📊 GESAMTÜBERSICHT
|
|
════════════════════════════════════════════════════════════════
|
|
|
|
shop1.example.com 🇩🇪🇦🇹🇨🇭: 1234 (5.2 req/min)
|
|
shop2.example.com 🇪🇺: 567 (2.1 req/min)
|
|
|
|
📊 Gesamt: 1801 Blocks
|
|
|
|
🔥 Top 20 IPs:
|
|
185.220.101.34 (Bytespider): 127x
|
|
45.95.169.22 (SemrushBot): 89x
|
|
194.26.192.64 (Unbekannt): 67x
|
|
```
|
|
|
|
#### Einzelner Shop
|
|
|
|
Zeigt detaillierte Logs mit Bot-Erkennung:
|
|
|
|
```
|
|
════════════════════════════════════════════════════════════════
|
|
📊 shop.example.com | 🇪🇺 Eurozone + GB
|
|
════════════════════════════════════════════════════════════════
|
|
⏱️ Laufzeit: 2h 30m
|
|
📈 Blocks: 1234 (8.2 req/min)
|
|
✅ Cache: 12,345 Ranges
|
|
|
|
📝 Letzte 30 Blocks:
|
|
[2025-12-09 10:24:57] IP: 202.8.43.232 | UA: Bytespider | URI: /produkt-123
|
|
...
|
|
|
|
🔥 Top 10 IPs:
|
|
202.8.43.232 (Bytespider): 127x
|
|
45.95.169.22 (SemrushBot): 89x
|
|
```
|
|
|
|
## 🔧 Erweiterte Verwendung
|
|
|
|
### Cache manuell regenerieren
|
|
|
|
```bash
|
|
# Cache für einen Shop löschen (wird automatisch neu generiert)
|
|
rm /var/www/vhosts/SHOP/httpdocs/geoip_ip_ranges.cache
|
|
```
|
|
|
|
### Cache-Status prüfen
|
|
|
|
```bash
|
|
# Cache-Größe und Alter prüfen
|
|
ls -la /var/www/vhosts/SHOP/httpdocs/geoip_ip_ranges.cache
|
|
|
|
# Anzahl der Ranges im Cache
|
|
php -r 'echo count(unserialize(file_get_contents("/var/www/vhosts/SHOP/httpdocs/geoip_ip_ranges.cache")));'
|
|
```
|
|
|
|
### Manuell CrowdSec Decisions prüfen
|
|
|
|
```bash
|
|
# Alle Decisions anzeigen
|
|
cscli decisions list --limit 0
|
|
|
|
# Nur GeoIP-Blocks anzeigen
|
|
cscli decisions list --limit 0 | grep "GeoIP"
|
|
|
|
# Decisions für einen bestimmten Shop
|
|
cscli decisions list --limit 0 | grep "shop.example.com"
|
|
```
|
|
|
|
### Alle GeoIP-Decisions löschen
|
|
|
|
```bash
|
|
while cscli decisions list -o raw --limit 0 | grep -q "GeoIP"; do \
|
|
cscli decisions list -o raw --limit 0 | grep "GeoIP" | \
|
|
cut -d',' -f3 | cut -d':' -f2 | \
|
|
while read ip; do cscli decisions delete --ip "$ip" 2>/dev/null; done; \
|
|
done && echo "✅ Alle GeoIP-Decisions gelöscht"
|
|
```
|
|
|
|
### Systemd-Service verwalten
|
|
|
|
```bash
|
|
# Status des Watcher-Service
|
|
systemctl status geoip-crowdsec-watcher.service
|
|
|
|
# Logs des Watcher-Service
|
|
journalctl -u geoip-crowdsec-watcher.service -f
|
|
|
|
# Service neu starten
|
|
systemctl restart geoip-crowdsec-watcher.service
|
|
```
|
|
|
|
## 📁 Dateistruktur
|
|
|
|
### Pro Shop (in `/var/www/vhosts/SHOP/httpdocs/`)
|
|
|
|
| Datei | Beschreibung |
|
|
|-------|--------------|
|
|
| `index.php.geoip_backup` | Backup der Original index.php |
|
|
| `geoip_blocking.php` | PHP-Blocking-Script |
|
|
| `geoip_ip_ranges.cache` | Gecachte IP-Ranges (erneuert alle 24h) |
|
|
| `geoip_blocked.log` | Log der PHP-Level Blocks |
|
|
| `geoip_crowdsec_queue.log` | Queue für CrowdSec (nur PHP+CrowdSec) |
|
|
|
|
### System-weit
|
|
|
|
| Datei | Beschreibung |
|
|
|-------|--------------|
|
|
| `/usr/local/bin/geoip_crowdsec_watcher.py` | Watcher-Service Script |
|
|
| `/etc/systemd/system/geoip-crowdsec-watcher.service` | Systemd Service |
|
|
| `/var/lib/crowdsec/geoip_active_shops.json` | Tracking aktiver Shops |
|
|
|
|
## 🛡️ Sicherheit
|
|
|
|
### Was wird geblockt?
|
|
|
|
- ✅ Alle IPs außerhalb der gewählten Region
|
|
- ✅ Auf PHP-Ebene: Sofortiger 403 Response
|
|
- ✅ Auf Firewall-Ebene (nur PHP+CrowdSec): Alle Ports
|
|
|
|
### Was wird NICHT geblockt?
|
|
|
|
- ✅ Alle IPs aus der gewählten Region
|
|
- ✅ Private IPs (192.168.x.x, 10.x.x.x, etc.)
|
|
- ✅ Localhost (127.0.0.1)
|
|
- ✅ Bei Cache-Fehlern: Alle IPs (Fail-Open)
|
|
|
|
### Fail-Open vs. Fail-Closed
|
|
|
|
| Strategie | Verhalten bei Cache-Fehler | Risiko |
|
|
|-----------|---------------------------|--------|
|
|
| **Fail-Open** ✅ | Traffic durchlassen | Kurzzeitig kein Schutz |
|
|
| Fail-Closed ❌ | Alles blockieren | Totaler Lockout möglich |
|
|
|
|
**Wir nutzen Fail-Open** - lieber kurzzeitig keinen Schutz als alle Kunden aussperren!
|
|
|
|
## 🐛 Troubleshooting
|
|
|
|
### Shop zeigt 403 für ALLE Besucher
|
|
|
|
**Mögliche Ursache**: Korrupter Cache
|
|
|
|
```bash
|
|
# Cache prüfen
|
|
php -r 'var_dump(unserialize(file_get_contents("/var/www/vhosts/SHOP/httpdocs/geoip_ip_ranges.cache")));'
|
|
|
|
# Cache löschen (regeneriert automatisch)
|
|
rm /var/www/vhosts/SHOP/httpdocs/geoip_ip_ranges.cache
|
|
|
|
# Oder: Blocking deaktivieren
|
|
python3 geoip_shop_blocker.py # Option 2
|
|
```
|
|
|
|
### Cache-Generierung schlägt fehl
|
|
|
|
**Mögliche Ursachen:**
|
|
1. Keine Internet-Verbindung zu ipdeny.com
|
|
2. Timeout bei vielen Ländern (Eurozone)
|
|
3. ipdeny.com temporär nicht erreichbar
|
|
|
|
```bash
|
|
# Manuell testen
|
|
curl -v https://www.ipdeny.com/ipblocks/data/aggregated/de-aggregated.zone | head -20
|
|
```
|
|
|
|
### Shop zeigt 500 Error
|
|
|
|
```bash
|
|
# PHP-Fehler-Log prüfen
|
|
tail -50 /var/www/vhosts/SHOP/logs/error_log
|
|
|
|
# Original wiederherstellen
|
|
cd /var/www/vhosts/SHOP/httpdocs
|
|
mv index.php.geoip_backup index.php
|
|
rm geoip_blocking.php geoip_ip_ranges.cache
|
|
```
|
|
|
|
### Watcher-Service läuft nicht
|
|
|
|
```bash
|
|
# Status prüfen
|
|
systemctl status geoip-crowdsec-watcher.service
|
|
|
|
# Logs prüfen
|
|
journalctl -u geoip-crowdsec-watcher.service -n 100
|
|
|
|
# Service neu starten
|
|
systemctl restart geoip-crowdsec-watcher.service
|
|
```
|
|
|
|
## 🌐 CDN/Reverse-Proxy Hinweise
|
|
|
|
### Problem bei CDN-Nutzung
|
|
|
|
```
|
|
Client (202.8.43.232) → CDN (85.131.143.x) → Dein Server
|
|
↓
|
|
iptables sieht nur CDN-IP!
|
|
```
|
|
|
|
### Lösung: PHP-only Modus
|
|
|
|
Das PHP-Script liest die echte IP - funktioniert auch hinter CDN/Proxy.
|
|
|
|
**Empfehlung für CDN-Nutzer:** Wähle **[2] Nur PHP** bei der Aktivierung.
|
|
|
|
### Link11 Erkennung
|
|
|
|
Das Script erkennt automatisch ob ein Shop hinter Link11 ist:
|
|
- 🟢 Grün = hinter Link11 (IP 128.65.223.106)
|
|
- 🔴 Rot = Direkt erreichbar
|
|
|
|
## 📊 Performance
|
|
|
|
### PHP-Level Blocking
|
|
|
|
| Region | Overhead pro Request | Erster Request | Cache-Dauer |
|
|
|--------|---------------------|----------------|-------------|
|
|
| DACH | ~2-5ms | ~200-400ms | 24h |
|
|
| Eurozone+GB | ~5-10ms | ~800-1200ms | 24h |
|
|
|
|
### Empfohlene Limits
|
|
|
|
| Server | RAM | Max. Shops |
|
|
|--------|-----|------------|
|
|
| Klein | 2 GB | 10 |
|
|
| Mittel | 4-8 GB | 50 |
|
|
| Groß | 16+ GB | Unbegrenzt |
|
|
|
|
## 📝 Changelog
|
|
|
|
### v3.1.0 (Dezember 2025)
|
|
- ✅ **Cache-Validierung** bei Aktivierung
|
|
- ✅ **Fail-Open** bei Cache-Fehlern
|
|
- ✅ **Selbstheilender Cache** (automatische Regeneration)
|
|
- ✅ Mindest-Range-Prüfung pro Region (DACH: 1000, Eurozone: 5000)
|
|
|
|
### v3.0.0
|
|
- ✅ **Eurozone+GB Region** (22 Länder)
|
|
- ✅ Region-Icons in Status/Logs
|
|
- ✅ Dynamische PHP-Länder-Arrays
|
|
- ✅ Bot-Erkennung in Logs
|
|
- ✅ Link11-Erkennung (farbige Anzeige)
|
|
- ✅ req/min Statistiken
|
|
|
|
### v2.2.0
|
|
- ✅ Modus-Auswahl (PHP+CrowdSec oder Nur PHP)
|
|
- ✅ Top 100 blockierte IPs in Gesamtübersicht
|
|
|
|
### v2.1.0
|
|
- ✅ Bulk-Operationen (alle aktivieren/deaktivieren)
|
|
- ✅ Gesamtübersicht in Logs
|
|
|
|
### v2.0.0
|
|
- ✅ DACH-Support (DE, AT, CH)
|
|
- ✅ CrowdSec-Integration
|
|
- ✅ Systemd-Service
|
|
|
|
## ⚠️ Wichtige Hinweise
|
|
|
|
### Rechtliches
|
|
|
|
- **DSGVO**: IP-Adressen werden nur temporär geloggt (72h)
|
|
- **Geoblocking**: Kann gegen EU-Verordnungen verstoßen bei B2C-Geschäften
|
|
- **Haftung**: Nur für technische Notfälle/DDoS-Abwehr empfohlen
|
|
|
|
### Empfehlungen
|
|
|
|
- ✅ Nur temporär nutzen (Notfälle, Angriffe)
|
|
- ✅ Nicht als permanente Lösung
|
|
- ✅ Bei CDN: PHP-only Modus verwenden
|
|
- ✅ Regelmäßig Status/Cache prüfen
|
|
|
|
## 📄 Lizenz
|
|
|
|
MIT License
|
|
|
|
## 🙏 Credits
|
|
|
|
- **IP-Ranges**: [ipdeny.com](https://www.ipdeny.com/) (RIPE-basiert)
|
|
- **CrowdSec**: [crowdsec.net](https://www.crowdsec.net/)
|
|
|
|
---
|
|
|
|
**Version**: 3.1.0
|
|
**Status**: Production Ready ✅
|
|
**Regionen**: 🇩🇪🇦🇹🇨🇭 DACH | 🇪🇺 Eurozone+GB (22 Länder)
|
|
**Features**: Cache-Validierung 🛡️ | Fail-Open 🔓 | Bot-Erkennung 🤖 |