
Ich leite HTTPS-Verbindungen unter Verwendung iptables
von Markierungen und iproute2
Regeln durch einen SSH-Tunnel (-w). Die Gründe, warum ich es auf diese Weise tun muss, sind gelinde gesagt konstruiert, sodass die meisten Alternativlösungen für mich möglicherweise überhaupt nicht funktionieren.
Das Gerät tun0 existiert und funktioniert wie gewünscht, und das Routing funktioniert, wenn ich MARK in der OUTPUT-Kette anwende, aber aus irgendeinem Grund scheint die Routing-Regel nicht zu funktionieren, wenn MARK in der FORWARD-Kette angewendet wird.
Das Betriebssystem ist CentOS 6.7 mit einem 2.6.32-Kernel und 1.4.7 iptables. Die iptables
Markierung und Protokollierung:
# iptables -t mangle -A FORWARD -p tcp --dport 443 -j MARK --set-mark 1
# iptables -t mangle -A OUTPUT -p tcp --dport 443 -j MARK --set-mark 1
# iptables -t mangle -A POSTROUTING -m mark --mark 1 -j LOG --log-prefix "marked: "
Der iproute2
Regelaufbau:
# cat 201 tunneled >> /etc/iproute2/rt_tables
# ip rule add fwmark 1 table tunneled
# ip route add default via 192.168.100.1 dev tun1 table tunneled
Und ein kleiner Ausschnitt aus dem Protokoll zur Darstellung der Ergebnisse:
Feb 17 19:11:35 nhopm kernel: marked: IN= OUT=eth0 SRC=192.168.82.2 DST=69.30.217.90 LEN=60 TOS=0x00 PREC=0x00 TTL=63 ID=16734 DF PROTO=TCP SPT=34619 DPT=443 WINDOW=29200 RES=0x00 SYN URGP=0 MARK=0x1
Feb 17 19:12:00 nhopm kernel: marked: IN= OUT=tun1 SRC=192.168.81.8 DST=69.30.217.90 LEN=60 TOS=0x00 PREC=0x00 TTL=64 ID=62747 DF PROTO=TCP SPT=55349 DPT=443 WINDOW=14600 RES=0x00 SYN URGP=0 MARK=0x1
Der Host hat 2 Netzwerkkarten, eth0
192.168.81.8, wobei 192.168.81.1 das Standard-Gateway ist und eth1
192.168.82.8 als Standard-Gateway für 192.168.82.0/24 fungiert. Mit dieser Konfiguration gibt es keine Probleme, sie funktioniert wie erwartet. Der Tunnel tun0 hat am anderen Ende 192.168.100.1.
Ich habe versucht, dies auf die einfachste Situation zu reduzieren, die das Problem veranschaulicht, ohne mit Details zu überhäufen, werde aber so viele Details wie nötig liefern, um herauszufinden, wo das Problem liegt. Bitte fragen Sie in den Kommentaren nach allem, was hilfreich sein könnte. Hoffentlich habe ich nur einen kleinen Teil davon missverstanden, wie dies funktioniert.
Problemumgehung
Mein Versuch, das oben genannte zu tun, basierte auf diesem iptables
Flussdiagramm:
von iptables.info
Damit wird die Tatsache verschleiert, dass die gleiche Menge anRouting-Entscheidungwerden auf Pakete aus der OUTPUT-Kette nicht so angewendet wie auf Pakete aus der FORWARD-Kette.
Damit dies funktioniert, musste ich die in der FORWARD-Kette vorgenommene Markierung durch einen ähnlichen Eintrag in der PREROUTING-Kette ersetzen.
iptables -t mangle -A PREROUTING -p tcp --dport 443 ! -d 192.168.0.0/16 -j MARK --set-mark 1
Was meinen Bedürfnissen eigentlich sowieso etwas besser entspricht.
Ich mache das allerdings (noch) nicht zu einer Antwort, da ich noch keine Dokumentation dazu gefunden habe – wenn ich eine finde, werde ich eine Antwort bereitstellen, es sei denn, jemand kommt mir zuvor.