Sei vicino.
Il vero motivo per cui l'applicazione non vede il traffico di ritorno è a causa della protezione da spoofing IP incorporata nel kernel. Cioè, il traffico di ritorno non corrisponde alla tabella di routing e viene quindi eliminato. Puoi risolvere questo problema disattivando la protezione dallo spoofing in questo modo:
sudo sysctl net.ipv4.conf.wlan0.rp_filter=0
Ma non lo consiglierei. Il modo più corretto è creare un'istanza di routing alternativa.
- Il segno è necessario. Tienilo.
- È necessario anche il NAT di origine.
- Il DNAT finale non è necessario, quindi puoi rimuoverlo.
Assicurati di avere il iproute
pacchetto installato. Se hai il ip
comando allora sei a posto (cosa che sembra che tu faccia, ma se non lo fai prendilo prima).
Modifica /etc/iproute2/rt_tables
e aggiungi una nuova tabella aggiungendo la seguente riga:
200 wlan-route
Devi quindi configurare la tua nuova tabella di routing chiamata wlan-route
con un gateway predefinito e creare regole per inviare il traffico in modo condizionale a quella tabella. Presumo che il tuo gateway predefinito sia 192.168.0.1. Naturalmente questo deve corrispondere alla tua rete effettiva, e non solo alle mie supposizioni.
ip route add default via 192.168.0.1 dev wlan0 table wlan-route
ip rule add fwmark 0x1 table wlan-route
Il tuo script annotato finale sarebbe simile a questo:
# 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
la soluzione di bahamat è corretta; tuttavia, tieni presente che l'unico modo per farlo funzionare era disabilitare rp_filter per ogni interfaccia nel sistema, non solo le due (eth1 e wlan0 in questo caso) coinvolte nel NATing.
for f in /proc/sys/net/ipv4/conf/*/rp_filter; do echo 0 > $f; done
echo 1 > /proc/sys/net/ipv4/route/flush
(vedi la nota IMPORTANTE alla fine di questa pagina:Advanced Routing Howto -- il link qui pubblicato non esiste più, ma l'ho trovato tramite la wayback machine)