geoblock: Regeln an den Chain-Anfang setzen + Reassert-Watchdog fuer gemanagte Firewalls
Problem: auf Hosts mit gemanagter Firewall (z.B. Endian-UTM) stand die DROP-Regel am Ende der INPUT-Chain (-A) und wurde von einer ACCEPT-Regel davor abgefangen -> Geoblocking griff nicht, obwohl Set/Config korrekt waren. geoblock.py: - DROP-Regel jetzt wie die LOG-Regel per 'iptables -I' an den ANFANG der Chain (Reihenfolge LOG -> DROP). Rule-Setzen in set_iptables_rules() refaktoriert. - Neue Aktion --reassert: leichtgewichtiger Watchdog, der die Regel-Position prueft und die Regeln nur bei Bedarf wieder nach oben setzt -- OHNE Zonefiles von ipdeny nachzuladen (nutzt bestehendes ipset). Kein Eingriff, wenn kein ipset existiert (dann erst voller --apply noetig). - geoblock_rules_on_top(): erkennt, ob die Regeln luueckenlos die ersten der Chain sind. --status zeigt die Position jetzt mit an. systemd: - geoblock-reassert.service + .timer (alle 2 Min, opt-in via install_geoblock.sh --with-watchdog). uninstall raeumt sie mit ab und stoppt sie vor --remove. README: Abschnitt "Regeln bleiben nicht oben (gemanagte Firewall)" + tcpdump- Diagnose (anonymisiert) + Fehlersuche-Abschnitt. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 4.8
parent
4fce0cd7f0
commit
b170759657
+36
-2
@@ -7,7 +7,7 @@
|
||||
# aktualisiert.
|
||||
#
|
||||
# Nutzung (als root, im Verzeichnis mit allen Repo-Dateien):
|
||||
# sudo ./install_geoblock.sh [--with-testserver] [ZIELVERZEICHNIS]
|
||||
# sudo ./install_geoblock.sh [--with-testserver] [--with-watchdog] [ZIELVERZEICHNIS]
|
||||
#
|
||||
# Der kleine Test-Webserver (geoblock_testserver.py +
|
||||
# geoblock-testserver.service), gegen den man von aussen connecten
|
||||
@@ -16,10 +16,18 @@
|
||||
# in Sachen Testserver gar nichts (kein Copy, kein systemd-Unit, kein
|
||||
# offener Port).
|
||||
#
|
||||
# Der Reassert-Watchdog (geoblock-reassert.service + .timer) prueft alle
|
||||
# 2 Minuten, ob die Block-Regeln noch am Anfang der iptables-Chain stehen,
|
||||
# und setzt sie ggf. wieder nach oben (ohne ipdeny-Download). Nur noetig auf
|
||||
# Hosts mit einer gemanagten Firewall (Shorewall/firewalld/UFW/UTM-Appliance),
|
||||
# die die Chain neu baut und dabei fremde Regeln nach unten schiebt. Wird NUR
|
||||
# bei --with-watchdog installiert/aktiviert.
|
||||
#
|
||||
# Beispiele:
|
||||
# sudo ./install_geoblock.sh
|
||||
# sudo ./install_geoblock.sh --with-testserver
|
||||
# sudo ./install_geoblock.sh --with-testserver /opt/geoblock
|
||||
# sudo ./install_geoblock.sh --with-watchdog
|
||||
# sudo ./install_geoblock.sh --with-testserver --with-watchdog /opt/geoblock
|
||||
# sudo ./install_geoblock.sh /opt/geoblock
|
||||
#
|
||||
# Benoetigt im selben Verzeichnis:
|
||||
@@ -30,6 +38,9 @@
|
||||
# (nur bei --with-testserver:)
|
||||
# geoblock_testserver.py
|
||||
# geoblock-testserver.service
|
||||
# (nur bei --with-watchdog:)
|
||||
# geoblock-reassert.service
|
||||
# geoblock-reassert.timer
|
||||
#
|
||||
# Voraussetzungen auf dem Host: python3, iptables, ipset, systemd.
|
||||
|
||||
@@ -43,12 +54,16 @@ fi
|
||||
SRC_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
||||
|
||||
WITH_TESTSERVER=0
|
||||
WITH_WATCHDOG=0
|
||||
INSTALL_DIR=""
|
||||
for arg in "$@"; do
|
||||
case "$arg" in
|
||||
--with-testserver)
|
||||
WITH_TESTSERVER=1
|
||||
;;
|
||||
--with-watchdog)
|
||||
WITH_WATCHDOG=1
|
||||
;;
|
||||
-h|--help)
|
||||
grep '^# ' "${BASH_SOURCE[0]}" | sed 's/^# \{0,1\}//'
|
||||
exit 0
|
||||
@@ -65,6 +80,9 @@ REQUIRED_FILES=(geoblock.py geoblock.ini.example geoblock.service geoblock.timer
|
||||
if [[ "$WITH_TESTSERVER" -eq 1 ]]; then
|
||||
REQUIRED_FILES+=(geoblock_testserver.py geoblock-testserver.service)
|
||||
fi
|
||||
if [[ "$WITH_WATCHDOG" -eq 1 ]]; then
|
||||
REQUIRED_FILES+=(geoblock-reassert.service geoblock-reassert.timer)
|
||||
fi
|
||||
|
||||
for f in "${REQUIRED_FILES[@]}"; do
|
||||
if [[ ! -f "$SRC_DIR/$f" ]]; then
|
||||
@@ -114,6 +132,15 @@ else
|
||||
echo "==> Test-Webserver wird NICHT installiert (Option --with-testserver nicht angegeben)."
|
||||
fi
|
||||
|
||||
if [[ "$WITH_WATCHDOG" -eq 1 ]]; then
|
||||
echo "==> --with-watchdog gesetzt: installiere Reassert-Watchdog (haelt die Regeln am Chain-Anfang)"
|
||||
sed "s#__INSTALL_DIR__#$INSTALL_DIR#g" "$SRC_DIR/geoblock-reassert.service" \
|
||||
> /etc/systemd/system/geoblock-reassert.service
|
||||
cp "$SRC_DIR/geoblock-reassert.timer" /etc/systemd/system/geoblock-reassert.timer
|
||||
else
|
||||
echo "==> Reassert-Watchdog wird NICHT installiert (Option --with-watchdog nicht angegeben)."
|
||||
fi
|
||||
|
||||
systemctl daemon-reload
|
||||
systemctl enable --now geoblock.timer
|
||||
|
||||
@@ -121,12 +148,19 @@ if [[ "$WITH_TESTSERVER" -eq 1 ]]; then
|
||||
systemctl enable --now geoblock-testserver.service
|
||||
fi
|
||||
|
||||
if [[ "$WITH_WATCHDOG" -eq 1 ]]; then
|
||||
systemctl enable --now geoblock-reassert.timer
|
||||
fi
|
||||
|
||||
echo ""
|
||||
echo "==> Fertig."
|
||||
echo " Config anpassen: $INSTALL_DIR/geoblock.ini"
|
||||
echo " Jetzt sofort testen: systemctl start geoblock.service && journalctl -u geoblock.service -f"
|
||||
echo " Timer-Status: systemctl list-timers geoblock.timer"
|
||||
echo " Naechste/letzte Läufe: systemctl status geoblock.timer"
|
||||
if [[ "$WITH_WATCHDOG" -eq 1 ]]; then
|
||||
echo " Watchdog-Status: systemctl list-timers geoblock-reassert.timer"
|
||||
fi
|
||||
echo " Log-Datei: $LOG_DIR/geoblock.log"
|
||||
if [[ "$WITH_TESTSERVER" -eq 1 ]]; then
|
||||
echo " Test-Webserver: systemctl status geoblock-testserver.service"
|
||||
|
||||
Reference in New Issue
Block a user