2025-12-16 13:06:42 +01:00
2025-12-16 13:06:42 +01:00

GeoIP Shop Blocker Manager - DACH & Eurozone Version

PHP-basiertes System für temporäres GeoIP-Blocking und Bot-Rate-Limiting auf Plesk-Servern

Dieses Tool ermöglicht es, einzelne oder alle Shops auf einem Plesk-Server temporär für alle Zugriffe außerhalb der konfigurierten Region zu sperren, oder Bots nach Bot-Typ zu rate-limitieren.

🎯 Features

  • Flexible Regionen: DACH (DE, AT, CH) oder Eurozone+GB (22 Länder)
  • Bot-Rate-Limiting nach Bot-Typ: Alle Requests eines Bot-Typs teilen sich EIN Limit
  • Umfangreiche Bot-Erkennung: 321 bekannte Bot-Patterns + 32 generische Fallback-Patterns
  • Präzises Blocking: PHP prüft gegen vollständige IP-Ranges (keine Fehlblockierungen)
  • Zwei Modi: GeoIP-Blocking oder Bot-Rate-Limiting
  • Multi-Shop-Management: Verwaltung mehrerer Shops auf einem Server
  • Bulk-Operationen: Alle Shops gleichzeitig aktivieren/deaktivieren
  • Link11-Erkennung: Automatische Erkennung ob Shop hinter Link11 CDN steht
  • Nur direkte Shops: Option um nur Shops ohne CDN-Schutz zu aktivieren
  • Gesamtübersicht: Logs und Statistiken über alle Shops hinweg
  • Auto-Deaktivierung: Blocking läuft nach 72 Stunden automatisch ab
  • Sauberes Cleanup: Vollständige Deinstallation bei Deaktivierung
  • Plesk-kompatibel: Funktioniert mit Plesk-verwalteten Shops
  • CDN-kompatibel: Funktioniert mit Link11, Cloudflare & Co.
  • Fail-Open: Bei Cache-Fehlern wird Traffic durchgelassen (keine Ausfälle)

🏗️ Architektur

Modus 1: GeoIP-Blocking 🌍

  • PHP-Script wird in die index.php des Shops integriert
  • Lädt IP-Ranges von ipdeny.com (konfigurierte Länder)
  • Prüft jede Anfrage gegen diese Ranges
  • Blockt nicht-erlaubte IPs sofort mit HTTP 403
  • Loggt alle Blocks

Modus 2: Bot-Rate-Limiting 🤖

  • Shop bleibt weltweit erreichbar
  • Erkennt Bots anhand von User-Agent Patterns
  • Rate-Limit gilt PRO BOT-TYP (nicht pro IP!)
  • Alle Googlebot-Requests teilen sich EIN Limit
  • Bei Überschreitung: Gesamter Bot-Typ wird temporär gebannt

🚦 Rate-Limiting (Bot-Only Modus)

Funktionsweise

Bot-Request kommt rein
        │
        ▼
┌───────────────────┐
│ Bot-Typ gebannt?  │──── Ja ───▶ 403 + Exit (sofort)
└───────────────────┘
        │ Nein
        ▼
┌───────────────────┐
│ Bot erkannt?      │──── Nein ──▶ Weiter (normaler Traffic)
└───────────────────┘
        │ Ja
        ▼
┌───────────────────┐
│ Bot-Typ Counter   │
│ erhöhen           │
│ Limit erreicht?   │──── Ja ───▶ Bot-Typ bannen + 403
└───────────────────┘
        │ Nein
        ▼
    Log + Weiter ✅
    (Bot darf durch!)

Wichtig: Rate-Limit pro Bot-Typ

Alle Requests eines Bot-Typs teilen sich EINEN Zähler, unabhängig von:

  • Der IP-Adresse
  • Der genauen User-Agent Variante

Beispiel mit Limit 30 req/min:

Request IP User-Agent Bot-Typ Zähler
1 1.1.1.1 Googlebot/2.1 Googlebot 1/30
2 2.2.2.2 Googlebot/2.1 (+http...) Googlebot 2/30
3 3.3.3.3 Googlebot-Image/1.0 Googlebot-Image 1/30
... ... ... ... ...
31 99.99.99.99 Googlebot/2.1 Googlebot 31/30 → BAN

Nach dem Ban werden ALLE Googlebot-Requests geblockt (egal welche IP).

Konfiguration bei Aktivierung

🚦 Rate-Limit Konfiguration:
   (0 = Bots sofort bannen, kein Rate-Limiting)
   ⚠️  ACHTUNG: Limit gilt pro Bot-TYP, nicht pro IP!
   Requests pro Minute bevor Ban [30]: 
   Ban-Dauer in Minuten [5]: 

   ✅ Rate-Limit: 30 req/min pro Bot-Typ
   ✅ Ban-Dauer: 5 Minuten

Technische Details

  • Identifier: MD5-Hash des erkannten Bot-Namens (z.B. md5("Googlebot"))
  • Speicherung: File-basiert in geoip_ratelimit/ Verzeichnis
  • Ban-Format: timestamp|botname (ermöglicht Anzeige des Bot-Namens)
  • Cleanup: Probabilistisch (1% der Requests) um Overhead zu minimieren
  • Atomare Operationen: File-Locking verhindert Race Conditions

Verzeichnisstruktur

httpdocs/
├── geoip_ratelimit/
│   ├── bans/
│   │   └── {bot_hash}.ban      # Format: unix_timestamp|bot_name
│   └── counts/
│       └── {bot_hash}.count    # Format: window_start|count

🤖 Erkannte Bot-Patterns

Das System erkennt 321 verschiedene Bots in 12 Kategorien, plus 32 generische Fallback-Patterns für unbekannte Bots.

Bot-Kategorien

Kategorie Anzahl Beispiele
AI/LLM Services 61 ChatGPT-User, GPTBot, ClaudeBot, Anthropic, PerplexityBot, Gemini-Deep-Research, Google-NotebookLM, Cohere, MistralAI, DeepSeekBot, Bytespider, HuggingFace, Diffbot, BedrockBot, Firecrawl, Crawl4AI
Suchmaschinen 36 Googlebot, Googlebot-Image/Video/News, Google-Extended, Bingbot, BingPreview, MSNBot, Baiduspider, YandexBot, DuckDuckBot, Applebot, Yahoo Slurp, Sogou, NaverBot, BraveBot, QwantBot, PetalBot
SEO & Marketing 15 AhrefsBot, SemrushBot, MJ12Bot, DotBot, RogerBot, Screaming Frog, BLEXBot, DataForSEOBot, Linkdex, SearchmetricsBot
Social Media 21 FacebookBot, Meta-ExternalAgent, Twitterbot, Instagram, LinkedInBot, Pinterestbot, WhatsApp, TelegramBot, DiscordBot, Slackbot, RedditBot, Snapchat
E-Commerce 15 Amazonbot, Amazon-Kendra, AmazonBuyForMe, Shopify, Idealo, Billiger.de, Guenstiger.de, Ladenzeile, Kelkoo, PriceRunner, PriceGrabber
Archiv & Research 6 Archive.org Bot, Internet Archive, Wayback Machine, Heritrix, Apache Nutch, Common Crawl
Monitoring & Uptime 9 UptimeRobot, Pingdom, StatusCake, Site24x7, NewRelic, Datadog, GTmetrix, PageSpeed Insights, Chrome Lighthouse
Download & Scraper 48 HTTrack, Teleport Pro, WebCopier, SiteSucker, ScrapeBox, Xenu, Grabber, Harvest, Collector, WebZIP, BlackWidow
HTTP Libraries 32 Python-Requests, Python-urllib, cURL, Wget, Go-HTTP-Client, Axios, Node-Fetch, Scrapy, OkHttp, Guzzle, libwww-perl, Mechanize
Security Scanner 11 Nessus, SQLMap, Netsparker, Nikto, Acunetix, Burp Suite, OWASP ZAP, OpenVAS, Nmap, Masscan, WPScan
Headless & Automation 7 PhantomJS, Headless Chrome, Selenium, Puppeteer, Playwright, Cypress
Feed Reader & RSS 5 FeedFetcher, FeedParser, Feedly, Inoreader, NewsBlur
Weitere Bots 55 OmgiliBot, Webzio, Linguee, QuillBot, TurnitinBot, Brandwatch, Meltwater, BitlyBot, Mail.ru Bot, und viele mehr

Generische Fallback-Patterns

Falls ein Bot nicht in der spezifischen Liste ist, wird er trotzdem erkannt wenn sein User-Agent eines dieser Schlüsselwörter enthält:

bot, crawler, spider, scraper, fetch, scan, check, monitor, probe, index, 
archive, capture, reader, download, mirror, ripper, collector, extractor, 
siphon, copier, sucker, bandit, stripper, whacker, reaper, robot, agent, 
seeker, finder, walker, roam, snagger

Diese werden dann als Bot (crawler), Bot (spider), etc. angezeigt.

📋 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
  • Plesk: Optional, aber empfohlen
  • Root-Zugriff: Erforderlich für Installation und Verwaltung

🚀 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 v4.0.0
  🇩🇪🇦🇹🇨🇭 DACH | 🇪🇺 Eurozone+GB | 🤖 Bot-Rate-Limiting
  🛡️  Mit Cache-Validierung und Fail-Open
  🚦 Rate-Limiting nach BOT-TYP (nicht IP)
============================================================

[1] Aktivieren (einzeln)
[2] Deaktivieren (einzeln)
[3] Logs anzeigen
[4] Status
────────────────────────────────────────
[5] 🚀 ALLE aktivieren
[6] 🛑 ALLE deaktivieren
[7] 🎯 Nur DIREKTE aktivieren (ohne Link11)
────────────────────────────────────────
[0] Beenden

Modus-Auswahl

Bei jeder Aktivierung wird nach dem Modus gefragt:

🔧 Wähle den Blocking-Modus:
   [1] 🌍 GeoIP-Blocking (nur erlaubte Regionen)
   [2] 🤖 Bot-Rate-Limiting (weltweit erreichbar, Bots limitiert)

Modus wählen [1/2]: 

Wann welchen Modus wählen?

Situation Empfohlener Modus
Nur bestimmte Länder erlauben GeoIP-Blocking 🌍
Weltweit erreichbar bleiben, nur Bots bremsen Bot-Rate-Limiting 🤖
Aggressive Bots stoppen (verteilt über viele IPs) Bot-Rate-Limiting 🤖

Geo-Region wählen (nur GeoIP-Modus)

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

Region wählen [1/2]: 

Beispielausgabe: Bot-Only Aktivierung

🔧 Aktiviere 🤖 Bot-Only für: shop.example.com
   Modus: Bot-Rate-Limiting nach Bot-Typ (weltweit erreichbar)
   Rate-Limit: 30 req/min pro Bot-Typ, Ban: 5 min
============================================================

[1/3] Aktiviere PHP-Blocking...
  ✅ PHP-Blocking aktiviert

[2/3] Cache-Generierung nicht erforderlich (Bot-Only)

[3/3] Registriere Shop...

============================================================
✅ 🤖 Bot-Only aktiviert
   Shop: shop.example.com
   Modus: Bot-Rate-Limiting 🤖
   🤖 321 Bot-Patterns + 32 generische Patterns
   🚦 Rate-Limit: 30 req/min PRO BOT-TYP
   ⏱️  Ban-Dauer: 5 min
     Alle Googlebot-Requests teilen sich EIN Limit!
   Gültig bis: 2025-12-19 19:30:00 CET
============================================================

Logs anzeigen - Gesamtübersicht

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

🚫 AKTUELL GEBANNTE BOT-TYPEN: AhrefsBot, Bytespider (TikTok/ByteDance), SemrushBot

📝 Log-Einträge gesamt: 1,234 (⌀ 5.2 req/min, Laufzeit: 3h 57m)
   ├─ shop1.example.com 🤖 🤖: 456 (3.8 req/min, seit 2h 0m) ███████
   │     ├─➤ Googlebot: 234x, 1.9 req/min
   │     ├─➤ Bingbot (Microsoft): 123x, 1.0 req/min
   │     └─➤ AhrefsBot: 99x, 0.8 req/min
   ├─ shop2.example.com 🤖 🤖: 778 (6.5 req/min, seit 2h 0m) █████████████
   │     ├─➤ Bytespider (TikTok/ByteDance): 456x, 3.8 req/min
   │     ├─➤ GPTBot (OpenAI): 189x, 1.6 req/min
   │     └─➤ ClaudeBot (Anthropic): 133x, 1.1 req/min

🚫 Rate-Limit Bans: 5 ausgelöst, 3 Bot-Typen aktuell gebannt
   ├─ shop1.example.com: 2 bans (1 Bot-Typen aktiv) █
   │     └─🚫 AhrefsBot
   ├─ shop2.example.com: 3 bans (2 Bot-Typen aktiv) █
   │     └─🚫 Bytespider (TikTok/ByteDance)
   │     └─🚫 SemrushBot

🤖 Bot-Statistik nach Bot-Typ (alle Shops):
   Googlebot: 456x ███████████████████████████████████████
   Bytespider (TikTok/ByteDance): 389x ████████████████████████████████
   Bingbot (Microsoft): 234x ███████████████████
   GPTBot (OpenAI): 189x ███████████████
   ...

Logs anzeigen - Einzelner Shop

══════════════════════════════════════════════════════════════════════
📊 shop.example.com | 🤖 Bot-Only 🤖
══════════════════════════════════════════════════════════════════════
⏱️  Laufzeit: 2h 15m
📈 Log-Einträge: 1,234 (9.1 req/min)
🤖 Bot-Patterns: 321 + 32 generische
🚦 Rate-Limit: 30 req/min PRO BOT-TYP, Ban: 5 min
🚫 Bans: 3 ausgelöst, 2 Bot-Typen aktuell gebannt
   Gebannt: AhrefsBot, Bytespider (TikTok/ByteDance)

🤖 Bot-Statistik (nach Bot-Typ):
   Googlebot: 456x ███████████████████████████████████████
   Bingbot (Microsoft): 234x ███████████████████
   GPTBot (OpenAI): 189x ███████████████
   AhrefsBot: 123x ██████████
   ...

Status anzeigen

📊 5/15 Shops aktiv
   shop1.example.com [Link11] 🇩🇪🇦🇹🇨🇭 🌍
      523 blocks, 1h 41m, Cache: ✅8,234
   shop2.example.com [Direkt] 🤖 🤖
      1,234 log entries, 2h 15m, 321 Patterns, 30 req/min/Bot-Typ, 🚫 AhrefsBot, SemrushBot
   shop3.example.com [Direkt] 🇪🇺 🌍
      312 blocks, 1h 39m, Cache: ✅12,456

🔧 Erweiterte Verwendung

Rate-Limit Dateien prüfen

# Aktive Bans anzeigen (mit Bot-Namen)
for f in /var/www/vhosts/SHOP/httpdocs/geoip_ratelimit/bans/*.ban; do
    [ -f "$f" ] && echo "$(cat $f)"
done

# Request-Counter anzeigen
find /var/www/vhosts/SHOP/httpdocs/geoip_ratelimit/counts/ -name "*.count" -exec cat {} \;

# Anzahl aktiver Bans
find /var/www/vhosts/SHOP/httpdocs/geoip_ratelimit/bans/ -name "*.ban" | wc -l

Manuell einen Bot-Typ entbannen

# Alle Bans löschen für einen Shop
rm -f /var/www/vhosts/SHOP/httpdocs/geoip_ratelimit/bans/*.ban

# Alle Counter zurücksetzen
rm -f /var/www/vhosts/SHOP/httpdocs/geoip_ratelimit/counts/*.count

📁 Dateistruktur

Pro Shop (in /var/www/vhosts/SHOP/httpdocs/)

GeoIP-Modus:

  • index.php.geoip_backup - Backup der Original index.php
  • geoip_blocking.php - PHP-Blocking-Script
  • geoip_ip_ranges.cache - Gecachte IP-Ranges (erneuert alle 24h)
  • geoip_blocked.log - Log der Blocks

Bot-Only Modus:

  • index.php.geoip_backup - Backup der Original index.php
  • geoip_blocking.php - PHP-Blocking-Script
  • geoip_blocked.log - Log der Bot-Requests und Bans
  • geoip_ratelimit/ - Rate-Limit Verzeichnis
    • bans/ - Aktive Bans (.ban Dateien, Format: timestamp|botname)
    • counts/ - Request-Counter (.count Dateien)

System-weit

  • /var/lib/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

Rate-Limit Defaults ändern

# Am Anfang des Scripts
DEFAULT_RATE_LIMIT = 30  # Requests pro Minute pro Bot-Typ
DEFAULT_BAN_DURATION = 5  # Minuten

Weitere Länder hinzufügen

Editiere GEO_REGIONS im Python-Script:

GEO_REGIONS = {
    "dach": {
        "countries": ["de", "at", "ch"],  # Hier Länder hinzufügen
        ...
    },
    ...
}

Link11-IP ändern

# Am Anfang des Scripts
LINK11_IP = "128.65.223.106"  # Hier ändern

🛡️ Sicherheit

Was wird geblockt?

GeoIP-Modus:

  • Alle IPs außerhalb der konfigurierten Region
  • Sofortiger 403 Response

Bot-Only Modus:

  • Erkannte Bot-Typen die das Rate-Limit überschreiten
  • Temporärer Ban für den gesamten Bot-Typ
  • Bots unter dem Limit werden durchgelassen (gewollt!)

Was wird NICHT geblockt?

  • Alle IPs aus den erlaubten Ländern (GeoIP-Modus)
  • Normaler User-Traffic (Bot-Only Modus)
  • Bots unter dem Rate-Limit (Bot-Only Modus)
  • Private IPs (192.168.x.x, 10.x.x.x, etc.)
  • Localhost (127.0.0.1)

🐛 Troubleshooting

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

Rate-Limit funktioniert nicht

# Prüfe Verzeichnis-Berechtigungen
ls -la /var/www/vhosts/SHOP/httpdocs/geoip_ratelimit/

# Sollte 777 sein (PHP läuft als anderer User)
# Falls nicht:
chmod -R 777 /var/www/vhosts/SHOP/httpdocs/geoip_ratelimit/

Bots werden nicht erkannt

Prüfe ob der User-Agent in den Bot-Patterns enthalten ist:

# Im Log nach unbekannten Bots suchen
grep "Bot (.*)" /var/www/vhosts/SHOP/httpdocs/geoip_blocked.log

Unbekannte Bots werden als Bot (crawler), Bot (spider), etc. erkannt, wenn sie generische Keywords enthalten.

Rate-Limit Verzeichnisse sind leer trotz Bot-Traffic

Berechtigungsproblem! Das Python-Script läuft als root, aber PHP läuft als Domain-User.

# Quick-Fix für alle Shops:
for dir in /var/www/vhosts/*/httpdocs/geoip_ratelimit; do
    [ -d "$dir" ] && chmod -R 777 "$dir" && echo "Fixed: $dir"
done

📊 Performance

PHP-Level Blocking (GeoIP)

  • Overhead pro Request: ~2-8ms (bei gecachten IP-Ranges)
  • Erster Request: ~400-800ms (beim Download der IP-Ranges)
  • Cache-Dauer: 24 Stunden
  • RAM-Verbrauch: ~5-10 MB pro Shop

Bot-Rate-Limiting

  • Overhead pro Request: ~1-3ms (File-I/O)
  • Ban-Check: ~0.5ms (schneller Pfad)
  • Cleanup: Probabilistisch (1% der Requests)

📝 Logs und Monitoring

PHP-Level Logs

# Alle Log-Einträge für einen Shop
tail -f /var/www/vhosts/SHOP/httpdocs/geoip_blocked.log

# Nur BANNED Einträge (Rate-Limit überschritten)
grep "BANNED:" /var/www/vhosts/SHOP/httpdocs/geoip_blocked.log

# Nur BOT Einträge (unter Limit, durchgelassen)
grep "BOT:" /var/www/vhosts/SHOP/httpdocs/geoip_blocked.log

# Nur BLOCKED Einträge (bereits gebannter Bot)
grep "BLOCKED (banned):" /var/www/vhosts/SHOP/httpdocs/geoip_blocked.log

Bot-Statistik erstellen

# Top 10 Bots (aus Log)
grep -oP '(BOT|BANNED): \K[^|]+' /var/www/vhosts/SHOP/httpdocs/geoip_blocked.log | \
    sed 's/ //g' | sort | uniq -c | sort -rn | head -10

📚 Changelog

v4.0.0

  • BREAKING: CrowdSec-Integration komplett entfernt
  • BREAKING: Rate-Limiting jetzt nach Bot-Typ statt IP+UA
  • NEU: Alle Requests eines Bot-Typs teilen sich EIN Limit
  • NEU: Ban-Dateien speichern Bot-Namen (timestamp|botname)
  • NEU: Anzeige der aktuell gebannten Bot-Typen mit Namen
  • NEU: Top 3 Bot-Typen pro Shop in Gesamtübersicht
  • NEU: Vereinfachte Modi: nur noch geoip und bot
  • ENTFERNT: Watcher-Service (nicht mehr benötigt)
  • ENTFERNT: CrowdSec Queue-Dateien
  • ENTFERNT: Alle CrowdSec-Funktionen

v3.5.0

  • Erweiterte Bot-Erkennung mit 321 Bot-Patterns
  • 12 Bot-Kategorien
  • 32 generische Fallback-Patterns

v3.4.x

  • Rate-Limit Logik korrigiert
  • Verzeichnis-Berechtigungen (0o777)
  • Bot-Namen in Statistiken

v3.3.0

  • Option [7] - Nur direkte Shops aktivieren
  • Link11-Erkennung per DNS-Lookup
  • Farbcodierung im Menü

v3.2.0

  • Bot-Only Blocking Modus
  • 4 Blocking-Modi

v3.1.0

  • Eurozone+GB Region (22 Länder)
  • Cache-Validierung
  • Fail-Open Mechanismus

v3.0.0

  • DACH-Support
  • CrowdSec-Integration
  • Multi-Shop-Management

Version: 4.0.0
Letztes Update: Dezember 2025
Status: Production Ready
Bot-Patterns: 321 spezifisch + 32 generisch = 353 total
Rate-Limiting: Pro Bot-Typ (nicht pro IP)
Erlaubte Regionen: 🇩🇪🇦🇹🇨🇭 DACH | 🇪🇺 Eurozone+GB | 🤖 Bot-Only (weltweit)

Description
Sperrt temporär alle Länder aus. Außer Deutschland, um Botangriffe etc temporär zu verhindern bis Shop hinter Link11 ist.
Readme 603 KiB
Languages
Python 100%