4.4 KiB
ARIA Geoblocking
Blockt Verbindungen aus bestimmten Laendern auf Kernel-Ebene (iptables + ipset). Die IP-Bereiche je Land kommen kostenlos (kein API-Key) von ipdeny.com.
Kein Live-GeoIP-Lookup pro Verbindung (langsam, meist kostenpflichtig) —
stattdessen der Standardansatz von fail2ban/CSF: die komplette IP-Range-
Liste jedes Landes liegt im Kernel (ipset), iptables matched dagegen
und droppt Pakete bereits auf Netzwerk-Ebene.
Dateien
| Datei | Zweck |
|---|---|
aria_geoblock.py |
Hauptscript: laedt Laender-IPs, setzt/entfernt ipset+iptables-Regeln |
aria_geoblock.ini |
Konfiguration (Laenderliste, Chain, Logging, ...) |
aria-geoblock.service |
systemd-Unit, fuehrt --apply aus |
aria-geoblock.timer |
systemd-Timer: beim Booten + einmal taeglich |
install_aria_geoblock.sh |
Installer: kopiert alles nach /opt/aria-geoblock, richtet Timer ein |
aria_geoblock_checkmk |
checkmk local-check Plugin (manuell kopieren) |
Installation
Auf dem zu schuetzenden Host (root, iptables+ipset+python3 installiert):
git clone https://git.hacker-net.de/Aria-Software/geoblocking-python-script.git
cd geoblocking-python-script
sudo ./install_aria_geoblock.sh
Das:
- installiert
aria_geoblock.py+aria_geoblock.ininach/opt/aria-geoblock/(bestehende.iniwird NICHT ueberschrieben, neue landet als.example) - legt
/var/log/aria_geoblock/an - installiert + aktiviert
aria-geoblock.timer(systemctl enable --now)
Danach /opt/aria-geoblock/aria_geoblock.ini anpassen (Laenderliste!) und
einmal manuell testen:
sudo systemctl start aria-geoblock.service
journalctl -u aria-geoblock.service -f
Der Timer laeuft danach automatisch: ~2 Minuten nach jedem Systemstart
und einmal taeglich (mit bis zu 15min Zufallsversatz, damit nicht alle
Hosts gleichzeitig ipdeny.com anfragen). Verpasste Laeufe (Host war aus)
werden dank Persistent=true beim naechsten Boot nachgeholt.
Manuelle Nutzung (ohne systemd)
sudo python3 aria_geoblock.py --config aria_geoblock.ini --apply # aktivieren/aktualisieren
sudo python3 aria_geoblock.py --config aria_geoblock.ini --apply --dry-run # nur simulieren
sudo python3 aria_geoblock.py --config aria_geoblock.ini --status # Zustand pruefen
sudo python3 aria_geoblock.py --config aria_geoblock.ini --remove # rueckgaengig
--apply ist idempotent (kein doppeltes Anlegen von Regeln) und tauscht
das ipset atomar per swap, damit waehrend der Aktualisierung kein Loch
im Blocking entsteht.
Achtung: iptables-Regeln sind nicht reboot-persistent. Wer das
zusaetzlich braucht: iptables-persistent / netfilter-persistent save
nutzen — der systemd-Timer sorgt aber ohnehin bei jedem Boot fuer einen
frischen --apply-Lauf, das reicht in der Praxis meist aus.
Logging
In aria_geoblock.ini unter log_file einen Pfad eintragen (Default:
/var/log/aria_geoblock/aria_geoblock.log, wird vom Installer angelegt).
Bei jedem Lauf wird eine Zeile angehaengt, u.a. eine maschinenlesbare
RESULT status=OK/ERROR ...-Zeile — genau die wertet das checkmk-Plugin
aus. Leer lassen = keine Datei-Logs (nur stderr/systemd-Journal).
checkmk-Monitoring
aria_geoblock_checkmk ist ein klassisches checkmk local check-Plugin
(kein extra Agent-Plugin-Verzeichnis noetig). Manuell einrichten:
- Im Script-Kopf
LOG_FILEauf den Pfad aus der.ini(log_file) anpassen. - Ausfuehrbar machen und kopieren:
(Pfad haengt vom Setup ab — bei OMD-Sites z.B.
chmod 755 aria_geoblock_checkmk cp aria_geoblock_checkmk /usr/lib/check_mk_agent/local/~/local/lib/check_mk_agent/local/.) - Naechster Agent-Abruf zeigt den Service ARIA_Geoblock.
Status-Logik: ERROR im letzten Lauf → CRIT. Letzter erfolgreicher Lauf
36h alt → WARN, > 72h alt → CRIT (Timer laeuft taeglich, das faengt einen einzelnen verpassten Lauf ab, ohne sofort zu alarmieren). Sonst OK, inkl. Perfdata (Alter in Sekunden, Anzahl geblockter IP-Bereiche).
Konfiguration (aria_geoblock.ini)
Siehe Kommentare in der Datei selbst — kurz:
countries: Komma-Liste ISO-3166-1-alpha-2 Codes (z.B.RU, CN, KP, IR)chain: iptables-Chain (INPUT= eingehender Traffic zu diesem Host)interface: optional, nur ein Interface pruefenlog: iptables-LOG-Eintrag vor dem DROP (dmesg/kern.log) an/ausipset_name: Name des ipset-Setslog_file: Pfad zur script-eigenen Log-Datei (fuer checkmk)