Você está perto.
O motivo real pelo qual o aplicativo não está vendo o tráfego de retorno é devido à proteção interna de falsificação de IP do kernel. Ou seja, o tráfego de retorno não corresponde à tabela de roteamento e, portanto, é descartado. Você pode corrigir isso desativando a proteção contra falsificação assim:
sudo sysctl net.ipv4.conf.wlan0.rp_filter=0
Mas eu não recomendaria isso. A maneira mais adequada é criar uma instância de roteamento alternativa.
- A marca é necessária. Guarde.
- NAT de origem também é necessário.
- O DNAT final é desnecessário, então você pode removê-lo.
Verifique se você tem o pacote iproute
instalado. Se você tiver o comando ip
, então você está definido (o que parece que você faz, mas se não conseguir isso primeiro).
Edite /etc/iproute2/rt_tables
e adicione uma nova tabela adicionando a seguinte linha:
200 wlan-route
Em seguida, você precisa configurar sua nova tabela de roteamento denominada wlan-route
com um gateway padrão e criar regras para enviar condicionalmente o tráfego para essa tabela. Eu suponho que seu gateway padrão é 192.168.0.1. Naturalmente, isso precisa corresponder à sua rede real, e não apenas às minhas suposições.
ip route add default via 192.168.0.1 dev wlan0 table wlan-route
ip rule add fwmark 0x1 table wlan-route
Seu script anotado final ficaria assim:
# 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