Files
geoip_shop_manager/README.md
2025-12-09 12:37:12 +01:00

508 lines
16 KiB
Markdown
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# GeoIP Shop Blocker Manager - DACH & Eurozone Version
**Hybrid-System für temporäres GeoIP-Blocking und Bot-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 gewählten Region zu sperren oder nur bekannte Bots/Crawler zu blockieren. Es kombiniert PHP-Level-Blocking mit optionaler CrowdSec Firewall-Integration für maximalen Schutz.
## 🎯 Features
### Geo-Regionen
-**DACH-Region**: Deutschland (DE), Österreich (AT), Schweiz (CH) - 3 Länder
-**Eurozone+GB**: 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)
### Blocking-Modi
-**GeoIP + CrowdSec** 🛡️: Geo-Blocking mit Firewall-Integration
-**Nur GeoIP** 📝: Geo-Blocking ohne CrowdSec (ideal für CDN)
-**Bot-Block + CrowdSec** 🤖🛡️: Nur Bots blockieren, Shop weltweit erreichbar
-**Nur Bot-Block** 🤖: Nur Bots blockieren, ohne CrowdSec
### Allgemein
-**30+ Bot-Patterns**: GPTBot, ClaudeBot, Googlebot, AhrefsBot, SemrushBot, etc.
-**Präzises Blocking**: PHP prüft gegen vollständige IP-Ranges (keine Fehlblockierungen)
-**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 50 IPs)
-**Bot-Statistiken**: Auswertung welche Bots wie oft geblockt wurden
-**Auto-Deaktivierung**: Blocking läuft nach 72 Stunden automatisch ab
-**Fail-Open**: Bei Cache-Fehlern wird Traffic durchgelassen (kein Lockout)
-**Cache-Validierung**: IP-Ranges werden vor Aktivierung validiert
-**Link11-Erkennung**: Zeigt an ob Shop hinter Link11 CDN steht
-**Systemd-Service**: Automatischer Start beim Booten
-**Sauberes Cleanup**: Vollständige Deinstallation bei Deaktivierung
-**Plesk-kompatibel**: Funktioniert mit Plesk-verwalteten Shops
-**CDN-kompatibel**: PHP-only Modi für Link11, Cloudflare & Co.
## 🏗️ Architektur
### Modus 1: GeoIP + CrowdSec 🛡️
#### Komponente 1: PHP-Script
- Wird in die `index.php` des Shops integriert
- Lädt IP-Ranges der gewählten Region von ipdeny.com
- Prüft jede Anfrage gegen diese Ranges
- Blockt Nicht-Region-IPs sofort mit HTTP 403
- Schreibt blockierte IPs in Queue-Datei für CrowdSec
#### 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 GeoIP 📝
- Nur das PHP-Script wird aktiviert
- Keine CrowdSec-Synchronisation
- Kein Watcher-Service nötig
- **Ideal für Server hinter CDN/Proxy** (Link11, Cloudflare, etc.)
### Modus 3: Bot-Block + CrowdSec 🤖🛡️
- Blockiert nur bekannte Bots/Crawler anhand des User-Agents
- Shop bleibt **weltweit für normale Besucher erreichbar**
- Blockierte Bot-IPs werden an CrowdSec gemeldet
- Kein IP-Range-Cache nötig (schnelle Aktivierung)
### Modus 4: Nur Bot-Block 🤖
- Blockiert nur bekannte Bots/Crawler
- Keine CrowdSec-Synchronisation
- **Ideal für Bot-Schutz ohne Geo-Einschränkungen**
> **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 sind die **PHP-only Modi** (📝 oder 🤖) die bessere Wahl.
## 🤖 Blockierte Bots
Das Script blockiert über 30 bekannte Bots und Crawler:
| Kategorie | Bots |
|-----------|------|
| **AI-Crawler** | GPTBot, OAI-SearchBot, ChatGPT-User, ClaudeBot, Claude-User, anthropic-ai, PerplexityBot |
| **Suchmaschinen** | Googlebot, Google-Extended, AdsBot-Google, Bingbot, BingPreview, msnbot, DuckDuckBot, YandexBot, Baiduspider |
| **SEO-Tools** | AhrefsBot, SemrushBot, MJ12bot, DotBot, PetalBot, DataForSeoBot |
| **Social Media** | FacebookBot, LinkedInBot, Twitterbot, Slackbot |
| **Andere** | Applebot, Amazonbot, Bytespider, UptimeRobot, Pingdom, curl, python-requests, Wget, Scrapy |
### Eigene Bots hinzufügen
Im Script unter `BOT_PATTERNS` können eigene Patterns ergänzt werden:
```python
BOT_PATTERNS = {
# ... bestehende ...
'MeinBot': r'MeinBot', # Einfacher Match
'Scraper123': r'[Ss]craper-?\d+', # Mit Regex
'BadCrawler': r'BadCrawler|EvilBot', # Mehrere Varianten
}
```
## 📋 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 +CrowdSec Modi)
- **CrowdSec Firewall Bouncer**: Installiert und konfiguriert (nur für +CrowdSec Modi)
- **Plesk**: Optional, aber empfohlen
- **Root-Zugriff**: Erforderlich für Installation und Verwaltung
### CrowdSec Installation prüfen (nur für +CrowdSec Modi)
```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_manager.py
chmod +x geoip_shop_manager.py
```
### 2. Script ausführen
```bash
python3 geoip_shop_manager.py
```
Das war's! Das Script ist vollständig selbstverwaltend.
## 📖 Verwendung
### Hauptmenü
```
============================================================
GeoIP Shop Blocker Manager v3.2.0
🇩🇪🇦🇹🇨🇭 DACH | 🇪🇺 Eurozone+GB | 🤖 Bot-Only
🛡️ 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
```
### Blocking-Modus wählen
Bei jeder Aktivierung (einzeln oder alle) wird nach dem Modus gefragt:
```
🔧 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]:
```
### Geo-Region wählen (nur bei GeoIP-Modi)
```
🌍 Wähle die Geo-Region:
[1] 🇩🇪🇦🇹🇨🇭 DACH - Deutschland, Österreich, Schweiz
[2] 🇪🇺 Eurozone+GB - 22 Länder
Region wählen [1/2]:
```
**Wann welchen Modus wählen?**
| Situation | Empfohlener Modus |
|-----------|-------------------|
| DDoS-Angriff aus Übersee | GeoIP + CrowdSec 🛡️ |
| Server hinter CDN (Link11, Cloudflare) | Nur GeoIP 📝 |
| Nur Bots/Crawler blocken | Nur Bot-Block 🤖 |
| Bot-Schutz + Firewall-Bans | Bot-Block + CrowdSec 🤖🛡️ |
| CrowdSec nicht installiert | Nur GeoIP 📝 oder Nur Bot-Block 🤖 |
| Maximaler Schutz (alle Ports) | GeoIP + CrowdSec 🛡️ |
### Blocking aktivieren (einzelner Shop)
1. Script starten: `python3 geoip_shop_manager.py`
2. Option `[1] Aktivieren (einzeln)` wählen
3. Shop aus der Liste auswählen
4. **Modus wählen** (1-4)
5. **Region wählen** (nur bei GeoIP-Modi)
6. Bestätigen mit `ja`
**Was passiert (GeoIP + CrowdSec Modus):**
- Bei ERSTEM Shop: Systemd-Service wird installiert und gestartet
- Backup der `index.php` wird erstellt
- `geoip_blocking.php` wird erstellt und eingebunden
- IP-Range-Cache wird generiert und validiert
- Shop wird für Tracking registriert
- Blocking ist sofort aktiv
**Was passiert (Bot-Only Modus):**
- Backup der `index.php` wird erstellt
- `geoip_blocking.php` mit Bot-Patterns wird erstellt
- Kein Cache nötig (sofort aktiv)
- 30+ Bot-Patterns werden geprüft
### Logs anzeigen
Option `[3] Logs anzeigen` zeigt:
```
📋 Logs für:
[0] 📊 ALLE
[1] shop1.example.com 🇩🇪🇦🇹🇨🇭 🛡️
[2] shop2.example.com 🇪🇺 📝
[3] shop3.example.com 🤖 🤖🛡️
```
#### Gesamtübersicht (Option 0)
```
══════════════════════════════════════════════════════════════════════
📊 GESAMTÜBERSICHT ALLER SHOPS
══════════════════════════════════════════════════════════════════════
Grün = hinter Link11 | Rot = Direkt
📝 Blocks gesamt: 1.247 (⌀ 2.3 req/min, Laufzeit: 8h 32m)
├─ shop1.example.com 🇩🇪🇦🇹🇨🇭 🛡️: 523 (1.2 req/min, seit 8h 32m) ████████
│ └─➤ Top: 185.220.101.34 (AhrefsBot) - 127x, 0.2 req/min
├─ shop2.example.com 🇪🇺 📝: 412 (0.8 req/min, seit 8h 30m) ██████
│ └─➤ Top: 45.95.169.22 (SemrushBot) - 89x, 0.2 req/min
└─ shop3.example.com 🤖 🤖🛡️: 312 (0.6 req/min, seit 8h 28m) █████
└─➤ Top: 194.26.192.64 (GPTBot) - 67x, 0.1 req/min
🛡️ CrowdSec-Bans gesamt: 892
├─ shop1.example.com 🇩🇪🇦🇹🇨🇭 🛡️: 401 ████████
└─ shop3.example.com 🤖 🤖🛡️: 193 ███
🤖 Bot-Statistik (alle Shops):
AhrefsBot: 234x ██████████████████████████
SemrushBot: 189x █████████████████████
GPTBot: 156x █████████████████
ClaudeBot: 98x ███████████
Googlebot: 67x ███████
...
🔥 Top 50 blockierte IPs (alle Shops):
185.220.101.34 (AhrefsBot): 127 (0.2 req/min) → shop1.example.com [127x] █████████████
45.95.169.22 (SemrushBot): 89 (0.2 req/min) → shop2.example.com [89x] █████████
...
══════════════════════════════════════════════════════════════════════
```
### Status prüfen
Option `[4] Status` zeigt:
```
📊 3/15 Shops aktiv
shop1.example.com [Link11] 🇩🇪🇦🇹🇨🇭 🛡️
523 blocks, 8h 32m, Cache: ✅12.847
shop2.example.com [Direkt] 🇪🇺 📝
412 blocks, 8h 30m, Cache: ✅48.392
shop3.example.com [Link11] 🤖 🤖🛡️
312 blocks, 8h 28m, 30 Bot-Patterns
```
## 📁 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 (nur GeoIP-Modi) |
| `geoip_blocked.log` | Log der PHP-Level Blocks |
| `geoip_crowdsec_queue.log` | Queue für CrowdSec (nur +CrowdSec Modi) |
### 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 |
## ⚙️ Konfiguration
### Blocking-Dauer ändern
Standardmäßig 72 Stunden. Zum Ändern editiere das Python-Script:
```python
expiry = datetime.now() + timedelta(hours=72) # Hier ändern
```
### Bot-Patterns anpassen
Im Python-Script unter `BOT_PATTERNS`:
```python
BOT_PATTERNS = {
'GPTBot': r'GPTBot',
'ClaudeBot': r'ClaudeBot',
# Eigene hinzufügen:
'MeinBot': r'MeinBot',
}
```
**Regex-Elemente:**
- `|` ODER (z.B. `r'Bot1|Bot2'`)
- `^` Anfang des Strings
- `$` Ende des Strings
- `\d+` Eine oder mehr Ziffern
- `.*` Beliebige Zeichen
- `[Aa]` A oder a
- `-?` Bindestrich optional
### Minimum IP-Ranges anpassen
Für Cache-Validierung:
```python
MIN_RANGES = {
"dach": 1000, # DE+AT+CH mindestens 1000 Ranges
"eurozone": 5000 # 22 Länder mindestens 5000 Ranges
}
```
## 🛡️ Sicherheit
### Fail-Open Mechanismus
Bei Problemen mit dem IP-Range-Cache wird Traffic **nicht** blockiert:
- Verhindert Lockouts bei Cache-Fehlern
- Loggt Warnung im PHP-Error-Log
- Cache wird beim nächsten Request neu generiert
### Cache-Validierung
Vor Aktivierung wird geprüft:
- Mindestanzahl IP-Ranges vorhanden
- Cache-Datei nicht korrupt
- Alle Länder erfolgreich geladen
### Link11-Erkennung
Das Script erkennt automatisch ob ein Shop hinter Link11 CDN steht:
- **Grün [Link11]**: Shop ist geschützt, PHP-only Modi empfohlen
- **Rot [Direkt]**: Direkter Zugriff, alle Modi möglich
## 🌐 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
Verwende **PHP-only Modi** (📝 oder 🤖):
- PHP liest echte IP aus `X-Forwarded-For` Header
- Funktioniert auch hinter CDN/Proxy
- Kein unnötiger CrowdSec-Overhead
## 🐛 Troubleshooting
### Cache-Warnung bei Aktivierung
```
⚠️ Cache-Generierung: Nur 847 Ranges (min. 1000 erwartet)
Fail-Open aktiv - Cache wird beim ersten Request neu generiert
```
**Ursache**: ipdeny.com temporär nicht erreichbar
**Lösung**: Cache wird automatisch beim ersten Request neu generiert. Fail-Open verhindert Blockierungen.
### Bot wird nicht erkannt
**Prüfen**: User-Agent im Log anschauen und Pattern ergänzen:
```bash
tail -f /var/www/vhosts/SHOP/httpdocs/geoip_blocked.log
```
### Shop zeigt 500 Error
```bash
# Prüfe PHP-Fehler-Log
tail -50 /var/www/vhosts/SHOP/logs/error_log
# Stelle Original-Index wieder her
cd /var/www/vhosts/SHOP/httpdocs
mv index.php.geoip_backup index.php
```
## 📊 Performance
### GeoIP-Modi
| Metrik | Wert |
|--------|------|
| Overhead pro Request | ~2-8ms (bei gecachten IP-Ranges) |
| Erster Request | ~400-800ms (Download IP-Ranges) |
| Cache-Dauer | 24 Stunden |
| RAM pro Shop | ~5-10 MB |
### Bot-Only Modi
| Metrik | Wert |
|--------|------|
| Overhead pro Request | ~0.5-2ms (nur Regex-Match) |
| Kein Cache nötig | Sofort aktiv |
| RAM pro Shop | ~1-2 MB |
## 📝 Changelog
### v3.2.0
- **NEU**: Bot-Only Modus (🤖) - blockiert nur Bots, Shop weltweit erreichbar
- **NEU**: Bot-Block + CrowdSec Modus (🤖🛡️)
- **NEU**: 30+ Bot-Patterns (GPTBot, ClaudeBot, AhrefsBot, etc.)
- **NEU**: Bot-Statistiken in Logs und Gesamtübersicht
- **NEU**: 4 Modi statt 2 bei Aktivierung wählbar
- Geo-Region-Auswahl entfällt bei Bot-Only Modi
### v3.1.0
- **NEU**: Cache-Validierung vor Aktivierung
- **NEU**: Fail-Open Mechanismus (kein Lockout bei Cache-Fehlern)
- **NEU**: Minimum IP-Range Prüfung pro Region
- Verbesserte Fehlerbehandlung
### v3.0.0
- **NEU**: Eurozone+GB Region (22 Länder)
- **NEU**: Region-Auswahl bei Aktivierung
- **NEU**: Link11-Erkennung mit farbiger Anzeige
- **NEU**: req/min Statistiken in Logs
- **NEU**: Top-IP pro Shop in Gesamtübersicht
### v2.2.0
- Modus-Auswahl bei Aktivierung (PHP+CrowdSec 🛡️ oder Nur PHP 📝)
- PHP-only Modus für Server hinter CDN/Reverse-Proxy
- Top 100 blockierte IPs in Gesamtübersicht
### v2.1.0
- Bulk-Operationen (alle aktivieren/deaktivieren)
- Gesamtübersicht in Logs
- Visuelle Balken in Statistiken
### v2.0.0
- DACH-Support (DE, AT, CH)
- Systemd-Service für Watcher
- CrowdSec-Integration
- Multi-Shop-Management
---
**Version**: 3.2.0
**Letztes Update**: Dezember 2025
**Status**: Production Ready ✅
**Modi:**
- 🛡️ GeoIP + CrowdSec
- 📝 Nur GeoIP
- 🤖🛡️ Bot-Block + CrowdSec
- 🤖 Nur Bot-Block
**Regionen:**
- 🇩🇪🇦🇹🇨🇭 DACH (3 Länder)
- 🇪🇺 Eurozone+GB (22 Länder)