Bei Portweiterleitung/DNAT schreibt der Kernel den Zielport in PREROUTING um, BEVOR der Filter laeuft -- eine Regel auf den oeffentlichen Port (z.B. 1194) matcht dann nie, weil im Filter der interne Port (z.B. 6666/6667) ankommt. Genau der Fall auf Endian-Appliances (public 1194 -> intern 6666-6667, 443 -> 30443). Neue Option 'match_original_dport = true': matcht per 'conntrack --ctorigdstport' den urspruenglichen Zielport (vor DNAT). Dann in 'ports' die OEFFENTLICHEN Ports eintragen -- immun gegen den internen Remap. - build_rule_variants: bei orig-dport eine Regel pro (proto, port), da conntrack --ctorigdstport einwertig ist (kein multiport). _variant_port_args nutzt dann conntrack statt multiport. - load_config: match_original_dport (bool, default false). - show_status zeigt den Match-Modus an. - Doku: geoblock.ini.example + README-Abschnitt "Dienst hinter Portweiterleitung/DNAT". Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
96 lines
4.8 KiB
Plaintext
96 lines
4.8 KiB
Plaintext
; 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(s), in die die DROP-Regel eingehaengt wird. Eine
|
|
; oder komma-getrennt mehrere.
|
|
; INPUT = Verbindungen ZU diesem Host (Standard-Anwendungsfall).
|
|
; FORWARD = durch diesen Host GEROUTETER Traffic -- noetig, wenn der
|
|
; zu schuetzende Dienst hinter einer Firewall/einem Router
|
|
; liegt (z.B. Portweiterleitung/DNAT auf einen internen
|
|
; Host). Beides zugleich: "chain = INPUT, FORWARD".
|
|
;
|
|
; 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".
|
|
;
|
|
; match_original_dport:
|
|
; optional, true/false (Default false). Nur relevant wenn "ports"
|
|
; gesetzt ist. Fuer Dienste hinter einer Portweiterleitung/DNAT
|
|
; (z.B. Endian: public 1194/udp -> intern 6666): iptables sieht im
|
|
; Filter sonst den UMGESCHRIEBENEN Port, nicht den, den der Client
|
|
; gewaehlt hat -- die Regel greift dann nicht. Mit true wird per
|
|
; conntrack der ORIGINAL-Zielport (vor DNAT) gematcht. Dann in "ports"
|
|
; die OEFFENTLICHEN Ports eintragen (z.B. 1194, 443), nicht die
|
|
; internen -- immun gegen den Remap. Meist zusammen mit chain=FORWARD.
|
|
;
|
|
; 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
|