🛡️ JTL-WAFi v2.4
Web Application Firewall für JTL-Shops - Ein verteiltes Bot-Protection und GeoIP-Blocking System mit Echtzeit-Dashboard, WebSocket-Kommunikation und zentraler Verwaltung mehrerer Server.
📋 Inhaltsverzeichnis
- Überblick
- Features
- Architektur
- Voraussetzungen
- Installation
- Konfiguration
- Verwendung
- Blocking-Mechanismus
- Bot-Erkennung
- API-Referenz
- WebSocket Events
- Datenstrukturen
- Troubleshooting
- Changelog
🎯 Überblick
JTL-WAFi besteht aus zwei Komponenten:
| Komponente | Beschreibung | Deployment |
|---|---|---|
| Dashboard | Zentrale Web-Oberfläche zur Verwaltung aller Shops | 1x auf Management-Server |
| Agent | Lokaler Dienst der das Blocking durchführt | 1x pro Shop-Server |
Schutzmodi
| Modus | Beschreibung | Anwendungsfall |
|---|---|---|
| 🤖 Bot Rate-Limiting | Erkennt und limitiert aggressive Bots basierend auf User-Agent und IP-Analyse | Schutz vor Scraping, SEO-Bots, AI-Crawlern |
| 🔍 Bot Monitor-Only | Erkennt und loggt Bots ohne zu blockieren | Analyse vor Aktivierung |
| 🌍 GeoIP-Blocking | Blockiert Traffic aus nicht-relevanten Regionen | Shops die nur DACH/EU beliefern |
✨ Features
Dashboard (v2.4)
Übersicht & Monitoring
- 📊 Echtzeit-Statistiken - Server online, aktive Shops, Requests/min, aktive Bans
- 🔥 Top 10 Shops - Übersicht der Shops mit höchster Last
- 📈 Bot-Aktivitäts-Graph - Zeitbasierte Darstellung pro Bot-Typ mit Zeitachse
- 📜 Live Logs - Echtzeit Log-Streaming pro Shop
- 🛡️ Link11 Kategorisierung - Unterscheidung zwischen CDN- und Direkt-Shops
Verwaltung
- ⚡ Massenaktionen - Alle Shops gleichzeitig aktivieren/deaktivieren
- 🔍 Sortierbare Shop-Liste - Nach Requests/min oder aktiven Bans
- 🖥️ Multi-Agent Support - Verwaltung beliebig vieler Server von einem Dashboard
- 🔐 Token-basierte Auth - Sichere Agent-Freigabe
- 🔄 Modus-Wechsel - Direkter Wechsel zwischen Bot/GeoIP/Monitor im Detail-Modal
Technisch
- WebSocket Real-Time - Keine Polling, sofortige Updates
- In-Memory Storage - Keine Datenbank-Locks, maximale Performance
- SSL/TLS - Automatische selbstsignierte Zertifikatsgenerierung
- Responsive Design - Funktioniert auf Desktop, Tablet und Mobile
Agent (v2.4)
Erkennung & Blocking
- 🔍 Auto-Discovery - Findet automatisch alle JTL-Shops in
/var/www/vhosts/ - 📝 Log-Analyse - Liest Shop-Logs für Statistiken
- 🤖 Bot-Erkennung - Identifiziert 200+ bekannte Bot-Typen via User-Agent
- 🌐 IP-basierte Erkennung - Erkennt getarnte Bots (z.B. Alibaba) anhand ihrer IP-Ranges
- 🚫 PHP-Blocking - Dynamisches Blocking via PHP-Skript (kein iptables!)
- 🌍 GeoIP-Lookup - IP-Ranges von ipdeny.com für Länder-Blocking
Zuverlässigkeit
- ♻️ Auto-Reconnect - Automatische Wiederverbindung zum Dashboard mit Exponential Backoff
- 🔑 Token-Auth - Sichere Authentifizierung nach Freigabe
- ⏹️ Graceful Shutdown - Sauberes Beenden mit Ctrl+C (SIGINT/SIGTERM)
- 💾 Token-Persistenz - Token wird lokal in
/etc/jtl-wafi/tokengespeichert - 📋 Log-Rotation - Automatische Rotation bei 10 MB (3 Backups)
🏗 Architektur
┌─────────────────────────────────────────────────────────────────┐
│ DASHBOARD SERVER │
│ (shop000.example.com) │
│ ┌─────────────────────────────────────────────────────────┐ │
│ │ jtl_wafi_dashboard.py │ │
│ │ ┌─────────────┐ ┌─────────────┐ ┌─────────────────┐ │ │
│ │ │ FastAPI │ │ WebSocket │ │ In-Memory │ │ │
│ │ │ HTTP API │ │ Server │ │ DataStore │ │ │
│ │ └─────────────┘ └─────────────┘ └─────────────────┘ │ │
│ └─────────────────────────────────────────────────────────┘ │
│ │ │
│ WSS (Port 8000) │
└──────────────────────────────┼───────────────────────────────────┘
│
┌────────────────────┼────────────────────┐
│ │ │
▼ ▼ ▼
┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐
│ AGENT SERVER 1 │ │ AGENT SERVER 2 │ │ AGENT SERVER N │
│ (shop020.xxx) │ │ (shop043.xxx) │ │ (shopXXX.xxx) │
│ ┌───────────┐ │ │ ┌───────────┐ │ │ ┌───────────┐ │
│ │ Agent │ │ │ │ Agent │ │ │ │ Agent │ │
│ ├───────────┤ │ │ ├───────────┤ │ │ ├───────────┤ │
│ │ Shop A │ │ │ │ Shop D │ │ │ │ Shop X │ │
│ │ Shop B │ │ │ │ Shop E │ │ │ │ Shop Y │ │
│ │ Shop C │ │ │ │ Shop F │ │ │ │ Shop Z │ │
│ └───────────┘ │ │ └───────────┘ │ │ └───────────┘ │
└─────────────────┘ └─────────────────┘ └─────────────────┘
Datenfluss
┌─────────┐ ┌───────────┐
│ Agent │ ──── agent.connect ────────► │ Dashboard │
│ │ ◄─── auth.approved ───────── │ │
│ │ │ │
│ │ ──── agent.heartbeat ──────► │ │ (alle 60s)
│ │ ──── shop.full_update ─────► │ │
│ │ ──── shop.stats ───────────► │ │ (alle 10s)
│ │ │ │
│ │ ◄─── command.activate ────── │ │
│ │ ◄─── command.deactivate ──── │ │
│ │ │ │
│ │ ──── log.entry ────────────► │ │ (live)
│ │ ──── bot.banned ───────────► │ │ (events)
│ │ ──── command.result ───────► │ │
└─────────┘ └───────────┘
🔧 Blocking-Mechanismus
So funktioniert das Blocking
JTL-WAFi blockiert NICHT via iptables, sondern durch ein PHP-Skript, das in die Shop-index.php eingebunden wird:
┌─────────────────────────────────────────────────────────────┐
│ HTTP Request │
└─────────────────────────┬───────────────────────────────────┘
▼
┌─────────────────────────────────────────────────────────────┐
│ Nginx / Apache │
└─────────────────────────┬───────────────────────────────────┘
▼
┌─────────────────────────────────────────────────────────────┐
│ index.php │
│ ┌───────────────────────────────────────────────────────┐ │
│ │ require_once __DIR__ . '/jtl-wafi.php'; ◄── NEU │ │
│ └───────────────────────────────────────────────────────┘ │
│ │ │
│ ▼ │
│ ┌───────────────────────────────────────────────────────┐ │
│ │ jtl-wafi.php │ │
│ │ • Prüft IP gegen erlaubte Länder (GeoIP-Mode) │ │
│ │ • Erkennt Bots via User-Agent + IP-Ranges │ │
│ │ • Rate-Limiting pro Bot-Typ (nicht pro IP!) │ │
│ │ • Bei Verstoß: 403 Forbidden + exit │ │
│ └───────────────────────────────────────────────────────┘ │
│ │ │
│ ▼ │
│ [Rest der Shop-Logik] │
└─────────────────────────────────────────────────────────────┘
Dateien pro Shop (bei Aktivierung)
| Datei | Beschreibung |
|---|---|
index.php |
Modifiziert mit require_once für jtl-wafi.php |
index.php.jtl-wafi_backup |
Backup der Original index.php |
jtl-wafi.php |
Das eigentliche Blocking-Skript |
jtl-wafi_ip_ranges.cache |
Gecachte IP-Ranges (nur GeoIP-Mode) |
jtl-wafi_blocked.log |
Log der blockierten Requests |
jtl-wafi_ratelimit/ |
Verzeichnis für Rate-Limit-Daten (nur Bot-Mode) |
GeoIP-Blocking
- Lädt IP-Ranges von ipdeny.com (z.B.
de-aggregated.zone) - Cached die Ranges lokal für 24 Stunden
- FAIL-OPEN: Bei Problemen mit dem Cache wird Traffic durchgelassen
- Mindestanforderung: 1000 Ranges (DACH) / 5000 Ranges (Eurozone)
Bot Rate-Limiting
- Erkennung via User-Agent Patterns (200+ Bots)
- Erkennung via IP-Ranges (z.B. Alibaba Cloud)
- Rate-Limit gilt pro Bot-Typ, nicht pro IP
- Beispiel: Alle AhrefsBot-Requests teilen sich ein Limit
- Ban-Dateien speichern Bot-Namen für Dashboard-Anzeige
🤖 Bot-Erkennung
Erkannte Bot-Kategorien
| Kategorie | Beispiele | Anzahl |
|---|---|---|
| AI/LLM Services | GPTBot, ClaudeBot, PerplexityBot, Bytespider | 50+ |
| Suchmaschinen | Googlebot, Bingbot, Baiduspider, YandexBot | 30+ |
| SEO & Marketing | AhrefsBot, SemrushBot, MJ12Bot, DotBot | 15+ |
| Social Media | FacebookBot, Twitterbot, LinkedInBot | 20+ |
| E-Commerce | Amazonbot, Alibaba-Bot, Idealo, Shopify | 15+ |
| Archiv & Research | Archive.org Bot, CCBot, Heritrix | 10+ |
| HTTP Libraries | Python-Requests, cURL, Wget, Scrapy | 30+ |
| Security Scanner | Nessus, SQLMap, Nikto, Burp Suite | 15+ |
| Headless Browsers | PhantomJS, Puppeteer, Playwright | 10+ |
IP-basierte Erkennung
Manche Bots tarnen sich mit normalem User-Agent. Diese werden über ihre IP-Ranges erkannt:
Alibaba-Bot IP-Ranges:
├── 43.0.0.0/9 (Alibaba Cloud Singapore)
├── 8.128.0.0/10 (Alibaba Cloud)
├── 47.74.0.0/15 (Alibaba Cloud)
├── 39.96.0.0/13 (Aliyun China)
└── ... (40+ weitere Ranges)
Generische Fallback-Patterns
Falls kein spezifischer Bot erkannt wird, prüft das System auf generische Begriffe:
bot, crawler, spider, scraper, fetch, scan, monitor, probe, index, archive, etc.
📦 Voraussetzungen
Dashboard Server
# Python 3.8+
python3 --version
# Benötigte Pakete
pip3 install fastapi uvicorn python-multipart --break-system-packages
# OpenSSL für Zertifikate
apt install openssl
Agent Server
# Python 3.8+
python3 --version
# Benötigte Pakete (NUR websockets!)
pip3 install websockets --break-system-packages
# PHP CLI (für Cache-Generierung)
apt install php-cli
# Nginx oder Apache (muss bereits installiert sein)
Hinweis: Der Agent benötigt KEIN
geoip2oderwatchdogModul! Die GeoIP-Prüfung erfolgt komplett im PHP-Skript.
🚀 Installation
1. Dashboard Server (Zentral)
# Verzeichnis erstellen
mkdir -p /opt/jtl-wafi
cd /opt/jtl-wafi
# Dashboard kopieren
cp jtl_wafi_dashboard.py /opt/jtl-wafi/
# Datenverzeichnis erstellen
mkdir -p /var/lib/jtl-wafi/ssl
# Systemd Service installieren
python3 /opt/jtl-wafi/jtl_wafi_dashboard.py --install-service
# Service aktivieren und starten
systemctl daemon-reload
systemctl enable jtl-wafi
systemctl start jtl-wafi
# Status prüfen
systemctl status jtl-wafi
Firewall konfigurieren
# Port 8000 öffnen (oder anderen konfigurierten Port)
ufw allow 8000/tcp
Erster Login
- Browser öffnen:
https://dashboard-server:8000 - SSL-Warnung akzeptieren (selbstsigniertes Zertifikat)
- Admin-Passwort setzen (mind. 8 Zeichen)
- Dashboard ist einsatzbereit
2. Agent Server (Pro Shop-Server)
# Verzeichnis erstellen
mkdir -p /opt/jtl-wafi
mkdir -p /etc/jtl-wafi
mkdir -p /var/lib/jtl-wafi
cd /opt/jtl-wafi
# Agent kopieren
cp jtl_wafi_agent.py /opt/jtl-wafi/
# Systemd Service installieren
python3 /opt/jtl-wafi/jtl_wafi_agent.py --install-service
# Service konfigurieren (Dashboard URL setzen)
nano /etc/systemd/system/jtl-wafi-agent.service
# ExecStart anpassen:
# ExecStart=/usr/bin/python3 /opt/jtl-wafi/jtl_wafi_agent.py --url wss://DASHBOARD-IP:8000/ws/agent
# Service aktivieren und starten
systemctl daemon-reload
systemctl enable jtl-wafi-agent
systemctl start jtl-wafi-agent
# Status prüfen
systemctl status jtl-wafi-agent
Agent freigeben
- Im Dashboard erscheint der neue Agent mit Status "🟡 Warte"
- Auf "✓ Freigeben" klicken
- Agent erhält Token und wird "🟢 Online"
- Token wird automatisch in
/etc/jtl-wafi/tokengespeichert
⚙️ Konfiguration
Dashboard Umgebungsvariablen
| Variable | Beschreibung | Standard |
|---|---|---|
DASHBOARD_SECRET |
Session Secret Key | Auto-generiert |
Dashboard Kommandozeilen-Optionen
python3 jtl_wafi_dashboard.py --help
Options:
--host TEXT Host zum Binden [default: 0.0.0.0]
--port INTEGER Port [default: 8000]
--no-ssl SSL deaktivieren
--install-service Systemd Service erstellen
Agent Kommandozeilen-Optionen
python3 jtl_wafi_agent.py --help
Options:
--url TEXT Dashboard WebSocket URL
[default: wss://shop000.jtl-hosting.de:8000/ws/agent]
--debug Debug-Logging aktivieren
--install-service Systemd Service erstellen
--check-deps Abhängigkeiten prüfen
Agent Pfade
| Pfad | Beschreibung |
|---|---|
/etc/jtl-wafi/token |
Gespeicherter Auth-Token |
/var/lib/jtl-wafi/active_shops.json |
Liste aktiver Shops mit Konfiguration |
/var/log/jtl-wafi.log |
Agent-Logdatei (mit Rotation) |
/var/www/vhosts/ |
Shop-Verzeichnisse (Auto-Discovery) |
GeoIP Regionen
| Region | Länder | Beschreibung |
|---|---|---|
dach |
DE, AT, CH | Deutschland, Österreich, Schweiz |
eurozone |
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 |
none |
- | Kein GeoIP (nur für Bot-Mode) |
Rate-Limit Defaults
| Parameter | Wert | Beschreibung |
|---|---|---|
| Rate-Limit | 30 req/min | Pro Bot-Typ |
| Ban-Dauer | 5 Minuten | Nach Überschreitung |
| Script-Gültigkeit | 72 Stunden | Danach automatische Deaktivierung |
🖥️ Verwendung
Einzelne Shops verwalten
Aktivieren (Bot-Mode)
Dashboard → Shop auswählen → "Aktivieren"
→ Modus: Bot Rate-Limiting
→ Rate-Limit: 30/min (Standard)
→ Ban-Dauer: 5 min (Standard)
Aktivieren (GeoIP-Mode)
Dashboard → Shop auswählen → "Aktivieren"
→ Modus: GeoIP-Blocking
→ Region: DACH oder Eurozone
Aktivieren (Monitor-Only)
Dashboard → Shop auswählen → "Aktivieren"
→ Modus: Bot Rate-Limiting
→ ☑️ Nur Monitoring (kein Blocking)
Modus wechseln
Dashboard → Shop-Karte klicken → Detail-Modal
→ "Modus wechseln" Button
→ Ziel-Modus auswählen
Massenaktionen
Alle Shops aktivieren
Dashboard → "⚡ Bulk-Aktivierung"
→ Filter: Link11 / Direkt / Alle
→ Modus und Parameter wählen
→ Bestätigen
Alle Shops deaktivieren
Dashboard → "🛑 Bulk-Deaktivierung"
→ Filter: Link11 / Direkt / Alle
→ Bestätigen
Monitoring
Live-Logs anzeigen
Dashboard → Shop-Karte → "📜" Button
→ Echtzeit-Log-Stream
→ Gebannte Requests werden rot markiert
Shop-Details & Graph
Dashboard → Shop-Karte klicken
→ Statistiken, Top-Bots, aktive Bans
→ Bot-Aktivitäts-Graph mit Zeitachse
Alle Shops sortiert anzeigen
Dashboard → "📊 Alle Shops"
→ Sortieren nach: Requests/min oder Aktive Bans
→ Klick auf Zeile öffnet Detail-Modal
📡 API-Referenz
HTTP Endpoints
| Endpoint | Methode | Beschreibung |
|---|---|---|
/ |
GET | Dashboard-Oberfläche |
/login |
GET/POST | Login-Seite |
/logout |
GET | Logout |
/api/shops/activate |
POST | Shop aktivieren |
/api/shops/deactivate |
POST | Shop deaktivieren |
/api/shops/bulk-activate |
POST | Mehrere Shops aktivieren |
/api/shops/bulk-deactivate |
POST | Mehrere Shops deaktivieren |
/api/agents/approve |
POST | Agent freigeben |
/api/change-password |
POST | Passwort ändern |
Aktivierung Parameter
| Parameter | Werte | Beschreibung |
|---|---|---|
domain |
String | Shop-Domain |
mode |
bot, geoip |
Blocking-Modus |
geo_region |
dach, eurozone |
Nur bei GeoIP-Mode |
rate_limit |
Integer | Requests/min (nur Bot-Mode) |
ban_duration |
Integer | Sekunden (nur Bot-Mode) |
bot_monitor_only |
true/false |
Nur Logging (nur Bot-Mode) |
🔌 WebSocket Events
Endpoint: /ws/agent (Agent → Dashboard)
| Event | Richtung | Beschreibung |
|---|---|---|
agent.connect |
Agent → Dashboard | Agent-Registrierung |
agent.heartbeat |
Agent → Dashboard | System-Status (alle 60s) |
shop.full_update |
Agent → Dashboard | Alle Shop-Daten |
shop.stats |
Agent → Dashboard | Shop-Statistiken (alle 10s) |
log.entry |
Agent → Dashboard | Log-Zeile (bei Subscription) |
bot.banned |
Agent → Dashboard | Ban-Event |
command.result |
Agent → Dashboard | Kommando-Ergebnis |
auth.approved |
Dashboard → Agent | Token nach Freigabe |
command.activate |
Dashboard → Agent | Shop aktivieren |
command.deactivate |
Dashboard → Agent | Shop deaktivieren |
log.subscribe |
Dashboard → Agent | Log-Streaming starten |
log.unsubscribe |
Dashboard → Agent | Log-Streaming stoppen |
Endpoint: /ws/dashboard (Browser → Dashboard)
| Event | Richtung | Beschreibung |
|---|---|---|
initial_state |
Dashboard → Browser | Initialer Zustand |
refresh |
Dashboard → Browser | Aktualisierte Daten |
agent.online |
Dashboard → Browser | Agent online |
agent.offline |
Dashboard → Browser | Agent offline |
agent.pending |
Dashboard → Browser | Agent wartet auf Freigabe |
agent.approved |
Dashboard → Browser | Agent freigegeben |
shop.full_update |
Dashboard → Browser | Shop-Update |
shop.stats |
Dashboard → Browser | Stats-Update |
shop_history |
Dashboard → Browser | Historie für Graph |
top_shops |
Dashboard → Browser | Top 10 Shops |
all_shops_sorted |
Dashboard → Browser | Alle Shops sortiert |
log.entry |
Dashboard → Browser | Log-Zeile |
bot.banned |
Dashboard → Browser | Ban-Notification |
command.result |
Dashboard → Browser | Kommando-Ergebnis |
get_shop_history |
Browser → Dashboard | Historie anfordern |
get_all_shops_sorted |
Browser → Dashboard | Sortierte Liste anfordern |
log.subscribe |
Browser → Dashboard | Logs abonnieren |
log.unsubscribe |
Browser → Dashboard | Logs abbestellen |
📊 Datenstrukturen
Agent Connect
{
"type": "agent.connect",
"data": {
"agent_id": "a1b2c3d4e5f6",
"hostname": "shop020.jtl-hosting.de",
"token": "stored-token-or-null",
"version": "2.4.0",
"os_info": {
"system": "Linux",
"release": "5.15.0",
"hostname": "shop020"
},
"shops_summary": {
"total": 25,
"active": 12
}
}
}
Shop Full Update
{
"type": "shop.full_update",
"data": {
"domain": "example.com",
"status": "active",
"mode": "bot",
"geo_region": "none",
"rate_limit": 30,
"ban_duration": 300,
"bot_monitor_only": false,
"link11": true,
"link11_ip": "128.65.223.106",
"activated": "2024-12-19T10:30:00",
"runtime_minutes": 45.5,
"stats": {
"log_entries": 15234,
"total_bans": 47,
"active_bans": 3,
"banned_bots": ["AhrefsBot", "SemrushBot"],
"req_per_min": 45.7,
"unique_ips": 234,
"unique_bots": 12,
"top_bots": {
"Googlebot": 523,
"bingbot": 234,
"AhrefsBot": 189
},
"top_ips": {
"66.249.66.1": 145,
"157.55.39.1": 98
}
}
}
}
Command Activate
{
"type": "command.activate",
"data": {
"command_id": "cmd_abc123",
"shop": "example.com",
"mode": "bot",
"geo_region": "none",
"rate_limit": 30,
"ban_duration": 300,
"bot_monitor_only": false
}
}
🔧 Troubleshooting
Dashboard startet nicht
# Logs prüfen
journalctl -u jtl-wafi -f
# Häufige Ursachen:
# 1. Port bereits belegt
lsof -i :8000
# 2. Python-Pakete fehlen
pip3 install fastapi uvicorn python-multipart --break-system-packages
# 3. SSL-Verzeichnis fehlt
mkdir -p /var/lib/jtl-wafi/ssl
Agent verbindet nicht
# Logs prüfen
journalctl -u jtl-wafi-agent -f
# Häufige Ursachen:
# 1. Dashboard nicht erreichbar
curl -k https://dashboard:8000/
# 2. Firewall blockiert
telnet dashboard 8000
# 3. SSL-Zertifikat Problem (selbstsigniert)
# Agent akzeptiert selbstsignierte Zertifikate automatisch
# 4. websockets-Modul fehlt
pip3 install websockets --break-system-packages
Agent wird nicht freigegeben
# Token manuell löschen und neu verbinden
rm /etc/jtl-wafi/token
systemctl restart jtl-wafi-agent
Shops werden nicht erkannt
# Agent Logs prüfen
journalctl -u jtl-wafi-agent | grep -i shop
# Shop-Verzeichnisse prüfen (muss index.php enthalten)
ls -la /var/www/vhosts/*/httpdocs/index.php
Blocking funktioniert nicht
# Prüfe ob jtl-wafi.php existiert
ls -la /var/www/vhosts/DOMAIN/httpdocs/jtl-wafi.php
# Prüfe ob index.php modifiziert wurde
head -20 /var/www/vhosts/DOMAIN/httpdocs/index.php
# Sollte enthalten: require_once __DIR__ . '/jtl-wafi.php';
# Prüfe Backup
ls -la /var/www/vhosts/DOMAIN/httpdocs/index.php.jtl-wafi_backup
# PHP-Fehler prüfen
tail -f /var/log/php*/error.log
GeoIP Cache-Probleme
# Cache-Datei prüfen
ls -la /var/www/vhosts/DOMAIN/httpdocs/jtl-wafi_ip_ranges.cache
# Cache löschen (wird automatisch neu erstellt)
rm /var/www/vhosts/DOMAIN/httpdocs/jtl-wafi_ip_ranges.cache
# ipdeny.com erreichbar?
curl -I https://www.ipdeny.com/ipblocks/data/aggregated/de-aggregated.zone
Rate-Limit funktioniert nicht
# Rate-Limit Verzeichnis prüfen
ls -la /var/www/vhosts/DOMAIN/httpdocs/jtl-wafi_ratelimit/
# Berechtigungen prüfen (muss 777 sein)
stat /var/www/vhosts/DOMAIN/httpdocs/jtl-wafi_ratelimit/
# Ban-Dateien anzeigen
ls -la /var/www/vhosts/DOMAIN/httpdocs/jtl-wafi_ratelimit/bans/
cat /var/www/vhosts/DOMAIN/httpdocs/jtl-wafi_ratelimit/bans/*.ban
Dashboard reagiert langsam
# WebSocket Verbindungen prüfen
ss -tuln | grep 8000
# Memory-Nutzung prüfen
ps aux | grep jtl_wafi
# Bei vielen Agents: Connection-Limits erhöhen
ulimit -n 65535
📝 Changelog
v2.4.0 (2024-12)
Neue Features
- 🔍 Monitor-Only Modus - Bot-Erkennung ohne Blocking für Analyse
- 🌐 IP-basierte Bot-Erkennung - Erkennt getarnte Bots (Alibaba) anhand IP-Ranges
- 🤖 200+ Bot-Patterns - Massiv erweiterte Bot-Erkennung inkl. AI-Crawler
- ⏱️ Heartbeat auf 60s - Reduzierte Netzwerklast
Verbesserungen
- Modus-Wechsel direkt im Detail-Modal
- Verbesserte Statistik-Auswertung für Monitor-Mode
v2.3.0 (2024-12)
Neue Features
- 🔥 Top 10 Shops - Neue Übersichtskarte mit meistbelasteten Shops
- 📊 Sortierbare Shop-Liste - Modal mit allen Shops, sortierbar nach Requests oder Bans
- 📈 Bot-Aktivitäts-Graph - Mehrere Linien pro Bot-Typ mit Zeitachse
- 🔄 Rebranding - Umbenannt zu "JTL-WAFi"
Verbesserungen
- Dropdown bei Massenaktionen entfernt (Filter jetzt im Modal)
- Laufzeit-Anzeige korrigiert
- Graph zeigt jetzt Uhrzeiten auf X-Achse
- Agent-Logging verbessert
v2.2.0 (2024-12)
Architektur-Änderung
- In-Memory Storage statt SQLite für Echtzeit-Daten
- Keine "database is locked" Fehler mehr
- Massiv verbesserte Performance bei vielen Agents
Neue Features
- Passwort in JSON-Datei statt Datenbank
- Agent-Tokens in JSON-Datei statt Datenbank
v2.1.0 (2024-12)
Neue Features
- Link11 Kategorisierung - Shops werden nach CDN/Direkt getrennt
- Bulk Actions - Massenaktivierung/-deaktivierung
- Shop Detail Modal - Ausführliche Statistiken und Graph
- Password Change - Passwort im Dashboard ändern
- Live Clock - Echtzeit-Uhr im Header
- Shop Link Button - Direktlink zum Shop
Fixes
- Agent Ctrl+C Shutdown funktioniert jetzt sofort
- Asyncio Signal Handler korrekt implementiert
v2.0.0 (2024-12)
Komplett neu
- WebSocket-basierte Architektur
- Echtzeit-Updates ohne Polling
- Multi-Agent Support
- Neue moderne UI
- PHP-basiertes Blocking (kein iptables)
📄 Lizenz
MIT License - siehe LICENSE
🤝 Contributing
- Fork erstellen
- Feature Branch (
git checkout -b feature/AmazingFeature) - Commit (
git commit -m 'Add AmazingFeature') - Push (
git push origin feature/AmazingFeature) - Pull Request erstellen
📞 Support
Bei Fragen oder Problemen:
- GitHub Issues öffnen
- Logs beifügen (
journalctl -u jtl-wafi -n 100)
Made with ❤️ for JTL-Shop Hosting