16 KiB
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.phpdes 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:
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)
# 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:
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
# 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
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)
- Script starten:
python3 geoip_shop_manager.py - Option
[1] Aktivieren (einzeln)wählen - Shop aus der Liste auswählen
- Modus wählen (1-4)
- Region wählen (nur bei GeoIP-Modi)
- Bestätigen mit
ja
Was passiert (GeoIP + CrowdSec Modus):
- Bei ERSTEM Shop: Systemd-Service wird installiert und gestartet
- Backup der
index.phpwird erstellt geoip_blocking.phpwird 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.phpwird erstellt geoip_blocking.phpmit 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:
expiry = datetime.now() + timedelta(hours=72) # Hier ändern
Bot-Patterns anpassen
Im Python-Script unter BOT_PATTERNS:
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:
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-ForHeader - 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:
tail -f /var/www/vhosts/SHOP/httpdocs/geoip_blocked.log
Shop zeigt 500 Error
# 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)