README.md aktualisiert
This commit is contained in:
502
README.md
502
README.md
@@ -1,8 +1,8 @@
|
|||||||
# 🛡️ JTL-WAFi v2.3
|
# 🛡️ 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.
|
**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.
|
||||||
|
|
||||||

|

|
||||||

|

|
||||||

|

|
||||||
|
|
||||||
@@ -22,6 +22,8 @@
|
|||||||
- [Einzelne Shops](#einzelne-shops-verwalten)
|
- [Einzelne Shops](#einzelne-shops-verwalten)
|
||||||
- [Massenaktionen](#massenaktionen)
|
- [Massenaktionen](#massenaktionen)
|
||||||
- [Monitoring](#monitoring)
|
- [Monitoring](#monitoring)
|
||||||
|
- [Blocking-Mechanismus](#-blocking-mechanismus)
|
||||||
|
- [Bot-Erkennung](#-bot-erkennung)
|
||||||
- [API-Referenz](#-api-referenz)
|
- [API-Referenz](#-api-referenz)
|
||||||
- [WebSocket Events](#-websocket-events)
|
- [WebSocket Events](#-websocket-events)
|
||||||
- [Datenstrukturen](#-datenstrukturen)
|
- [Datenstrukturen](#-datenstrukturen)
|
||||||
@@ -43,14 +45,15 @@ JTL-WAFi besteht aus zwei Komponenten:
|
|||||||
|
|
||||||
| Modus | Beschreibung | Anwendungsfall |
|
| Modus | Beschreibung | Anwendungsfall |
|
||||||
|-------|--------------|----------------|
|
|-------|--------------|----------------|
|
||||||
| **🤖 Bot Rate-Limiting** | Erkennt und limitiert aggressive Bots basierend auf User-Agent-Analyse | Schutz vor Scraping, SEO-Bots, Crawlern |
|
| **🤖 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 |
|
| **🌍 GeoIP-Blocking** | Blockiert Traffic aus nicht-relevanten Regionen | Shops die nur DACH/EU beliefern |
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## ✨ Features
|
## ✨ Features
|
||||||
|
|
||||||
### Dashboard (v2.3)
|
### Dashboard (v2.4)
|
||||||
|
|
||||||
#### Übersicht & Monitoring
|
#### Übersicht & Monitoring
|
||||||
- **📊 Echtzeit-Statistiken** - Server online, aktive Shops, Requests/min, aktive Bans
|
- **📊 Echtzeit-Statistiken** - Server online, aktive Shops, Requests/min, aktive Bans
|
||||||
@@ -64,6 +67,7 @@ JTL-WAFi besteht aus zwei Komponenten:
|
|||||||
- **🔍 Sortierbare Shop-Liste** - Nach Requests/min oder aktiven Bans
|
- **🔍 Sortierbare Shop-Liste** - Nach Requests/min oder aktiven Bans
|
||||||
- **🖥️ Multi-Agent Support** - Verwaltung beliebig vieler Server von einem Dashboard
|
- **🖥️ Multi-Agent Support** - Verwaltung beliebig vieler Server von einem Dashboard
|
||||||
- **🔐 Token-basierte Auth** - Sichere Agent-Freigabe
|
- **🔐 Token-basierte Auth** - Sichere Agent-Freigabe
|
||||||
|
- **🔄 Modus-Wechsel** - Direkter Wechsel zwischen Bot/GeoIP/Monitor im Detail-Modal
|
||||||
|
|
||||||
#### Technisch
|
#### Technisch
|
||||||
- **WebSocket Real-Time** - Keine Polling, sofortige Updates
|
- **WebSocket Real-Time** - Keine Polling, sofortige Updates
|
||||||
@@ -71,20 +75,22 @@ JTL-WAFi besteht aus zwei Komponenten:
|
|||||||
- **SSL/TLS** - Automatische selbstsignierte Zertifikatsgenerierung
|
- **SSL/TLS** - Automatische selbstsignierte Zertifikatsgenerierung
|
||||||
- **Responsive Design** - Funktioniert auf Desktop, Tablet und Mobile
|
- **Responsive Design** - Funktioniert auf Desktop, Tablet und Mobile
|
||||||
|
|
||||||
### Agent (v2.3)
|
### Agent (v2.4)
|
||||||
|
|
||||||
#### Erkennung & Blocking
|
#### Erkennung & Blocking
|
||||||
- **🔍 Auto-Discovery** - Findet automatisch alle JTL-Shops auf dem Server
|
- **🔍 Auto-Discovery** - Findet automatisch alle JTL-Shops in `/var/www/vhosts/`
|
||||||
- **📝 Log-Analyse** - Parst Nginx Access-Logs in Echtzeit
|
- **📝 Log-Analyse** - Liest Shop-Logs für Statistiken
|
||||||
- **🤖 Bot-Erkennung** - Identifiziert 50+ bekannte Bot-Typen
|
- **🤖 Bot-Erkennung** - Identifiziert **200+ bekannte Bot-Typen** via User-Agent
|
||||||
- **🚫 IP-Banning** - Dynamisches Blocking via iptables
|
- **🌐 IP-basierte Erkennung** - Erkennt getarnte Bots (z.B. Alibaba) anhand ihrer IP-Ranges
|
||||||
- **🌍 GeoIP-Lookup** - MaxMind GeoLite2 Datenbank
|
- **🚫 PHP-Blocking** - Dynamisches Blocking via PHP-Skript (kein iptables!)
|
||||||
|
- **🌍 GeoIP-Lookup** - IP-Ranges von ipdeny.com für Länder-Blocking
|
||||||
|
|
||||||
#### Zuverlässigkeit
|
#### Zuverlässigkeit
|
||||||
- **♻️ Auto-Reconnect** - Automatische Wiederverbindung zum Dashboard
|
- **♻️ Auto-Reconnect** - Automatische Wiederverbindung zum Dashboard mit Exponential Backoff
|
||||||
- **🔑 Token-Auth** - Sichere Authentifizierung nach Freigabe
|
- **🔑 Token-Auth** - Sichere Authentifizierung nach Freigabe
|
||||||
- **⏹️ Graceful Shutdown** - Sauberes Beenden mit Ctrl+C (SIGINT/SIGTERM)
|
- **⏹️ Graceful Shutdown** - Sauberes Beenden mit Ctrl+C (SIGINT/SIGTERM)
|
||||||
- **💾 Token-Persistenz** - Token wird lokal gespeichert
|
- **💾 Token-Persistenz** - Token wird lokal in `/etc/jtl-wafi/token` gespeichert
|
||||||
|
- **📋 Log-Rotation** - Automatische Rotation bei 10 MB (3 Backups)
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
@@ -128,7 +134,7 @@ JTL-WAFi besteht aus zwei Komponenten:
|
|||||||
│ Agent │ ──── agent.connect ────────► │ Dashboard │
|
│ Agent │ ──── agent.connect ────────► │ Dashboard │
|
||||||
│ │ ◄─── auth.approved ───────── │ │
|
│ │ ◄─── auth.approved ───────── │ │
|
||||||
│ │ │ │
|
│ │ │ │
|
||||||
│ │ ──── agent.heartbeat ──────► │ │ (alle 30s)
|
│ │ ──── agent.heartbeat ──────► │ │ (alle 60s)
|
||||||
│ │ ──── shop.full_update ─────► │ │
|
│ │ ──── shop.full_update ─────► │ │
|
||||||
│ │ ──── shop.stats ───────────► │ │ (alle 10s)
|
│ │ ──── shop.stats ───────────► │ │ (alle 10s)
|
||||||
│ │ │ │
|
│ │ │ │
|
||||||
@@ -143,6 +149,105 @@ JTL-WAFi besteht aus zwei Komponenten:
|
|||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
|
## 🔧 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
|
## 📦 Voraussetzungen
|
||||||
|
|
||||||
### Dashboard Server
|
### Dashboard Server
|
||||||
@@ -152,7 +257,7 @@ JTL-WAFi besteht aus zwei Komponenten:
|
|||||||
python3 --version
|
python3 --version
|
||||||
|
|
||||||
# Benötigte Pakete
|
# Benötigte Pakete
|
||||||
pip3 install fastapi uvicorn websockets python-multipart --break-system-packages
|
pip3 install fastapi uvicorn python-multipart --break-system-packages
|
||||||
|
|
||||||
# OpenSSL für Zertifikate
|
# OpenSSL für Zertifikate
|
||||||
apt install openssl
|
apt install openssl
|
||||||
@@ -164,21 +269,17 @@ apt install openssl
|
|||||||
# Python 3.8+
|
# Python 3.8+
|
||||||
python3 --version
|
python3 --version
|
||||||
|
|
||||||
# Benötigte Pakete
|
# Benötigte Pakete (NUR websockets!)
|
||||||
pip3 install websockets geoip2 watchdog --break-system-packages
|
pip3 install websockets --break-system-packages
|
||||||
|
|
||||||
# MaxMind GeoLite2 Datenbank
|
# PHP CLI (für Cache-Generierung)
|
||||||
# Download von: https://dev.maxmind.com/geoip/geolite2-free-geolocation-data
|
apt install php-cli
|
||||||
mkdir -p /var/lib/GeoIP
|
|
||||||
# GeoLite2-Country.mmdb hierhin kopieren
|
|
||||||
|
|
||||||
# iptables für IP-Blocking
|
# Nginx oder Apache (muss bereits installiert sein)
|
||||||
apt install iptables
|
|
||||||
|
|
||||||
# Nginx (für Log-Analyse)
|
|
||||||
# Muss bereits installiert sein
|
|
||||||
```
|
```
|
||||||
|
|
||||||
|
> **Hinweis**: Der Agent benötigt KEIN `geoip2` oder `watchdog` Modul! Die GeoIP-Prüfung erfolgt komplett im PHP-Skript.
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## 🚀 Installation
|
## 🚀 Installation
|
||||||
@@ -213,8 +314,6 @@ systemctl status jtl-wafi
|
|||||||
```bash
|
```bash
|
||||||
# Port 8000 öffnen (oder anderen konfigurierten Port)
|
# Port 8000 öffnen (oder anderen konfigurierten Port)
|
||||||
ufw allow 8000/tcp
|
ufw allow 8000/tcp
|
||||||
# ODER
|
|
||||||
iptables -A INPUT -p tcp --dport 8000 -j ACCEPT
|
|
||||||
```
|
```
|
||||||
|
|
||||||
#### Erster Login
|
#### Erster Login
|
||||||
@@ -230,20 +329,21 @@ iptables -A INPUT -p tcp --dport 8000 -j ACCEPT
|
|||||||
|
|
||||||
```bash
|
```bash
|
||||||
# Verzeichnis erstellen
|
# Verzeichnis erstellen
|
||||||
mkdir -p /opt/jtl-wafi-agent
|
mkdir -p /opt/jtl-wafi
|
||||||
mkdir -p /etc/jtl-wafi-agent
|
mkdir -p /etc/jtl-wafi
|
||||||
cd /opt/jtl-wafi-agent
|
mkdir -p /var/lib/jtl-wafi
|
||||||
|
cd /opt/jtl-wafi
|
||||||
|
|
||||||
# Agent kopieren
|
# Agent kopieren
|
||||||
cp jtl_wafi_agent.py /opt/jtl-wafi-agent/
|
cp jtl_wafi_agent.py /opt/jtl-wafi/
|
||||||
|
|
||||||
# Systemd Service installieren
|
# Systemd Service installieren
|
||||||
python3 /opt/jtl-wafi-agent/jtl_wafi_agent.py --install-service
|
python3 /opt/jtl-wafi/jtl_wafi_agent.py --install-service
|
||||||
|
|
||||||
# Service konfigurieren (Dashboard URL setzen)
|
# Service konfigurieren (Dashboard URL setzen)
|
||||||
nano /etc/systemd/system/jtl-wafi-agent.service
|
nano /etc/systemd/system/jtl-wafi-agent.service
|
||||||
# ExecStart anpassen:
|
# ExecStart anpassen:
|
||||||
# ExecStart=/usr/bin/python3 /opt/jtl-wafi-agent/jtl_wafi_agent.py --url wss://DASHBOARD-IP:8000/ws/agent
|
# ExecStart=/usr/bin/python3 /opt/jtl-wafi/jtl_wafi_agent.py --url wss://DASHBOARD-IP:8000/ws/agent
|
||||||
|
|
||||||
# Service aktivieren und starten
|
# Service aktivieren und starten
|
||||||
systemctl daemon-reload
|
systemctl daemon-reload
|
||||||
@@ -259,7 +359,7 @@ systemctl status jtl-wafi-agent
|
|||||||
1. Im Dashboard erscheint der neue Agent mit Status "🟡 Warte"
|
1. Im Dashboard erscheint der neue Agent mit Status "🟡 Warte"
|
||||||
2. Auf "✓ Freigeben" klicken
|
2. Auf "✓ Freigeben" klicken
|
||||||
3. Agent erhält Token und wird "🟢 Online"
|
3. Agent erhält Token und wird "🟢 Online"
|
||||||
4. Token wird automatisch in `/etc/jtl-wafi-agent/token` gespeichert
|
4. Token wird automatisch in `/etc/jtl-wafi/token` gespeichert
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
@@ -277,10 +377,10 @@ systemctl status jtl-wafi-agent
|
|||||||
python3 jtl_wafi_dashboard.py --help
|
python3 jtl_wafi_dashboard.py --help
|
||||||
|
|
||||||
Options:
|
Options:
|
||||||
--host TEXT Host zum Binden [default: 0.0.0.0]
|
--host TEXT Host zum Binden [default: 0.0.0.0]
|
||||||
--port INTEGER Port [default: 8000]
|
--port INTEGER Port [default: 8000]
|
||||||
--no-ssl SSL deaktivieren
|
--no-ssl SSL deaktivieren
|
||||||
--install-service Systemd Service erstellen
|
--install-service Systemd Service erstellen
|
||||||
```
|
```
|
||||||
|
|
||||||
### Agent Kommandozeilen-Optionen
|
### Agent Kommandozeilen-Optionen
|
||||||
@@ -289,163 +389,152 @@ Options:
|
|||||||
python3 jtl_wafi_agent.py --help
|
python3 jtl_wafi_agent.py --help
|
||||||
|
|
||||||
Options:
|
Options:
|
||||||
--url TEXT Dashboard WebSocket URL [required]
|
--url TEXT Dashboard WebSocket URL
|
||||||
--token TEXT Auth Token (optional, wird nach Freigabe gespeichert)
|
[default: wss://shop000.jtl-hosting.de:8000/ws/agent]
|
||||||
--install-service Systemd Service erstellen
|
--debug Debug-Logging aktivieren
|
||||||
|
--install-service Systemd Service erstellen
|
||||||
|
--check-deps Abhängigkeiten prüfen
|
||||||
```
|
```
|
||||||
|
|
||||||
### Dateipfade
|
### Agent Pfade
|
||||||
|
|
||||||
#### Dashboard
|
| Pfad | Beschreibung |
|
||||||
```
|
|------|--------------|
|
||||||
/opt/jtl-wafi/jtl_wafi_dashboard.py # Hauptprogramm
|
| `/etc/jtl-wafi/token` | Gespeicherter Auth-Token |
|
||||||
/var/lib/jtl-wafi/config.json # Passwort-Hash
|
| `/var/lib/jtl-wafi/active_shops.json` | Liste aktiver Shops mit Konfiguration |
|
||||||
/var/lib/jtl-wafi/tokens.json # Agent-Tokens
|
| `/var/log/jtl-wafi.log` | Agent-Logdatei (mit Rotation) |
|
||||||
/var/lib/jtl-wafi/ssl/server.crt # SSL Zertifikat
|
| `/var/www/vhosts/` | Shop-Verzeichnisse (Auto-Discovery) |
|
||||||
/var/lib/jtl-wafi/ssl/server.key # SSL Private Key
|
|
||||||
```
|
|
||||||
|
|
||||||
#### Agent
|
### GeoIP Regionen
|
||||||
```
|
|
||||||
/opt/jtl-wafi-agent/jtl_wafi_agent.py # Hauptprogramm
|
| Region | Länder | Beschreibung |
|
||||||
/etc/jtl-wafi-agent/token # Auth Token
|
|--------|--------|--------------|
|
||||||
/var/log/jtl-wafi-agent.log # Log-Datei
|
| `dach` | DE, AT, CH | Deutschland, Österreich, Schweiz |
|
||||||
/var/lib/GeoIP/GeoLite2-Country.mmdb # GeoIP Datenbank
|
| `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
|
## 🖥️ Verwendung
|
||||||
|
|
||||||
### Einzelne Shops verwalten
|
### Einzelne Shops verwalten
|
||||||
|
|
||||||
#### Shop aktivieren (Bot Rate-Limiting)
|
#### Aktivieren (Bot-Mode)
|
||||||
|
```
|
||||||
|
Dashboard → Shop auswählen → "Aktivieren"
|
||||||
|
→ Modus: Bot Rate-Limiting
|
||||||
|
→ Rate-Limit: 30/min (Standard)
|
||||||
|
→ Ban-Dauer: 5 min (Standard)
|
||||||
|
```
|
||||||
|
|
||||||
1. Shop in der Liste finden
|
#### Aktivieren (GeoIP-Mode)
|
||||||
2. "Start" Button klicken
|
```
|
||||||
3. Modus wählen: "🤖 Bot Rate-Limiting"
|
Dashboard → Shop auswählen → "Aktivieren"
|
||||||
4. Rate-Limit einstellen (z.B. 30 Requests/min pro Bot)
|
→ Modus: GeoIP-Blocking
|
||||||
5. Ban-Dauer einstellen (z.B. 300 Sekunden = 5 Minuten)
|
→ Region: DACH oder Eurozone
|
||||||
6. "Aktivieren" klicken
|
```
|
||||||
|
|
||||||
#### Shop aktivieren (GeoIP-Blocking)
|
#### Aktivieren (Monitor-Only)
|
||||||
|
```
|
||||||
|
Dashboard → Shop auswählen → "Aktivieren"
|
||||||
|
→ Modus: Bot Rate-Limiting
|
||||||
|
→ ☑️ Nur Monitoring (kein Blocking)
|
||||||
|
```
|
||||||
|
|
||||||
1. Shop in der Liste finden
|
#### Modus wechseln
|
||||||
2. "Start" Button klicken
|
```
|
||||||
3. Modus wählen: "🌍 GeoIP-Blocking"
|
Dashboard → Shop-Karte klicken → Detail-Modal
|
||||||
4. Region wählen:
|
→ "Modus wechseln" Button
|
||||||
- **DACH**: Deutschland, Österreich, Schweiz
|
→ Ziel-Modus auswählen
|
||||||
- **Eurozone**: EU-Länder + Großbritannien
|
```
|
||||||
5. "Aktivieren" klicken
|
|
||||||
|
|
||||||
#### Shop deaktivieren
|
|
||||||
|
|
||||||
1. "Stop" Button beim aktiven Shop klicken
|
|
||||||
2. Bestätigung
|
|
||||||
3. Alle Bans werden aufgehoben
|
|
||||||
|
|
||||||
### Massenaktionen
|
### Massenaktionen
|
||||||
|
|
||||||
#### Alle Shops aktivieren
|
#### Alle Shops aktivieren
|
||||||
|
```
|
||||||
1. "▶️ Aktivieren..." Button klicken
|
Dashboard → "⚡ Bulk-Aktivierung"
|
||||||
2. Modus und Parameter wählen
|
→ Filter: Link11 / Direkt / Alle
|
||||||
3. Filter wählen:
|
→ Modus und Parameter wählen
|
||||||
- Alle inaktiven Shops
|
→ Bestätigen
|
||||||
- Nur Direkte (⚡) - ohne Link11
|
```
|
||||||
- Nur Link11 (🛡️)
|
|
||||||
4. "Aktivieren" klicken
|
|
||||||
|
|
||||||
#### Alle Shops deaktivieren
|
#### Alle Shops deaktivieren
|
||||||
|
```
|
||||||
1. "⏹️ Deaktivieren..." Button klicken
|
Dashboard → "🛑 Bulk-Deaktivierung"
|
||||||
2. Filter wählen
|
→ Filter: Link11 / Direkt / Alle
|
||||||
3. "Deaktivieren" klicken
|
→ Bestätigen
|
||||||
|
```
|
||||||
|
|
||||||
### Monitoring
|
### Monitoring
|
||||||
|
|
||||||
#### Top 10 Shops
|
#### Live-Logs anzeigen
|
||||||
|
```
|
||||||
|
Dashboard → Shop-Karte → "📜" Button
|
||||||
|
→ Echtzeit-Log-Stream
|
||||||
|
→ Gebannte Requests werden rot markiert
|
||||||
|
```
|
||||||
|
|
||||||
- Zeigt die 10 Shops mit den meisten Requests/min
|
#### Shop-Details & Graph
|
||||||
- Klick auf einen Shop öffnet Detail-Modal
|
```
|
||||||
- Klick auf Überschrift öffnet sortierbare Gesamtliste
|
Dashboard → Shop-Karte klicken
|
||||||
|
→ Statistiken, Top-Bots, aktive Bans
|
||||||
|
→ Bot-Aktivitäts-Graph mit Zeitachse
|
||||||
|
```
|
||||||
|
|
||||||
#### Shop-Details
|
#### Alle Shops sortiert anzeigen
|
||||||
|
```
|
||||||
1. Auf Shop-Domain klicken
|
Dashboard → "📊 Alle Shops"
|
||||||
2. Detail-Modal zeigt:
|
→ Sortieren nach: Requests/min oder Aktive Bans
|
||||||
- **Status, Modus, Region, Rate-Limit, Ban-Dauer, Laufzeit**
|
→ Klick auf Zeile öffnet Detail-Modal
|
||||||
- **Aktuelle Stats**: Req/min, Aktive Bans, Total Bans
|
```
|
||||||
- **Bot-Aktivitäts-Graph**: Zeitverlauf pro Bot-Typ
|
|
||||||
- **Top Bots**: Meistaktive Bots
|
|
||||||
- **Gebannte Bots**: Aktuell gesperrte Bot-Typen
|
|
||||||
|
|
||||||
#### Live Logs
|
|
||||||
|
|
||||||
1. 📜 Icon beim Shop klicken
|
|
||||||
2. Log-Panel öffnet sich unten
|
|
||||||
3. Echtzeit-Anzeige der Log-Einträge
|
|
||||||
4. Farbkodierung:
|
|
||||||
- **Rot**: BANNED Events
|
|
||||||
- **Gelb**: BLOCKED Events
|
|
||||||
- **Grau**: Normale Requests
|
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## 🔌 API-Referenz
|
## 📡 API-Referenz
|
||||||
|
|
||||||
### HTTP Endpoints
|
### HTTP Endpoints
|
||||||
|
|
||||||
| Method | Endpoint | Beschreibung |
|
| Endpoint | Methode | Beschreibung |
|
||||||
|--------|----------|--------------|
|
|----------|---------|--------------|
|
||||||
| `GET` | `/` | Dashboard HTML |
|
| `/` | GET | Dashboard-Oberfläche |
|
||||||
| `POST` | `/setup` | Initiales Passwort setzen |
|
| `/login` | GET/POST | Login-Seite |
|
||||||
| `POST` | `/login` | Anmeldung |
|
| `/logout` | GET | Logout |
|
||||||
| `GET` | `/logout` | Abmeldung |
|
| `/api/shops/activate` | POST | Shop aktivieren |
|
||||||
| `POST` | `/api/agents/{id}/approve` | Agent freigeben |
|
| `/api/shops/deactivate` | POST | Shop deaktivieren |
|
||||||
| `POST` | `/api/shops/activate` | Shop aktivieren |
|
| `/api/shops/bulk-activate` | POST | Mehrere Shops aktivieren |
|
||||||
| `POST` | `/api/shops/deactivate` | Shop deaktivieren |
|
| `/api/shops/bulk-deactivate` | POST | Mehrere Shops deaktivieren |
|
||||||
| `POST` | `/api/shops/bulk-activate` | Massenaktivierung |
|
| `/api/agents/approve` | POST | Agent freigeben |
|
||||||
| `POST` | `/api/shops/bulk-deactivate` | Massendeaktivierung |
|
| `/api/change-password` | POST | Passwort ändern |
|
||||||
| `POST` | `/api/change-password` | Passwort ändern |
|
|
||||||
| `GET` | `/api/shop/{domain}/history` | Shop-Historie |
|
|
||||||
|
|
||||||
### Aktivierung Parameter
|
### Aktivierung Parameter
|
||||||
|
|
||||||
```
|
| Parameter | Werte | Beschreibung |
|
||||||
POST /api/shops/activate
|
|-----------|-------|--------------|
|
||||||
Content-Type: application/x-www-form-urlencoded
|
| `domain` | String | Shop-Domain |
|
||||||
|
| `mode` | `bot`, `geoip` | Blocking-Modus |
|
||||||
domain=example.com
|
| `geo_region` | `dach`, `eurozone` | Nur bei GeoIP-Mode |
|
||||||
mode=bot|geoip
|
| `rate_limit` | Integer | Requests/min (nur Bot-Mode) |
|
||||||
geo_region=dach|eurozone # nur bei mode=geoip
|
| `ban_duration` | Integer | Sekunden (nur Bot-Mode) |
|
||||||
rate_limit=30 # nur bei mode=bot
|
| `bot_monitor_only` | `true`/`false` | Nur Logging (nur Bot-Mode) |
|
||||||
ban_duration=300 # nur bei mode=bot (Sekunden)
|
|
||||||
```
|
|
||||||
|
|
||||||
### Massenaktivierung Parameter
|
|
||||||
|
|
||||||
```
|
|
||||||
POST /api/shops/bulk-activate
|
|
||||||
Content-Type: application/x-www-form-urlencoded
|
|
||||||
|
|
||||||
mode=bot|geoip
|
|
||||||
geo_region=dach|eurozone
|
|
||||||
rate_limit=30
|
|
||||||
ban_duration=300
|
|
||||||
filter_type=all|direct|link11
|
|
||||||
```
|
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## 📡 WebSocket Events
|
## 🔌 WebSocket Events
|
||||||
|
|
||||||
### Endpoint: `/ws/agent` (Agent → Dashboard)
|
### Endpoint: `/ws/agent` (Agent → Dashboard)
|
||||||
|
|
||||||
| Event | Richtung | Beschreibung |
|
| Event | Richtung | Beschreibung |
|
||||||
|-------|----------|--------------|
|
|-------|----------|--------------|
|
||||||
| `agent.connect` | Agent → Dashboard | Agent-Registrierung |
|
| `agent.connect` | Agent → Dashboard | Agent-Registrierung |
|
||||||
| `agent.heartbeat` | Agent → Dashboard | System-Status (alle 30s) |
|
| `agent.heartbeat` | Agent → Dashboard | System-Status (alle 60s) |
|
||||||
| `shop.full_update` | Agent → Dashboard | Alle Shop-Daten |
|
| `shop.full_update` | Agent → Dashboard | Alle Shop-Daten |
|
||||||
| `shop.stats` | Agent → Dashboard | Shop-Statistiken (alle 10s) |
|
| `shop.stats` | Agent → Dashboard | Shop-Statistiken (alle 10s) |
|
||||||
| `log.entry` | Agent → Dashboard | Log-Zeile (bei Subscription) |
|
| `log.entry` | Agent → Dashboard | Log-Zeile (bei Subscription) |
|
||||||
@@ -493,7 +582,7 @@ filter_type=all|direct|link11
|
|||||||
"agent_id": "a1b2c3d4e5f6",
|
"agent_id": "a1b2c3d4e5f6",
|
||||||
"hostname": "shop020.jtl-hosting.de",
|
"hostname": "shop020.jtl-hosting.de",
|
||||||
"token": "stored-token-or-null",
|
"token": "stored-token-or-null",
|
||||||
"version": "2.3.0",
|
"version": "2.4.0",
|
||||||
"os_info": {
|
"os_info": {
|
||||||
"system": "Linux",
|
"system": "Linux",
|
||||||
"release": "5.15.0",
|
"release": "5.15.0",
|
||||||
@@ -507,13 +596,23 @@ filter_type=all|direct|link11
|
|||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
### Shop Stats
|
### Shop Full Update
|
||||||
|
|
||||||
```json
|
```json
|
||||||
{
|
{
|
||||||
"type": "shop.stats",
|
"type": "shop.full_update",
|
||||||
"data": {
|
"data": {
|
||||||
"domain": "example.com",
|
"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": {
|
"stats": {
|
||||||
"log_entries": 15234,
|
"log_entries": 15234,
|
||||||
"total_bans": 47,
|
"total_bans": 47,
|
||||||
@@ -545,9 +644,10 @@ filter_type=all|direct|link11
|
|||||||
"command_id": "cmd_abc123",
|
"command_id": "cmd_abc123",
|
||||||
"shop": "example.com",
|
"shop": "example.com",
|
||||||
"mode": "bot",
|
"mode": "bot",
|
||||||
"geo_region": null,
|
"geo_region": "none",
|
||||||
"rate_limit": 30,
|
"rate_limit": 30,
|
||||||
"ban_duration": 300
|
"ban_duration": 300,
|
||||||
|
"bot_monitor_only": false
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
@@ -567,7 +667,7 @@ journalctl -u jtl-wafi -f
|
|||||||
lsof -i :8000
|
lsof -i :8000
|
||||||
|
|
||||||
# 2. Python-Pakete fehlen
|
# 2. Python-Pakete fehlen
|
||||||
pip3 install fastapi uvicorn websockets python-multipart --break-system-packages
|
pip3 install fastapi uvicorn python-multipart --break-system-packages
|
||||||
|
|
||||||
# 3. SSL-Verzeichnis fehlt
|
# 3. SSL-Verzeichnis fehlt
|
||||||
mkdir -p /var/lib/jtl-wafi/ssl
|
mkdir -p /var/lib/jtl-wafi/ssl
|
||||||
@@ -588,13 +688,16 @@ telnet dashboard 8000
|
|||||||
|
|
||||||
# 3. SSL-Zertifikat Problem (selbstsigniert)
|
# 3. SSL-Zertifikat Problem (selbstsigniert)
|
||||||
# Agent akzeptiert selbstsignierte Zertifikate automatisch
|
# Agent akzeptiert selbstsignierte Zertifikate automatisch
|
||||||
|
|
||||||
|
# 4. websockets-Modul fehlt
|
||||||
|
pip3 install websockets --break-system-packages
|
||||||
```
|
```
|
||||||
|
|
||||||
### Agent wird nicht freigegeben
|
### Agent wird nicht freigegeben
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
# Token manuell löschen und neu verbinden
|
# Token manuell löschen und neu verbinden
|
||||||
rm /etc/jtl-wafi-agent/token
|
rm /etc/jtl-wafi/token
|
||||||
systemctl restart jtl-wafi-agent
|
systemctl restart jtl-wafi-agent
|
||||||
```
|
```
|
||||||
|
|
||||||
@@ -604,32 +707,52 @@ systemctl restart jtl-wafi-agent
|
|||||||
# Agent Logs prüfen
|
# Agent Logs prüfen
|
||||||
journalctl -u jtl-wafi-agent | grep -i shop
|
journalctl -u jtl-wafi-agent | grep -i shop
|
||||||
|
|
||||||
# Nginx Konfiguration prüfen
|
# Shop-Verzeichnisse prüfen (muss index.php enthalten)
|
||||||
ls -la /etc/nginx/sites-enabled/
|
ls -la /var/www/vhosts/*/httpdocs/index.php
|
||||||
|
|
||||||
# Shop-Verzeichnisse prüfen
|
|
||||||
ls -la /var/www/
|
|
||||||
```
|
```
|
||||||
|
|
||||||
### Bans funktionieren nicht
|
### Blocking funktioniert nicht
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
# iptables Regeln prüfen
|
# Prüfe ob jtl-wafi.php existiert
|
||||||
iptables -L -n | grep -i drop
|
ls -la /var/www/vhosts/DOMAIN/httpdocs/jtl-wafi.php
|
||||||
|
|
||||||
# Berechtigungen prüfen (Agent braucht root)
|
# Prüfe ob index.php modifiziert wurde
|
||||||
whoami
|
head -20 /var/www/vhosts/DOMAIN/httpdocs/index.php
|
||||||
# Muss "root" sein
|
# 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 funktioniert nicht
|
### GeoIP Cache-Probleme
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
# Datenbank prüfen
|
# Cache-Datei prüfen
|
||||||
ls -la /var/lib/GeoIP/GeoLite2-Country.mmdb
|
ls -la /var/www/vhosts/DOMAIN/httpdocs/jtl-wafi_ip_ranges.cache
|
||||||
|
|
||||||
# Download falls fehlend
|
# Cache löschen (wird automatisch neu erstellt)
|
||||||
# https://dev.maxmind.com/geoip/geolite2-free-geolocation-data
|
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
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 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
|
### Dashboard reagiert langsam
|
||||||
@@ -649,7 +772,19 @@ ulimit -n 65535
|
|||||||
|
|
||||||
## 📝 Changelog
|
## 📝 Changelog
|
||||||
|
|
||||||
### v2.3.0 (2024-12-19)
|
### 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
|
#### Neue Features
|
||||||
- **🔥 Top 10 Shops** - Neue Übersichtskarte mit meistbelasteten Shops
|
- **🔥 Top 10 Shops** - Neue Übersichtskarte mit meistbelasteten Shops
|
||||||
@@ -661,13 +796,9 @@ ulimit -n 65535
|
|||||||
- Dropdown bei Massenaktionen entfernt (Filter jetzt im Modal)
|
- Dropdown bei Massenaktionen entfernt (Filter jetzt im Modal)
|
||||||
- Laufzeit-Anzeige korrigiert
|
- Laufzeit-Anzeige korrigiert
|
||||||
- Graph zeigt jetzt Uhrzeiten auf X-Achse
|
- Graph zeigt jetzt Uhrzeiten auf X-Achse
|
||||||
- Agent-Logging verbessert (zeigt Rate-Limit statt Region bei Bot-Mode)
|
- Agent-Logging verbessert
|
||||||
|
|
||||||
#### Fixes
|
### v2.2.0 (2024-12)
|
||||||
- Laufzeit wird jetzt korrekt angezeigt
|
|
||||||
- Graph-Skalierung verbessert
|
|
||||||
|
|
||||||
### v2.2.0 (2024-12-19)
|
|
||||||
|
|
||||||
#### Architektur-Änderung
|
#### Architektur-Änderung
|
||||||
- **In-Memory Storage** statt SQLite für Echtzeit-Daten
|
- **In-Memory Storage** statt SQLite für Echtzeit-Daten
|
||||||
@@ -678,7 +809,7 @@ ulimit -n 65535
|
|||||||
- Passwort in JSON-Datei statt Datenbank
|
- Passwort in JSON-Datei statt Datenbank
|
||||||
- Agent-Tokens in JSON-Datei statt Datenbank
|
- Agent-Tokens in JSON-Datei statt Datenbank
|
||||||
|
|
||||||
### v2.1.0 (2024-12-19)
|
### v2.1.0 (2024-12)
|
||||||
|
|
||||||
#### Neue Features
|
#### Neue Features
|
||||||
- **Link11 Kategorisierung** - Shops werden nach CDN/Direkt getrennt
|
- **Link11 Kategorisierung** - Shops werden nach CDN/Direkt getrennt
|
||||||
@@ -692,13 +823,14 @@ ulimit -n 65535
|
|||||||
- Agent Ctrl+C Shutdown funktioniert jetzt sofort
|
- Agent Ctrl+C Shutdown funktioniert jetzt sofort
|
||||||
- Asyncio Signal Handler korrekt implementiert
|
- Asyncio Signal Handler korrekt implementiert
|
||||||
|
|
||||||
### v2.0.0 (2024-12-19)
|
### v2.0.0 (2024-12)
|
||||||
|
|
||||||
#### Komplett neu
|
#### Komplett neu
|
||||||
- WebSocket-basierte Architektur
|
- WebSocket-basierte Architektur
|
||||||
- Echtzeit-Updates ohne Polling
|
- Echtzeit-Updates ohne Polling
|
||||||
- Multi-Agent Support
|
- Multi-Agent Support
|
||||||
- Neue moderne UI
|
- Neue moderne UI
|
||||||
|
- PHP-basiertes Blocking (kein iptables)
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user