feat: GeoIP-Länderfilter mit MaxMind Auto-Download

This commit is contained in:
2026-04-14 20:30:37 +02:00
parent 4d7e053ce7
commit 3d60771a1b
9 changed files with 1231 additions and 3 deletions

View File

@@ -330,6 +330,7 @@ cleanup() {
fi
stop_blocklist_worker
stop_whitelist_worker
stop_geoip_worker
rm -f "$PID_FILE"
exit 0
}
@@ -987,6 +988,17 @@ show_status() {
echo ""
fi
# GeoIP-Filter Info
if [[ "${GEOIP_ENABLED:-false}" == "true" ]]; then
local geoip_mode_label
[[ "${GEOIP_MODE:-blocklist}" == "blocklist" ]] && geoip_mode_label="Blocklist" || geoip_mode_label="Allowlist"
echo " 🌍 GeoIP-Filter: AKTIV"
echo " Modus: ${geoip_mode_label}"
echo " Länder: ${GEOIP_COUNTRIES:-<keine>}"
echo " Sperrdauer: PERMANENT (Auto-Unban bei Änderung der Länderliste)"
echo ""
fi
# Aktive Sperren
local ban_count=0
if [[ -d "$STATE_DIR" ]]; then
@@ -1212,6 +1224,39 @@ stop_whitelist_worker() {
fi
}
# ─── GeoIP-Worker starten ────────────────────────────────────────────────────
start_geoip_worker() {
if [[ "${GEOIP_ENABLED:-false}" != "true" ]]; then
log "DEBUG" "GeoIP-Worker ist deaktiviert"
return
fi
local worker_script="${SCRIPT_DIR}/geoip-worker.sh"
if [[ ! -f "$worker_script" ]]; then
log "WARN" "GeoIP-Worker Script nicht gefunden: $worker_script"
return
fi
log "INFO" "Starte GeoIP-Worker im Hintergrund..."
bash "$worker_script" start &
GEOIP_WORKER_PID=$!
log "INFO" "GeoIP-Worker gestartet (PID: $GEOIP_WORKER_PID)"
}
# ─── GeoIP-Worker stoppen ────────────────────────────────────────────────────
stop_geoip_worker() {
local worker_pid_file="/var/run/adguard-geoip-worker.pid"
if [[ -f "$worker_pid_file" ]]; then
local wpid
wpid=$(cat "$worker_pid_file")
if kill -0 "$wpid" 2>/dev/null; then
log "INFO" "Stoppe GeoIP-Worker (PID: $wpid)..."
kill "$wpid" 2>/dev/null || true
rm -f "$worker_pid_file"
fi
fi
}
# ─── Hauptschleife ──────────────────────────────────────────────────────────
main_loop() {
log "INFO" "═══════════════════════════════════════════════════════════"
@@ -1238,6 +1283,11 @@ main_loop() {
else
log "INFO" " AbuseIPDB Reporting: deaktiviert"
fi
if [[ "${GEOIP_ENABLED:-false}" == "true" ]]; then
log "INFO" " GeoIP-Filter: AKTIV (Modus: ${GEOIP_MODE:-blocklist}, Länder: ${GEOIP_COUNTRIES:-<keine>})"
else
log "INFO" " GeoIP-Filter: deaktiviert"
fi
log "INFO" "═══════════════════════════════════════════════════════════"
# Service-Start-Benachrichtigung senden
@@ -1251,6 +1301,9 @@ main_loop() {
# Whitelist-Worker als Hintergrundprozess starten
start_whitelist_worker
# GeoIP-Worker als Hintergrundprozess starten
start_geoip_worker
while true; do
# Abgelaufene Sperren prüfen
check_expired_bans
@@ -1344,6 +1397,47 @@ case "${1:-start}" in
echo "Whitelist-Worker nicht gefunden"
fi
;;
geoip-status)
init_directories
_worker_script="${SCRIPT_DIR}/geoip-worker.sh"
if [[ -f "$_worker_script" ]]; then
bash "$_worker_script" status
else
echo "GeoIP-Worker nicht gefunden"
fi
;;
geoip-sync)
init_directories
setup_iptables_chain
_worker_script="${SCRIPT_DIR}/geoip-worker.sh"
if [[ -f "$_worker_script" ]]; then
bash "$_worker_script" sync
else
echo "GeoIP-Worker nicht gefunden"
fi
;;
geoip-flush)
init_directories
_worker_script="${SCRIPT_DIR}/geoip-worker.sh"
if [[ -f "$_worker_script" ]]; then
bash "$_worker_script" flush
else
echo "GeoIP-Worker nicht gefunden"
fi
;;
geoip-lookup)
if [[ -z "${2:-}" ]]; then
echo "Nutzung: $0 geoip-lookup <IP-Adresse>" >&2
exit 1
fi
init_directories
_worker_script="${SCRIPT_DIR}/geoip-worker.sh"
if [[ -f "$_worker_script" ]]; then
bash "$_worker_script" lookup "$2"
else
echo "GeoIP-Worker nicht gefunden"
fi
;;
status)
init_directories
show_status
@@ -1407,7 +1501,7 @@ Service-Steuerung (empfohlen):
sudo systemctl restart adguard-shield
sudo systemctl status adguard-shield
Nutzung: $0 {status|history|flush|unban|reset-offenses|test|dry-run|blocklist-status|blocklist-sync|blocklist-flush|whitelist-status|whitelist-sync|whitelist-flush}
Nutzung: $0 {status|history|flush|unban|reset-offenses|test|dry-run|blocklist-status|blocklist-sync|blocklist-flush|whitelist-status|whitelist-sync|whitelist-flush|geoip-status|geoip-sync|geoip-flush|geoip-lookup}
Verwaltungsbefehle:
status Zeigt aktive Sperren, Regeln und Wiederholungstäter
@@ -1423,6 +1517,10 @@ Verwaltungsbefehle:
whitelist-status Zeigt Status der externen Whitelisten
whitelist-sync Einmalige Synchronisation der externen Whitelisten
whitelist-flush Entfernt alle aufgelösten Whitelist-IPs
geoip-status Zeigt Status der GeoIP-Länderfilter
geoip-sync Einmalige GeoIP-Prüfung aller aktiven Clients
geoip-flush Alle GeoIP-Sperren aufheben
geoip-lookup IP GeoIP-Lookup für eine einzelne IP-Adresse
Interne Befehle (nicht direkt verwenden — nur über systemd):
start Startet den Monitor im Vordergrund