# GeoIP Shop Blocker Manager - DACH Version **Hybrid-System für temporäres GeoIP-Blocking auf Plesk-Servern mit mehreren Shops** Dieses Tool ermöglicht es, einzelne 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. ## 🎯 Features - ✅ **DACH-Region erlaubt**: Deutschland (DE), Österreich (AT), Schweiz (CH) - ✅ **Präzises Blocking**: PHP prüft gegen vollständige DACH IP-Ranges (keine Fehlblockierungen) - ✅ **Doppelter Schutz**: PHP-Level + Firewall-Level (CrowdSec) - ✅ **Automatische Synchronisation**: Blockierte IPs werden automatisch an CrowdSec weitergegeben - ✅ **Multi-Shop-Management**: Verwaltung mehrerer Shops auf einem Server - ✅ **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 ## 🏗️ Architektur ### Komponente 1: PHP-Script - Wird in die `index.php` des Shops integriert - Lädt DACH IP-Ranges von ipdeny.com (DE, AT, CH) - Prüft jede Anfrage gegen diese Ranges - Blockt Nicht-DACH-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 ## 📋 Voraussetzungen - **Betriebssystem**: Ubuntu Server (getestet auf 24.04) - **Webserver**: Apache mit mod_rewrite - **PHP**: Version 8.0 oder höher - **Python**: Version 3.8 oder höher - **CrowdSec**: Installiert und aktiv - **CrowdSec Firewall Bouncer**: Installiert und konfiguriert - **Plesk**: Optional, aber empfohlen - **Root-Zugriff**: Erforderlich für Installation und Verwaltung ### CrowdSec Installation prüfen ```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 ### Blocking aktivieren 1. Script starten: `python3 geoip_shop_manager.py` 2. Option `[1] GeoIP-Blocking AKTIVIEREN` wählen 3. Shop aus der Liste auswählen 4. Bestätigen mit `ja` **Was passiert:** - Bei ERSTEM Shop: Systemd-Service wird installiert und gestartet - Backup der `index.php` wird erstellt - `geoip_blocking.php` wird erstellt und eingebunden - Shop wird für Tracking registriert - Blocking ist sofort aktiv - Erlaubt werden nur IPs aus: 🇩🇪 Deutschland, 🇦🇹 Österreich, 🇨🇭 Schweiz ### Blocking deaktivieren 1. Script starten: `python3 geoip_shop_manager.py` 2. Option `[2] GeoIP-Blocking DEAKTIVIEREN` wählen 3. Shop aus der Liste auswählen 4. Bestätigen mit `ja` **Was passiert:** - Original `index.php` wird wiederhergestellt - Alle PHP-Dateien werden gelöscht - Alle CrowdSec-Decisions werden entfernt - Shop wird deregistriert - Bei LETZTEM Shop: Systemd-Service wird deinstalliert ### Logs anzeigen 1. Script starten: `python3 geoip_shop_manager.py` 2. Option `[3] Logs anzeigen` wählen 3. Shop auswählen **Zeigt:** - PHP-Level Blocks (letzte 50 Einträge) - CrowdSec Firewall Bans (letzte 20 mit Ablaufzeit) - Gesamtstatistiken ### Status prüfen Option `[4] Status anzeigen` zeigt: - Anzahl verfügbarer Shops - Anzahl aktiver Blockings - Liste aller Shops mit aktivem Blocking ## 🔧 Erweiterte Verwendung ### Manuell CrowdSec Decisions prüfen ```bash # Alle Decisions anzeigen cscli decisions list # Nur GeoIP-Blocks anzeigen cscli decisions list | grep "GeoIP" # Decisions für einen bestimmten Shop cscli decisions list | grep "uhlig-kakteen.de" ``` ### Firewall-Statistiken prüfen ```bash # Geblockte Pakete in iptables iptables -L -n -v | grep crowdsec # IPs im CrowdSec ipset ipset list crowdsec-blacklists-5 | head -50 # Prüfe ob eine bestimmte IP gebannt ist ipset test crowdsec-blacklists-5 1.2.3.4 ``` ### 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 ``` ### Manuelle IP-Tests ```bash # Eigene IP für 3 Minuten bannen (Test) cscli decisions add --ip DEINE_IP --duration 3m --type ban --reason "Test" # Prüfen ob Ban aktiv ist ipset test crowdsec-blacklists-5 DEINE_IP # Ban manuell entfernen cscli decisions delete --ip DEINE_IP ``` ## 📁 Dateistruktur ### Pro Shop (in `/var/www/vhosts/SHOP/httpdocs/`) - `index.php.geoip_backup` - Backup der Original index.php - `geoip_blocking.php` - PHP-Blocking-Script - `dach_ip_ranges.cache` - Gecachte DACH IP-Ranges (erneuert alle 24h) - `geoip_blocked.log` - Log der PHP-Level Blocks - `geoip_crowdsec_queue.log` - Queue für CrowdSec-Synchronisation ### System-weit - `/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 # Zeile ~400 und ~750 expiry = datetime.now() + timedelta(hours=72) # Hier ändern ``` Und im PHP-Script Template: ```python # Zeile ~30-50 GEOIP_SCRIPT = '''/dev/null done # Prüfen cscli decisions list | grep "GeoIP" ``` ### Migration von der alten DE-Only Version Falls du von der alten Version (nur Deutschland) auf die DACH-Version wechselst: ```bash # 1. Alle aktiven Shops deaktivieren (alte Version) python3 geoip_shop_manager_old.py # Option 2 für jeden Shop # 2. Alte Cache-Dateien löschen rm /var/www/vhosts/*/httpdocs/de_ip_ranges.cache # 3. Neue Version verwenden python3 geoip_shop_manager.py # Shops wieder aktivieren ``` ## 📊 Performance ### PHP-Level Blocking - **Overhead pro Request**: ~2-8ms (bei gecachten IP-Ranges, etwas mehr als DE-only wegen mehr Ranges) - **Erster Request**: ~400-800ms (beim Download der IP-Ranges für 3 Länder) - **Cache-Dauer**: 24 Stunden - **RAM-Verbrauch**: ~5-10 MB pro Shop (mehr Ranges als DE-only) ### CrowdSec Firewall Blocking - **Overhead**: 0ms (blockt vor PHP) - **RAM**: ~20-50 MB (Watcher-Service) - **Geblockte Pakete**: Werden gar nicht erst an Apache weitergeleitet ### Empfohlene Limits - **Kleine Server** (2GB RAM): Bis zu 10 Shops gleichzeitig - **Mittlere Server** (4-8GB RAM): Bis zu 50 Shops - **Große Server** (16GB+ RAM): Unbegrenzt ## 🔄 Updates ### Script aktualisieren ```bash cd /root wget -O geoip_shop_manager.py https://raw.githubusercontent.com/DEIN-REPO/geoip-shop-blocker/main/geoip_shop_manager.py chmod +x geoip_shop_manager.py ``` **WICHTIG**: Bereits aktive Shops bleiben unberührt. Der Watcher-Service muss manuell aktualisiert werden: ```bash # Für aktive Shops: Watcher-Service neu installieren # (Automatisch beim nächsten Aktivieren/Deaktivieren) # ODER manuell: systemctl stop geoip-crowdsec-watcher.service # Script ausführen und einen Shop kurz de-/reaktivieren ``` ### IP-Ranges aktualisieren ```bash # Cache löschen (wird automatisch neu geladen) rm /var/www/vhosts/*/httpdocs/dach_ip_ranges.cache ``` Die Ranges werden automatisch alle 24h aktualisiert. ## 📝 Logs und Monitoring ### PHP-Level Logs ```bash # Blockierte IPs für einen Shop tail -f /var/www/vhosts/SHOP/httpdocs/geoip_blocked.log # Statistik wc -l /var/www/vhosts/SHOP/httpdocs/geoip_blocked.log ``` ### CrowdSec Logs ```bash # Watcher-Service Logs (Echtzeit) journalctl -u geoip-crowdsec-watcher.service -f # CrowdSec-Agent Logs tail -f /var/log/crowdsec.log # Firewall-Bouncer Logs journalctl -u crowdsec-firewall-bouncer.service -f ``` ### Statistiken ```bash # Geblockte Pakete zählen iptables -L -n -v | grep crowdsec-blacklists-5 # Anzahl aktiver Bans cscli decisions list | grep "GeoIP" | wc -l # Top 10 blockierte IPs (PHP-Level) cat /var/www/vhosts/SHOP/httpdocs/geoip_blocked.log | \ grep -oP 'IP: \K[0-9.]+' | sort | uniq -c | sort -rn | head -10 ``` ## 🔐 Best Practices ### Vor Aktivierung 1. ✅ Backup erstellen (macht das Script automatisch) 2. ✅ Sicherstellen, dass Admin-Zugriff aus DACH-Region kommt 3. ✅ Test mit kurzer Dauer (kann im Script angepasst werden) 4. ✅ Monitoring einrichten ### Während aktivem Blocking 1. ✅ Logs regelmäßig prüfen 2. ✅ Auf Fehlblockierungen achten (sehr selten) 3. ✅ CrowdSec-Statistiken beobachten 4. ✅ Server-Performance monitoren ### Nach Deaktivierung 1. ✅ Prüfen ob alle Decisions entfernt wurden 2. ✅ Backup-Dateien können gelöscht werden (optional) 3. ✅ Logs archivieren (falls benötigt) ## ⚠️ 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 ### Technisches - **API-Calls**: Bei vielen aktiven Shops könnten viele IPs in CrowdSec landen - **CrowdSec-Limits**: Kostenloser Tier hat API-Limits - **Netzwerk**: Kein Blocking möglich, wenn Server selbst unter DDoS steht ### Empfehlungen - ✅ Nur temporär nutzen (Notfälle, Angriffe) - ✅ Nicht als permanente Lösung - ✅ Kombinieren mit anderen Security-Maßnahmen - ✅ Regelmäßig Logs prüfen ## 🤝 Contributing Contributions sind willkommen! Bitte: 1. Fork das Repository 2. Erstelle einen Feature-Branch 3. Committe deine Änderungen 4. Push zum Branch 5. Erstelle einen Pull Request ## 📄 Lizenz MIT License - siehe LICENSE Datei ## 🙏 Credits - **IP-Ranges**: [ipdeny.com](https://www.ipdeny.com/) (RIPE-basiert) - **CrowdSec**: [crowdsec.net](https://www.crowdsec.net/) - **Entwickelt für**: Plesk-basierte Multi-Shop-Server ## 📞 Support Bei Problemen: 1. Prüfe die Troubleshooting-Sektion 2. Prüfe die Logs 3. Erstelle ein GitHub Issue mit: - Fehlerbeschreibung - Relevante Logs - System-Infos (OS, PHP-Version, CrowdSec-Version) ## 📚 Weitere Dokumentation - [CrowdSec Dokumentation](https://docs.crowdsec.net/) - [Plesk Dokumentation](https://docs.plesk.com/) - [iptables Tutorial](https://www.netfilter.org/documentation/) - [ipdeny.com Ländercodes](https://www.ipdeny.com/ipblocks/data/aggregated/) --- **Version**: 2.0.0 (DACH) **Letztes Update**: Dezember 2025 **Status**: Production Ready ✅ **Erlaubte Länder**: 🇩🇪 Deutschland | 🇦🇹 Österreich | 🇨🇭 Schweiz