AbuseIPDB nun implementiert. IPs werden gemeldet, wenn sie permanent geblockt werden.

This commit is contained in:
2026-03-04 22:05:02 +01:00
parent 449b285c12
commit efe14fd0cd
4 changed files with 113 additions and 0 deletions

View File

@@ -29,6 +29,7 @@ Wenn ein Client eine bestimmte Domain zu oft anfragt (z.B. >30x pro Minute), wir
- Eigene iptables Chain — greift nicht in bestehende Regeln ein - Eigene iptables Chain — greift nicht in bestehende Regeln ein
- Automatisches Entsperren nach konfigurierbarer Dauer - Automatisches Entsperren nach konfigurierbarer Dauer
- **Externe Blocklisten** — IP-Adressen von externen Textdateien (URLs) laden und automatisch sperren - **Externe Blocklisten** — IP-Adressen von externen Textdateien (URLs) laden und automatisch sperren
- **AbuseIPDB Reporting** — permanent gesperrte IPs automatisch an AbuseIPDB melden
- **Ban-History** — lückenlose Protokollierung aller Sperren/Entsperrungen mit Zeitstempel - **Ban-History** — lückenlose Protokollierung aller Sperren/Entsperrungen mit Zeitstempel
- Whitelist für vertrauenswürdige IPs - Whitelist für vertrauenswürdige IPs
- Dry-Run Modus zum gefahrlosen Testen - Dry-Run Modus zum gefahrlosen Testen

View File

@@ -136,6 +136,19 @@ PROGRESSIVE_BAN_MAX_LEVEL=5
# (86400 = 24 Stunden, 604800 = 7 Tage) # (86400 = 24 Stunden, 604800 = 7 Tage)
PROGRESSIVE_BAN_RESET_AFTER=86400 PROGRESSIVE_BAN_RESET_AFTER=86400
# --- AbuseIPDB Reporting (optional) ---
# Meldet permanent gesperrte IPs automatisch an AbuseIPDB
# Nur bei PERMANENTEN Sperren wird ein Report gesendet.
ABUSEIPDB_ENABLED=false
# AbuseIPDB API-Key (https://www.abuseipdb.com/account/api)
ABUSEIPDB_API_KEY=""
# Kategorien für den Report (kommagetrennt)
# 4 = DDoS Attack
# Siehe: https://www.abuseipdb.com/categories
ABUSEIPDB_CATEGORIES="4"
# --- Erweiterte Einstellungen --- # --- Erweiterte Einstellungen ---
# Pfad zur State-Datei (speichert aktive Sperren) # Pfad zur State-Datei (speichert aktive Sperren)
STATE_DIR="/var/lib/adguard-shield" STATE_DIR="/var/lib/adguard-shield"

View File

@@ -231,6 +231,58 @@ format_protocol() {
esac esac
} }
# ─── AbuseIPDB Reporting ─────────────────────────────────────────────────────
# Meldet eine IP an AbuseIPDB (nur bei permanenten Sperren)
report_to_abuseipdb() {
local client_ip="$1"
local domain="$2"
local count="$3"
local reason="${4:-rate-limit}"
if [[ "${ABUSEIPDB_ENABLED:-false}" != "true" ]]; then
return 0
fi
if [[ -z "${ABUSEIPDB_API_KEY:-}" ]]; then
log "WARN" "AbuseIPDB: API-Key nicht konfiguriert (ABUSEIPDB_API_KEY ist leer)"
return 1
fi
# Kommentar für AbuseIPDB erstellen (englisch)
local comment
if [[ "$reason" == "subdomain-flood" ]]; then
comment="DNS flooding on our DNS server: ${count}x ${domain} (random subdomain attack). Permanently banned by AdGuard Shield."
else
comment="DNS flooding on our DNS server: ${count}x ${domain}. Permanently banned by AdGuard Shield."
fi
local categories="${ABUSEIPDB_CATEGORIES:-4}"
log "INFO" "AbuseIPDB: Melde IP $client_ip (${comment})"
local http_code
http_code=$(curl -s -o /dev/null -w "%{http_code}" \
--connect-timeout 10 \
--max-time 15 \
-X POST "https://api.abuseipdb.com/api/v2/report" \
-H "Key: ${ABUSEIPDB_API_KEY}" \
-H "Accept: application/json" \
--data-urlencode "ip=${client_ip}" \
--data-urlencode "categories=${categories}" \
--data-urlencode "comment=${comment}" \
2>/dev/null) || true
if [[ "$http_code" == "200" || "$http_code" == "429" ]]; then
if [[ "$http_code" == "429" ]]; then
log "WARN" "AbuseIPDB: Rate-Limit erreicht für $client_ip (HTTP 429) Report wird später erneut versucht"
else
log "INFO" "AbuseIPDB: IP $client_ip erfolgreich gemeldet (HTTP $http_code)"
fi
else
log "ERROR" "AbuseIPDB: Meldung fehlgeschlagen für $client_ip (HTTP ${http_code:-timeout})"
fi
}
# ─── Verzeichnisse erstellen ────────────────────────────────────────────────── # ─── Verzeichnisse erstellen ──────────────────────────────────────────────────
init_directories() { init_directories() {
mkdir -p "$STATE_DIR" mkdir -p "$STATE_DIR"
@@ -401,6 +453,11 @@ EOF
if [[ "$NOTIFY_ENABLED" == "true" ]]; then if [[ "$NOTIFY_ENABLED" == "true" ]]; then
send_notification "ban" "$client_ip" "$domain" "$count" "$offense_level" "$duration_display" "$reason" "$window" "$protocol" send_notification "ban" "$client_ip" "$domain" "$count" "$offense_level" "$duration_display" "$reason" "$window" "$protocol"
fi fi
# AbuseIPDB Report (nur bei permanenter Sperre)
if [[ "$is_permanent" == "true" ]]; then
report_to_abuseipdb "$client_ip" "$domain" "$count" "$reason" &
fi
} }
# ─── Client entsperren ────────────────────────────────────────────────────── # ─── Client entsperren ──────────────────────────────────────────────────────
@@ -1056,6 +1113,11 @@ main_loop() {
else else
log "INFO" " Subdomain-Flood-Schutz: deaktiviert" log "INFO" " Subdomain-Flood-Schutz: deaktiviert"
fi fi
if [[ "${ABUSEIPDB_ENABLED:-false}" == "true" ]]; then
log "INFO" " AbuseIPDB Reporting: AKTIV (Kategorien: ${ABUSEIPDB_CATEGORIES:-4})"
else
log "INFO" " AbuseIPDB Reporting: deaktiviert"
fi
log "INFO" "═══════════════════════════════════════════════════════════" log "INFO" "═══════════════════════════════════════════════════════════"
# Service-Start-Benachrichtigung senden # Service-Start-Benachrichtigung senden

View File

@@ -142,7 +142,44 @@ Ermöglicht das Einbinden externer IP-Blocklisten (z.B. gehostete Textdateien mi
| `EXTERNAL_BLOCKLIST_BAN_DURATION` | `0` | Sperrdauer in Sekunden (0 = permanent bis IP aus Liste entfernt) | | `EXTERNAL_BLOCKLIST_BAN_DURATION` | `0` | Sperrdauer in Sekunden (0 = permanent bis IP aus Liste entfernt) |
| `EXTERNAL_BLOCKLIST_AUTO_UNBAN` | `true` | IPs automatisch entsperren wenn aus Liste entfernt | | `EXTERNAL_BLOCKLIST_AUTO_UNBAN` | `true` | IPs automatisch entsperren wenn aus Liste entfernt |
| `EXTERNAL_BLOCKLIST_CACHE_DIR` | `/var/lib/adguard-shield/external-blocklist` | Lokaler Cache für heruntergeladene Listen | | `EXTERNAL_BLOCKLIST_CACHE_DIR` | `/var/lib/adguard-shield/external-blocklist` | Lokaler Cache für heruntergeladene Listen |
### AbuseIPDB Reporting
Meldet permanent gesperrte IPs automatisch an [AbuseIPDB](https://www.abuseipdb.com/). Damit wird die IP in einer öffentlichen Datenbank als missbräuchlich markiert und andere Administratoren können davon profitieren.
> **Wichtig:** Es werden **nur permanent gesperrte IPs** gemeldet — also erst wenn die maximale Progressive-Ban-Stufe erreicht ist. Einzelne temporäre Sperren lösen keinen AbuseIPDB-Report aus.
| Parameter | Standard | Beschreibung |
|-----------|----------|---------------|
| `ABUSEIPDB_ENABLED` | `false` | AbuseIPDB-Reporting aktivieren |
| `ABUSEIPDB_API_KEY` | *(leer)* | API-Key von [abuseipdb.com/account/api](https://www.abuseipdb.com/account/api) |
| `ABUSEIPDB_CATEGORIES` | `4` | Report-Kategorien (4 = DDoS Attack). Siehe [Kategorien](https://www.abuseipdb.com/categories) |
#### AbuseIPDB einrichten
1. Erstelle einen kostenlosen Account auf [abuseipdb.com](https://www.abuseipdb.com/)
2. Erstelle einen API-Key unter [Account → API](https://www.abuseipdb.com/account/api)
3. Aktiviere das Reporting in der Konfiguration:
```bash
ABUSEIPDB_ENABLED=true
ABUSEIPDB_API_KEY="dein-api-key-hier"
ABUSEIPDB_CATEGORIES="4"
```
4. Service neustarten:
```bash
sudo systemctl restart adguard-shield
```
#### Was wird gemeldet?
Der Report an AbuseIPDB enthält (auf Englisch):
- **Bei Rate-Limit:** `DNS flooding on our DNS server: 100x microsoft.com. Permanently banned by AdGuard Shield.`
- **Bei Subdomain-Flood:** `DNS flooding on our DNS server: 85x *.microsoft.com (random subdomain attack). Permanently banned by AdGuard Shield.`
Die Kategorie `4` (DDoS Attack) wird standardmäßig verwendet. Weitere Kategorien können kommagetrennt angegeben werden (z.B. `"4,15"`).
#### Externe Blocklist einrichten #### Externe Blocklist einrichten
1. Erstelle eine Textdatei auf einem Webserver mit einer IP pro Zeile: 1. Erstelle eine Textdatei auf einem Webserver mit einer IP pro Zeile: