diff --git a/.gitignore b/.gitignore index 7a60b85..f98b4f7 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,3 @@ __pycache__/ *.pyc +geoblock.ini diff --git a/README.md b/README.md index e367fef..0863436 100644 --- a/README.md +++ b/README.md @@ -14,7 +14,8 @@ und droppt Pakete bereits auf Netzwerk-Ebene. | Datei | Zweck | |---|---| | `geoblock.py` | Hauptscript: laedt Laender-IPs, setzt/entfernt ipset+iptables-Regeln | -| `geoblock.ini` | Konfiguration (Laenderliste, Chain, Logging, ...) | +| `geoblock.ini.example` | Beispiel-Konfiguration (Vorlage im Repo, siehe unten) | +| `geoblock.ini` | Eure eigene, lokale Konfiguration (Laenderliste, Chain, Logging, ...) — **nicht** im Repo/Git, siehe unten | | `geoblock.service` | systemd-Unit, fuehrt `--apply` aus | | `geoblock.timer` | systemd-Timer: beim Booten + einmal taeglich | | `install_geoblock.sh` | Installer: kopiert alles nach `/opt/geoblock`, richtet Timer ein (Testserver optional, siehe unten) | @@ -34,11 +35,23 @@ sudo ./install_geoblock.sh ``` Das: -- installiert `geoblock.py` + `geoblock.ini` nach `/opt/geoblock/` - (bestehende `.ini` wird NICHT ueberschrieben, neue landet als `.example`) +- installiert `geoblock.py` + `geoblock.ini.example` nach `/opt/geoblock/` + und erzeugt daraus, falls noch keine vorhanden ist, `geoblock.ini` + (bestehende `geoblock.ini` wird NIE ueberschrieben) - legt `/var/log/geoblock/` an - installiert + aktiviert `geoblock.timer` (`systemctl enable --now`) +**Wichtig:** `geoblock.ini` ist eure lokale, echte Konfiguration (Laender, +Ports, ggf. Proxy-Zugangsdaten) — die Datei steht deshalb in `.gitignore` +und wird NIE ins Repo committed. Vorlage/Referenz ist `geoblock.ini.example` +(die landet im Repo und wird bei jeder Installation frisch mitkopiert). +Wer das Script direkt aus dem Repo-Verzeichnis heraus nutzt (ohne +`install_geoblock.sh`), muss die `.ini` einmal selbst anlegen: + +```bash +cp geoblock.ini.example geoblock.ini +``` + **Der Test-Webserver wird standardmaessig NICHT installiert.** Wer ihn braucht (siehe Abschnitt "Verbindungstest" unten), haengt die Option `--with-testserver` an: diff --git a/geoblock.ini.example b/geoblock.ini.example new file mode 100644 index 0000000..c23bb8a --- /dev/null +++ b/geoblock.ini.example @@ -0,0 +1,80 @@ +; Beispiel-Konfiguration fuer geoblock.py +; +; countries: Komma-getrennte ISO-3166-1-alpha-2-Laendercodes (klein- oder +; grossgeschrieben, egal), die geblockt werden sollen. +; Liste der Codes: https://www.ipdeny.com/ipblocks/ +; +; chain: iptables-Chain, in die die DROP-Regel eingehaengt wird. +; INPUT = Verbindungen ZU diesem Host (Standard-Anwendungsfall). +; +; interface: optional, z.B. eth0 -- nur Traffic auf diesem Interface pruefen. +; Leer lassen = alle Interfaces. +; +; log: true/false -- wenn true, wird vor dem DROP ein iptables LOG- +; Eintrag geschrieben (dmesg / /var/log/kern.log), praefixed +; mit log_prefix. Das ist NICHT dasselbe wie log_file (siehe unten)! +; +; ipset_name: Name des ipset-Sets, das alle IP-Bereiche der Laender enthaelt. +; +; log_file: optional Pfad zu einer eigenen Log-Datei des Scripts selbst +; (zusaetzlich zu stderr/systemd-Journal). Bei jedem Lauf wird +; eine Zeile angehaengt, u.a. eine maschinenlesbare +; "RESULT status=OK/ERROR ..."-Zeile. Genau diese wertet das +; mitgelieferte checkmk-Plugin (geoblock_checkmk) aus. +; Leer lassen = keine Datei-Logs. +; Verzeichnis muss existieren und fuer root beschreibbar sein +; (das Installer-Script legt es automatisch an). +; +; ports: optional, Komma-getrennte Liste von Ports/Portbereichen, die +; geblockt werden sollen, z.B. "80,443" oder "8000:9000" (Bereich) +; oder gemischt "22,80,443,8000:8010". +; LEER LASSEN (Standard) = alle Ports/Protokolle werden fuer die +; gelisteten Laender geblockt (klassisches Geoblocking). +; GESETZT = nur diese Ports werden geblockt, der Rest bleibt fuer +; alle Laender offen. Praktisch, um NICHT gleich den ganzen Host +; (inkl. z.B. SSH-Port 22) fuer ein Land zu sperren, sondern nur +; eine einzelne Anwendung/einen Testport (z.B. den mitgelieferten +; Testserver auf 8899) -- schuetzt beim Testen davor, sich selbst +; auszusperren. +; +; protocol: nur relevant wenn "ports" gesetzt ist. tcp (Standard), udp, +; oder "tcp,udp" fuer beides. Fuer die meisten Web-/App-Ports +; reicht "tcp". +; +; proxy: optional, HTTP(S)-Proxy-URL, ueber den das Script ipdeny.com +; erreicht -- fuer Hosts, die zwar aus dem Internet erreichbar +; sind (z.B. hinter Reverse-Proxy/Firewall), selbst aber KEINE +; direkte ausgehende Internetverbindung haben. +; Format: http://host:port oder mit Auth http://user:pass@host:port +; Wird fuer http UND https genutzt (ipdeny liefert per https aus). +; Leer lassen (Standard) = direkte Verbindung, kein Proxy. +; Beispiel: proxy = http://10.0.0.5:3128 + +[geoblock] +countries = RU, CN, KP, IR +chain = INPUT +interface = +log = true +log_prefix = GEOBLOCK-DROP: +ipset_name = geoblock +log_file = /var/log/geoblock/geoblock.log +; Beispiel: leer = klassisches Geoblocking (alle Ports). Zum sicheren Testen +; z.B. "8899" setzen (nur der Testserver wird geblockt, SSH bleibt offen). +ports = +protocol = tcp +; Leer lassen, ausser der Host hat keine direkte Internetverbindung. +proxy = + +; --- Test-Webserver (geoblock_testserver.py) -------------------------- +; Kleiner HTTP-Server ohne Abhaengigkeiten, um Geoblocking-Regeln von aussen +; zu testen (z.B. vom Handy im Mobilfunknetz oder per VPN aus einem anderen +; Land). Siehe README.md Abschnitt "Verbindungstest". +; +; port: TCP-Port, auf dem der Testserver lauscht. +; bind: Bind-Adresse, 0.0.0.0 = alle IPv4-Interfaces (:: fuer IPv6). +; log_file: Pfad zur Request-Log-Datei (Zeit, Client-IP, Pfad, User-Agent +; pro Zeile). Leer lassen = keine Datei-Logs (nur stderr/Journal). +[testserver] +port = 8899 +bind = 0.0.0.0 +log_file = /var/log/geoblock/testserver.log diff --git a/install_geoblock.sh b/install_geoblock.sh index c861bfe..722dc6f 100755 --- a/install_geoblock.sh +++ b/install_geoblock.sh @@ -24,7 +24,7 @@ # # Benoetigt im selben Verzeichnis: # geoblock.py -# geoblock.ini +# geoblock.ini.example # geoblock.service # geoblock.timer # (nur bei --with-testserver:) @@ -61,7 +61,7 @@ done INSTALL_DIR="${INSTALL_DIR:-/opt/geoblock}" LOG_DIR="/var/log/geoblock" -REQUIRED_FILES=(geoblock.py geoblock.ini geoblock.service geoblock.timer) +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 @@ -85,12 +85,12 @@ mkdir -p "$INSTALL_DIR" cp "$SRC_DIR/geoblock.py" "$INSTALL_DIR/geoblock.py" chmod 755 "$INSTALL_DIR/geoblock.py" +cp "$SRC_DIR/geoblock.ini.example" "$INSTALL_DIR/geoblock.ini.example" if [[ -f "$INSTALL_DIR/geoblock.ini" ]]; then echo "==> Bestehende $INSTALL_DIR/geoblock.ini gefunden - wird NICHT ueberschrieben." - cp "$SRC_DIR/geoblock.ini" "$INSTALL_DIR/geoblock.ini.example" - echo " Neue Beispiel-Config liegt unter $INSTALL_DIR/geoblock.ini.example (zum Vergleich)." + echo " Aktuelle Beispiel-Config liegt unter $INSTALL_DIR/geoblock.ini.example (zum Vergleich)." else - cp "$SRC_DIR/geoblock.ini" "$INSTALL_DIR/geoblock.ini" + cp "$SRC_DIR/geoblock.ini.example" "$INSTALL_DIR/geoblock.ini" echo " -> bitte $INSTALL_DIR/geoblock.ini pruefen/anpassen (Laenderliste!)." fi