AbuseIPDB nun implementiert. IPs werden gemeldet, wenn sie permanent geblockt werden.
This commit is contained in:
@@ -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
|
||||||
|
|||||||
@@ -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"
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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:
|
||||||
|
|||||||
Reference in New Issue
Block a user