Files
geoip_shop_manager/README.md
2025-12-09 10:41:45 +01:00

31 KiB

GeoIP Shop Blocker Manager

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 der gewählten Region zu sperren. Es kombiniert PHP-Level-Blocking mit optionaler CrowdSec Firewall-Integration für maximalen Schutz.

🎯 Features

  • Zwei Geo-Regionen wählbar:
    • 🇩🇪🇦🇹🇨🇭 DACH: Deutschland, Österreich, Schweiz (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)
  • Präzises Blocking: PHP prüft gegen vollständige IP-Ranges (keine Fehlblockierungen)
  • Flexibler Modus: Wahl zwischen "PHP + CrowdSec" oder "Nur PHP"
  • 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)
  • 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.
  • Link11-Erkennung: Automatische Anzeige ob Shop hinter Link11 steht

🌍 Verfügbare Geo-Regionen

🇩🇪🇦🇹🇨🇭 DACH (3 Länder)

Code Land
DE Deutschland
AT Österreich
CH Schweiz

🇪🇺 Eurozone + GB (22 Länder)

Code Land Code Land
DE Deutschland IT Italien
AT Österreich LT Litauen
CH Schweiz LU Luxemburg
BE Belgien LV Lettland
CY Zypern MT Malta
EE Estland NL Niederlande
ES Spanien PT Portugal
FI Finnland SI Slowenien
FR Frankreich SK Slowakei
GB Großbritannien GR Griechenland
HR Kroatien IE Irland

🏗️ Architektur

Modus 1: PHP + 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-Regions-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 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)

# 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
  Regionen: 🇩🇪🇦🇹🇨🇭 DACH | 🇪🇺 Eurozone+GB (22 Länder)
  PHP + CrowdSec Watcher (systemd service)
══════════════════════════════════════════════════════════════
  ✅ CrowdSec: Aktiv
  ✅ Watcher-Service: Läuft

────────────────────────────────────────
[1] GeoIP-Blocking AKTIVIEREN (einzeln)
[2] GeoIP-Blocking DEAKTIVIEREN (einzeln)
[3] Logs anzeigen
[4] Status anzeigen
────────────────────────────────────────
[5] 🚀 ALLE Shops aktivieren
[6] 🛑 ALLE Shops deaktivieren
────────────────────────────────────────
[0] Beenden

Geo-Region wählen

Bei jeder Aktivierung (einzeln oder alle) 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

Nach der Region wird der Modus abgefragt:

🔧 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 welche Kombination wählen?

Situation Region Modus
DE/AT/CH Shop, Server direkt DACH PHP + CrowdSec 🛡️
DE/AT/CH Shop, hinter CDN DACH Nur PHP 📝
EU-weiter Shop, Server direkt Eurozone+GB PHP + CrowdSec 🛡️
EU-weiter Shop, hinter CDN Eurozone+GB Nur PHP 📝
Maximaler Schutz (nur DACH) DACH PHP + CrowdSec 🛡️
Weniger restriktiv (EU-weit) Eurozone+GB Nur PHP 📝

Blocking aktivieren (einzelner Shop)

  1. Script starten: python3 geoip_shop_manager.py
  2. Option [1] GeoIP-Blocking AKTIVIEREN (einzeln) wählen
  3. Shop aus der Liste auswählen
  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/3] Installiere CrowdSec-Watcher-Service...
  ✅ Watcher-Script erstellt: /usr/local/bin/geoip_crowdsec_watcher.py
  ✅ Systemd-Service erstellt: /etc/systemd/system/geoip-crowdsec-watcher.service
  ✅ Service gestartet und läuft

[2/3] Aktiviere PHP-Blocking...
  📋 Backup erstellen...
  ✏️  index.php modifiziert
  📝 geoip_blocking.php erstellt

[3/3] Registriere Shop...
  ✅ Shop registriert

════════════════════════════════════════════════════════════════
✅ 🇪🇺 Eurozone + GB GeoIP-Blocking aktiviert für: shop.example.com
   Erlaubte Länder: 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 🛡️
   Gültig bis: 2025-12-12 14:30:00 CET
   PHP-Log: /var/www/vhosts/shop.example.com/httpdocs/geoip_blocked.log
   CrowdSec-Queue: /var/www/vhosts/shop.example.com/httpdocs/geoip_crowdsec_queue.log

   🔄 Der Watcher-Service synchronisiert blockierte IPs zu CrowdSec
════════════════════════════════════════════════════════════════

Blocking für ALLE Shops aktivieren

  1. Script starten: python3 geoip_shop_manager.py
  2. Option [5] 🚀 ALLE Shops 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

Beispielausgabe:

══════════════════════════════════════════════════════════════
  GeoIP-Blocking für ALLE Shops aktivieren
══════════════════════════════════════════════════════════════

📋 Folgende 5 Shop(s) werden aktiviert:
   Grün = hinter Link11 | Rot = Direkt

   • shop1.example.com [Link11]
   • shop2.example.com [Direkt]
   • shop3.example.com [Link11]
   ...

🌍 Wähle die Geo-Region:
   [1] 🇩🇪🇦🇹🇨🇭 DACH - Deutschland, Österreich, Schweiz
   [2] 🇪🇺 Eurozone+GB - 22 Länder

Region wählen [1/2]: 2

🔧 Wähle den Blocking-Modus:
   [1] PHP + CrowdSec (IPs werden an CrowdSec gemeldet)
   [2] Nur PHP (keine CrowdSec-Synchronisation)

Modus wählen [1/2]: 2

⚠️  Dies aktiviert den Schutz für alle oben genannten Shops!
   Region: 🇪🇺 Eurozone + GB
   Modus: Nur PHP 📝

Fortfahren? (ja/nein): ja

══════════════════════════════════════════════════════════════
  Starte Aktivierung (🇪🇺 Eurozone + GB, Nur PHP 📝)...
══════════════════════════════════════════════════════════════

[1/5] Aktiviere: shop1.example.com
   ✅ Aktiviert (bis 2025-12-12 14:30)
...

══════════════════════════════════════════════════════════════
  ZUSAMMENFASSUNG
══════════════════════════════════════════════════════════════

   ✅ Erfolgreich aktiviert: 5
   ❌ Fehlgeschlagen: 0

   🇪🇺 Region: Eurozone + GB
   🔧 Modus: Nur PHP 📝
   ⏰ Gültig für 72 Stunden
══════════════════════════════════════════════════════════════

Blocking deaktivieren (einzelner Shop)

  1. Script starten: python3 geoip_shop_manager.py
  2. Option [2] GeoIP-Blocking DEAKTIVIEREN (einzeln) wählen
  3. Shop aus der Liste auswählen (zeigt Region und Modus an)
  4. Bestätigen mit ja

Shop-Liste zeigt alle relevanten Infos:

📋 Aktive Shops:
   Grün = hinter Link11 | Rot = Direkt
  [1] shop1.example.com [Link11] 🇪🇺 🛡️
  [2] shop2.example.com [Direkt] 🇩🇪🇦🇹🇨🇭 📝
  [3] shop3.example.com [Link11] 🇪🇺 📝

Was passiert:

  • Original index.php wird wiederhergestellt
  • Alle PHP-Dateien werden gelöscht
  • Bei PHP+CrowdSec Modus: Alle CrowdSec-Decisions werden entfernt
  • Shop wird deregistriert
  • Bei LETZTEM Shop mit CrowdSec: Systemd-Service wird deinstalliert

Blocking für ALLE Shops deaktivieren

  1. Script starten: python3 geoip_shop_manager.py
  2. Option [6] 🛑 ALLE Shops deaktivieren wählen
  3. Liste der aktiven Shops wird angezeigt (mit Region-Icons)
  4. Bestätigen mit ja

Logs anzeigen

  1. Script starten: python3 geoip_shop_manager.py
  2. Option [3] Logs anzeigen wählen
  3. Auswahl treffen:
📋 Logs anzeigen für:
   Grün = hinter Link11 | Rot = Direkt
  [0] 📊 ALLE Shops (Zusammenfassung)
  [1] shop1.example.com [Link11] 🇪🇺 🛡️
  [2] shop2.example.com [Direkt] 🇩🇪🇦🇹🇨🇭 📝
  ...

Die Icons zeigen:

  • 🇩🇪🇦🇹🇨🇭 = DACH Region
  • 🇪🇺 = Eurozone+GB Region
  • 🛡️ = PHP + CrowdSec Modus
  • 📝 = Nur PHP Modus

Option [0]: Gesamtübersicht aller Shops

Zeigt eine aggregierte Statistik über alle aktiven Shops:

════════════════════════════════════════════════════════════════════════
  📊 GESAMTÜBERSICHT ALLER SHOPS
════════════════════════════════════════════════════════════════════════
   Grün = hinter Link11 | Rot = Direkt

📝 PHP-Blocks gesamt: 1.247 (⌀ 2.3 req/min, Laufzeit: 9h 12m)
   ├─ shop1.example.com 🇪🇺: 523 (1.2 req/min, seit 9h 12m) ██████████
   │     └─➤ Top: 185.220.101.34 (GPTBot) - 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 45m) ██████
         └─➤ Top: 194.26.192.64 (Unbekannt) - 67x, 0.1 req/min

🛡️  CrowdSec-Bans gesamt: 892
   ├─ shop1.example.com 🇪🇺: 401 ████████████████
   └─ shop2.example.com 🇩🇪🇦🇹🇨🇭: 298 ███████████

🔥 Top 100 blockierte IPs (alle Shops):
   185.220.101.34 (GPTBot): 127 (0.2 req/min) → shop1.example.com [127x] █████████████████████████
   45.95.169.22 (SemrushBot): 89 (0.2 req/min) → shop2.example.com [89x] █████████████████
   194.26.192.64 (Unbekannt): 67 (0.1 req/min) → shop3.example.com [45x] █████████████
   ...

════════════════════════════════════════════════════════════════════════

Enthält:

  • PHP-Blocks pro Shop mit Geo-Region-Icon, req/min und Top-IP
  • CrowdSec-Bans pro Shop (nur für PHP+CrowdSec Shops)
  • Top 100 der am häufigsten blockierten IPs über alle Shops hinweg
  • Bot-Erkennung (GPTBot, SemrushBot, Googlebot, etc.)

Option [1-n]: Einzelner Shop

Zeigt detaillierte Logs für einen spezifischen Shop:

════════════════════════════════════════════════════════════════════════
📊 Logs für shop1.example.com
   🇪🇺 Eurozone + GB | PHP + CrowdSec 🛡️
════════════════════════════════════════════════════════════════════════

⏱️  Aktiviert: 2025-12-09 05:18:00
⏱️  Laufzeit: 9h 12m
📈 Blocks: 523 (1.2 req/min)

📝 Letzte 50 PHP-Blocks:
======================================================================
[2025-12-09 14:24:57] IP: 202.8.43.232 | UA: Mozilla/5.0 ... | URI: /produkt-123
...
======================================================================
Gesamt: 523

🔥 Top 20 blockierte IPs:
   185.220.101.34 (GPTBot): 127 (0.2 req/min) █████████████████████████
   45.95.169.22 (SemrushBot): 89 (0.2 req/min) █████████████████
   ...

🛡️  CrowdSec Decisions:
======================================================================
Aktive Bans: 401

Letzte 20 Bans:
  🚫 202.8.43.232 (bis 2025-12-12 14:24:57)
  🚫 45.95.169.22 (bis 2025-12-12 13:30:12)
  ...
======================================================================

Bei PHP-only Shops wird stattdessen angezeigt:

📝 CrowdSec-Synchronisation ist für diesen Shop deaktiviert (PHP-only Modus)

Status prüfen

Option [4] Status anzeigen zeigt:

  • Anzahl verfügbarer Shops
  • Anzahl aktiver Blockings
  • Liste aller Shops mit aktivem Blocking, Region und Modus
📊 Status:
  Shops gesamt: 15
  Aktive GeoIP-Blockings: 5
   Grün = hinter Link11 | Rot = Direkt
    ✓ shop1.example.com [Link11] 🇪🇺 [PHP+CS] 🛡️ - 523 blocks (1.2 req/min, 9h 12m)
    ✓ shop2.example.com [Direkt] 🇩🇪🇦🇹🇨🇭 [PHP] 📝 - 412 blocks (0.8 req/min, 8h 30m)
    ✓ shop3.example.com [Link11] 🇪🇺 [PHP] 📝 - 312 blocks (0.6 req/min, 8h 45m)
    ✓ shop4.example.com [Direkt] 🇩🇪🇦🇹🇨🇭 [PHP+CS] 🛡️ - 201 blocks (0.4 req/min, 8h 15m)
    ✓ shop5.example.com [Link11] 🇪🇺 [PHP] 📝 - 156 blocks (0.3 req/min, 8h 0m)

🔧 Erweiterte Verwendung

Manuell CrowdSec Decisions prüfen

# Alle Decisions anzeigen (mit vollständiger Liste)
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 (Einzeiler)

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"

Firewall-Statistiken prüfen

# 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

# 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

# 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
  • geoip_ip_ranges.cache - Gecachte IP-Ranges der gewählten Region (erneuert alle 24h)
  • geoip_blocked.log - Log der PHP-Level Blocks
  • geoip_crowdsec_queue.log - Queue für CrowdSec-Synchronisation (nur PHP+CrowdSec Modus)

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 (inkl. Modus und Region)

⚙️ Konfiguration

Blocking-Dauer ändern

Standardmäßig 72 Stunden. Zum Ändern editiere das Python-Script:

# Zeile ~400 und ~750
expiry = datetime.now() + timedelta(hours=72)  # Hier ändern

Watcher-Intervall ändern

Standard: 5 Sekunden. Zum Ändern im Watcher-Script:

CHECK_INTERVAL = 5  # In Sekunden

IP-Range-Cache-Dauer ändern

Standard: 24 Stunden. Im PHP-Script:

$cache_duration = 86400; // In Sekunden

Weitere Länder hinzufügen

Um weitere Länder zu einer Region hinzuzufügen, editiere im Python-Script das GEO_REGIONS Dictionary:

GEO_REGIONS = {
    "dach": {
        "name": "DACH",
        "countries": ["de", "at", "ch"],  # Hier Länder hinzufügen
        ...
    },
    "eurozone": {
        "name": "Eurozone + GB",
        "countries": ["de", "at", "ch", "be", ...],  # Hier Länder hinzufügen
        ...
    }
}

Die verfügbaren Ländercodes findest du unter: https://www.ipdeny.com/ipblocks/data/aggregated/

🛡️ 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 (HTTP, HTTPS, SSH, FTP, etc.)

Was wird NICHT geblockt?

  • Alle IPs aus der gewählten Region (basierend auf RIPE/ipdeny.com Daten)
  • Private IPs (192.168.x.x, 10.x.x.x, etc.)
  • Localhost (127.0.0.1)

Fehlblockierungen vermeiden

Das System nutzt die offiziellen IP-Zuweisungen von ipdeny.com:

  • Basiert auf RIPE-Daten
  • Täglich aktualisiert
  • Umfasst alle Provider der Region
  • Präzise CIDR-Prüfung

Risiko für Fehlblockierungen: Minimal

🌐 CDN/Reverse-Proxy Hinweise

Problem bei CDN-Nutzung (Link11, Cloudflare, etc.)

Wenn dein Server hinter einem CDN oder Reverse-Proxy steht:

Client (202.8.43.232) → CDN (85.131.143.x) → Dein Server
                              ↓
                 iptables sieht nur CDN-IP!

Folge: CrowdSec Firewall-Bouncer kann die echte Client-IP nicht blocken, da er nur die CDN-IP sieht.

Lösung: PHP-only Modus

Das PHP-Script liest die echte IP aus dem X-Forwarded-For Header:

  • Funktioniert auch hinter CDN/Proxy
  • Blockt zuverlässig auf Anwendungsebene
  • Kein unnötiger CrowdSec-Overhead

Empfehlung für CDN-Nutzer: Wähle bei der Aktivierung den Modus [2] Nur PHP.

Link11-Erkennung

Das Script erkennt automatisch, ob ein Shop hinter Link11 steht:

  • Grün = Shop löst auf Link11-IP auf (128.65.223.106)
  • Rot = Shop ist direkt erreichbar
📋 Verfügbare Shops:
   Grün = hinter Link11 | Rot = Direkt
  [1] shop1.example.com [Link11]
  [2] shop2.example.com [Direkt]

🐛 Troubleshooting

Shop zeigt 500 Error

Ursache: PHP-Syntax-Fehler oder falsche Einbindung

# 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

# Deaktiviere via Script
python3 geoip_shop_manager.py  # Option 2

Watcher-Service läuft nicht

# 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

CrowdSec Decisions werden nicht erstellt

# Prüfe ob Queue-Datei beschrieben wird
tail -f /var/www/vhosts/SHOP/httpdocs/geoip_crowdsec_queue.log

# Prüfe Watcher-Logs
journalctl -u geoip-crowdsec-watcher.service -f

# Prüfe CrowdSec API
cscli decisions add --ip 1.2.3.4 --duration 1m --type ban --reason "Test"
cscli decisions list | grep "1.2.3.4"
cscli decisions delete --ip 1.2.3.4

Firewall blockt nicht (trotz CrowdSec-Ban)

Mögliche Ursachen:

  1. CDN/Reverse-Proxy aktiv → Wechsle zu PHP-only Modus
  2. Bouncer läuft nicht:
    systemctl status crowdsec-firewall-bouncer
    
  3. iptables-Regeln fehlen:
    iptables -L -n -v | grep crowdsec
    

IPs aus erlaubter Region werden geblockt

Sehr unwahrscheinlich! Aber falls doch:

# Prüfe welche IP-Ranges als erlaubt erkannt werden
cat /var/www/vhosts/SHOP/httpdocs/geoip_ip_ranges.cache

# Lösche Cache (wird neu geladen)
rm /var/www/vhosts/SHOP/httpdocs/geoip_ip_ranges.cache

Migration von der alten DACH-Only Version

Falls du von der alten Version (nur DACH) auf die neue Version mit Regionsauswahl wechselst:

# 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/dach_ip_ranges.cache

# 3. Neue Version verwenden
python3 geoip_shop_manager.py  # Shops wieder aktivieren mit gewünschter Region

📊 Performance

PHP-Level Blocking

  • Overhead pro Request: ~2-8ms (bei gecachten IP-Ranges)
  • Erster Request DACH: ~400-800ms (Download für 3 Länder)
  • Erster Request Eurozone+GB: ~1-2s (Download für 22 Länder)
  • Cache-Dauer: 24 Stunden
  • RAM-Verbrauch DACH: ~5-10 MB pro Shop
  • RAM-Verbrauch Eurozone+GB: ~15-25 MB pro Shop

CrowdSec Firewall Blocking (nur PHP+CrowdSec Modus)

  • 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

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.

IP-Ranges aktualisieren

# Cache löschen (wird automatisch neu geladen)
rm /var/www/vhosts/*/httpdocs/geoip_ip_ranges.cache

Die Ranges werden automatisch alle 24h aktualisiert.

📝 Logs und Monitoring

PHP-Level Logs

# 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

# 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

# Geblockte Pakete zählen
iptables -L -n -v | grep crowdsec-blacklists-5

# Anzahl aktiver Bans
cscli decisions list --limit 0 | 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 erlaubter Region kommt
  3. Region wählen (DACH für DE/AT/CH Shops, Eurozone+GB für EU-weite Shops)
  4. Modus wählen (PHP+CrowdSec für direkte Server, PHP-only für CDN)
  5. Test mit kurzer Dauer (kann im Script angepasst werden)
  6. Monitoring einrichten

Während aktivem Blocking

  1. Logs regelmäßig prüfen (Gesamtübersicht nutzen!)
  2. Auf Fehlblockierungen achten (sehr selten)
  3. CrowdSec-Statistiken beobachten (nur bei PHP+CrowdSec)
  4. Server-Performance monitoren

Nach Deaktivierung

  1. Prüfen ob alle Decisions entfernt wurden (nur bei PHP+CrowdSec)
  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
  • CDN: Bei CDN-Nutzung ist PHP-only Modus empfohlen

Empfehlungen

  • Nur temporär nutzen (Notfälle, Angriffe)
  • Nicht als permanente Lösung
  • Kombinieren mit anderen Security-Maßnahmen
  • Regelmäßig Logs prüfen (Gesamtübersicht für schnellen Überblick)
  • Bei CDN: PHP-only Modus verwenden
  • Region passend zum Shop wählen

🤝 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 (RIPE-basiert)
  • CrowdSec: crowdsec.net
  • Entwickelt für: Plesk-basierte Multi-Shop-Server

📞 Support

Bei Problemen:

  1. Prüfe die Troubleshooting-Sektion
  2. Prüfe die Logs (Gesamtübersicht oder einzeln)
  3. Erstelle ein GitHub Issue mit:
    • Fehlerbeschreibung
    • Relevante Logs
    • System-Infos (OS, PHP-Version, CrowdSec-Version)
    • Gewählte Region (DACH oder Eurozone+GB)
    • Verwendeter Modus (PHP+CrowdSec oder PHP-only)

📚 Weitere Dokumentation


Version: 3.0.0
Letztes Update: Dezember 2025
Status: Production Ready
Verfügbare Regionen: 🇩🇪🇦🇹🇨🇭 DACH (3 Länder) | 🇪🇺 Eurozone+GB (22 Länder)

Changelog

v3.0.0

  • NEU: Geo-Region-Auswahl bei Aktivierung (DACH oder Eurozone+GB)
  • NEU: Eurozone+GB Region mit 22 Ländern (DE, AT, CH, BE, CY, EE, ES, FI, FR, GB, GR, HR, IE, IT, LT, LU, LV, MT, NL, PT, SI, SK)
  • NEU: Geo-Region-Icon in Status, Logs und allen Menüs (🇩🇪🇦🇹🇨🇭 / 🇪🇺)
  • NEU: Pro-Shop Geo-Region-Tracking (verschiedene Shops können verschiedene Regionen haben)
  • Umbenannt von "DACH Version" zu "GeoIP Shop Blocker Manager"
  • Cache-Datei umbenannt von dach_ip_ranges.cache zu geoip_ip_ranges.cache

v2.2.0

  • NEU: Modus-Auswahl bei Aktivierung (PHP+CrowdSec 🛡️ oder Nur PHP 📝)
  • NEU: PHP-only Modus für Server hinter CDN/Reverse-Proxy (Link11, Cloudflare)
  • NEU: Modus-Anzeige in Status, Logs und Deaktivierungs-Menü
  • NEU: Automatische Erkennung ob CrowdSec-Cleanup nötig ist
  • NEU: Top 100 blockierte IPs (statt Top 10) in Gesamtübersicht
  • NEU: Bot-Erkennung (GPTBot, SemrushBot, Googlebot, etc.)
  • NEU: req/min Statistiken und Laufzeit-Anzeige
  • NEU: Link11-Erkennung mit Farbcodierung
  • FIX: CrowdSec Cleanup nutzt jetzt --limit 0 für vollständige Löschung
  • Verbesserte Dokumentation zu CDN/Proxy-Szenarien

v2.1.0

  • NEU: Option [5] - Alle Shops gleichzeitig aktivieren
  • NEU: Option [6] - Alle Shops gleichzeitig deaktivieren
  • NEU: Gesamtübersicht in Logs (Option [0]) mit aggregierten Statistiken
  • NEU: Visuelle Balken in der Statistik-Anzeige
  • Verbessertes Menü-Layout mit Trennlinien

v2.0.0

  • DACH-Support (DE, AT, CH statt nur DE)
  • Systemd-Service für Watcher
  • CrowdSec-Integration
  • Multi-Shop-Management