Du bist nah dran.
Der eigentliche Grund dafür, dass die Anwendung den zurückkommenden Datenverkehr nicht sieht, liegt am eingebauten IP-Spoofing-Schutz des Kernels. D.h. der Rückverkehr passt nicht zur Routing-Tabelle und wird daher verworfen. Sie können dies beheben, indem Sie den Spoofing-Schutz wie folgt deaktivieren:
sudo sysctl net.ipv4.conf.wlan0.rp_filter=0
Aber ich würde es nicht empfehlen. Der richtigere Weg ist, eine alternative Routing-Instanz zu erstellen.
- Die Markierung ist notwendig. Behalte es.
- Quell-NAT ist ebenfalls erforderlich.
- Das letzte DNAT ist unnötig, also können Sie es entfernen.
Stellen Sie sicher, dass Sie den iproute
haben Paket installiert. Wenn Sie den ip
haben Befehl, dann sind Sie fertig (wie es aussieht, aber wenn nicht, holen Sie sich das zuerst).
Bearbeiten Sie /etc/iproute2/rt_tables
und fügen Sie eine neue Tabelle hinzu, indem Sie die folgende Zeile anhängen:
200 wlan-route
Anschließend müssen Sie Ihre neue Routingtabelle mit dem Namen wlan-route
konfigurieren mit einem Standard-Gateway und erstellen Sie Regeln zum bedingten Senden von Datenverkehr an diese Tabelle. Ich gehe davon aus, dass Ihr Standard-Gateway 192.168.0.1 ist. Natürlich muss dies zu Ihrem tatsächlichen Netzwerk passen und nicht nur zu meinen Annahmen.
ip route add default via 192.168.0.1 dev wlan0 table wlan-route
ip rule add fwmark 0x1 table wlan-route
Ihr endgültiges kommentiertes Skript würde folgendermaßen aussehen:
# Populate secondary routing table
ip route add default via 192.168.0.1 dev wlan0 table wlan-route
# Anything with this fwmark will use the secondary routing table
ip rule add fwmark 0x1 table wlan-route
# Mark these packets so that iproute can route it through wlan-route
iptables -A OUTPUT -t mangle -o eth1 -p tcp --dport 443 -j MARK --set-mark 1
# now rewrite the src-addr
iptables -A POSTROUTING -t nat -o wlan0 -p tcp --dport 443 -j SNAT --to 192.168.0.2
Bahamats Lösung ist richtig; Bitte beachten Sie jedoch, dass die einzige Möglichkeit für mich, dies zum Laufen zu bringen, darin bestand, den rp_filter für jede Schnittstelle im System zu deaktivieren, nicht nur für die beiden (in diesem Fall eth1 und wlan0), die am NATing beteiligt sind.
for f in /proc/sys/net/ipv4/conf/*/rp_filter; do echo 0 > $f; done
echo 1 > /proc/sys/net/ipv4/route/flush
(Siehe den WICHTIGEN Hinweis am Ende dieser Seite:Advanced Routing Howto -- der dort gepostete Link existiert nicht mehr, aber ich habe ihn über die Wayback-Maschine gefunden)