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

16 KiB
Raw Blame History

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:

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)

  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:

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-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:

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)