Geoblocking: Script, systemd Timer, checkmk Plugin, Installer
This commit is contained in:
@@ -0,0 +1,107 @@
|
||||
# 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](https://www.ipdeny.com/ipblocks/).
|
||||
|
||||
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):
|
||||
|
||||
```bash
|
||||
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.ini` nach `/opt/aria-geoblock/`
|
||||
(bestehende `.ini` wird 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:
|
||||
|
||||
```bash
|
||||
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)
|
||||
|
||||
```bash
|
||||
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:
|
||||
|
||||
1. Im Script-Kopf `LOG_FILE` auf den Pfad aus der `.ini` (`log_file`) anpassen.
|
||||
2. Ausfuehrbar machen und kopieren:
|
||||
```bash
|
||||
chmod 755 aria_geoblock_checkmk
|
||||
cp aria_geoblock_checkmk /usr/lib/check_mk_agent/local/
|
||||
```
|
||||
(Pfad haengt vom Setup ab — bei OMD-Sites z.B.
|
||||
`~/local/lib/check_mk_agent/local/`.)
|
||||
3. 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 pruefen
|
||||
- `log`: iptables-LOG-Eintrag vor dem DROP (dmesg/kern.log) an/aus
|
||||
- `ipset_name`: Name des ipset-Sets
|
||||
- `log_file`: Pfad zur script-eigenen Log-Datei (fuer checkmk)
|
||||
Reference in New Issue
Block a user