iptables (und / oder netfilter) hat verschiedene Haken im Routing-Stack. Wenn ein Paket einen bestimmten Schritt im Routing-Stack durchläuft und dort ein iptables-Hook vorhanden ist, wird der iptables-Hook ausgeführt. Wenn das Paket einen solchen Schritt nicht erreicht, wird natürlich kein iptables-Hook ausgeführt. Wenn es "keine Route zum Hosten" gibt, gibt der Routing-Stack früher auf und erreicht diese Schritte nicht. Das ist, was in Ihrem Beispiel passiert, nachdem Sie die Routen der (Haupttabelle) gelöscht und eine Routing-Tabelle hinterlassen haben, die davon abhängig ist, dass iptables verwendet wird. Das ist ein Henne-und-Eier-Problem, aber es muss nicht alles so gemacht werden. Sie brauchen nur eine Route, eine beliebige Route, damit Ihre Regeln diese Route auslösen und ändern.
Ich lief dein Skript und bekam mit meinen Einstellungen:
# ip route (nothing) # ip route show table 4 default via 10.0.3.1 dev eth0 10.0.3.0/24 dev eth0 proto kernel scope link src 10.0.3.66
Die OUTPUT-Regeln hinzugefügt:
iptables -t mangle -A OUTPUT -p udp -m udp --dport 53 -j MARK --set-xmark 0x4/0xffffffff iptables -t mangle -A OUTPUT -p tcp -m tcp --dport 53 -j MARK --set-xmark 0x4/0xffffffff iptables -t mangle -A OUTPUT -p tcp -m tcp --dport 443 -j MARK --set-xmark 0x4/0xffffffff iptables -t mangle -A OUTPUT -p tcp -m tcp --dport 80 -j MARK --set-xmark 0x4/0xffffffff
Nichts funktioniert.
Die LAN-Route und ein falsches, falsches Gateway 10.0.3.9 wurden hinzugefügt:
# ip route default via 10.0.3.9 dev eth0 10.0.3.0/24 dev eth0 scope link # ip neigh flush dev eth0 # ping 8.8.8.8 PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data. ^C --- 8.8.8.8 ping statistics --- 2 packets transmitted, 0 received, 100% packet loss, time 1006ms # ip neigh 10.0.3.9 dev eth0 FAILED # ip neigh del 10.0.3.9 dev eth0 # dig +short @8.8.8.8 google.com. 172.217.22.142 # ip neigh 10.0.3.1 dev eth0 lladdr fe:d6:50:75:27:c9 REACHABLE
Beachten Sie, dass jetzt die Route aus Tabelle 4 verwendet wurde. Es brauchte aber zuerst eine Arbeitsroute ("on the paper", auch wenn sie nicht wirklich funktioniert), sonst hätte die Routing-Entscheidung allein die Anwendung der OUTPUT-Regel verhindert. Sie können es mit iptables-save -c
sehen, um Zähler zu sehen.