Estás cerca.
La razón real por la que la aplicación no está viendo el tráfico de retorno es debido a la protección de suplantación de IP integrada en el kernel. Es decir, el tráfico de retorno no coincide con la tabla de enrutamiento y, por lo tanto, se descarta. Puede solucionar esto desactivando la protección contra la suplantación de identidad de esta manera:
sudo sysctl net.ipv4.conf.wlan0.rp_filter=0
Pero no lo recomendaría. La forma más adecuada es crear una instancia de enrutamiento alternativo.
- La marca es necesaria. Quédatelo.
- Source NAT también es necesario.
- El DNAT final no es necesario, por lo que puede eliminarlo.
Asegúrate de tener el iproute
paquete instalado. Si tienes el ip
comando entonces está listo (que parece que lo hace, pero si no lo consigue primero).
Editar /etc/iproute2/rt_tables
y agregue una nueva tabla agregando la siguiente línea:
200 wlan-route
Luego debe configurar su nueva tabla de enrutamiento llamada wlan-route
con una puerta de enlace predeterminada y cree reglas para enviar tráfico condicionalmente a esa tabla. Asumiré que su puerta de enlace predeterminada es 192.168.0.1. Naturalmente, esto debe coincidir con su red real, y no solo con mis suposiciones.
ip route add default via 192.168.0.1 dev wlan0 table wlan-route
ip rule add fwmark 0x1 table wlan-route
Su script anotado final se vería así:
# 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 solución de bahamat es correcta; sin embargo, tenga en cuenta que la única manera de hacer que esto funcionara era deshabilitar rp_filter para cada interfaz del sistema, no solo las dos (eth1 y wlan0 en este caso) involucradas en NAT.
for f in /proc/sys/net/ipv4/conf/*/rp_filter; do echo 0 > $f; done
echo 1 > /proc/sys/net/ipv4/route/flush
(vea la nota IMPORTANTE al final de esta página:Procedimiento avanzado de enrutamiento:el enlace publicado allí ya no existe, pero lo encontré a través de la máquina wayback)