Salida de tráfico en diferentes interfaces según el puerto de destino

23

Mi pregunta es básicamente la misma que permitir solo cierto tráfico saliente en ciertas interfaces .

Tengo dos interfaces eth1(10.0.0.2) y wlan0(192.168.0.2). Mi ruta predeterminada es para eth1. Digamos que quiero que pase todo el tráfico https wlan0. Ahora, si uso la solución sugerida en la otra pregunta, el tráfico https pasará wlan0, pero seguirá teniendo la dirección de origen eth1(10.0.0.2). Como esta dirección no es enrutable para la wlan0puerta de enlace, las respuestas nunca volverán. La manera fácil sería simplemente configurar el bind-addr correctamente en la aplicación, pero en este caso no es aplicable.

Me imagino que necesito reescribir el src-addr:

# first mark it so that iproute can route it through wlan0
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

Ahora tcpdump ve que los paquetes salientes están bien y los paquetes entrantes llegan a 192.168.0.2, sin embargo, probablemente nunca terminen en la aplicación, porque todo lo que puedo ver es que la aplicación está reenviando el paquete SYN, aunque el SYN- ACK ya fue recibido.

Entonces pensé, tal vez necesito reescribir la dirección entrante también:

iptables -A PREROUTING -t nat -i wlan0 -p tcp --sport 443 -j DNAT --to 10.0.0.2

pero eso tampoco funcionó. Así que estoy un poco atrapado aquí. ¿Alguna sugerencia?

rumpel
fuente

Respuestas:

24

Usted está cerca.

La razón real por la que la aplicación no ve el tráfico de retorno se debe a la protección de suplantación de IP incorporada en el núcleo. 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 falsificaciones 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 alternativa.

  1. La marca es necesaria. Quédatelo.
  2. La fuente NAT también es necesaria.
  3. El DNAT final es innecesario, por lo que puede eliminarlo.

Asegúrese de tener el iproutepaquete instalado. Si tiene el ipcomando, entonces está configurado (lo que parece que tiene, pero si no lo obtiene primero).

Edite /etc/iproute2/rt_tablesy agregue una nueva tabla agregando la siguiente línea:

200 wlan-route

Luego debe configurar su nueva tabla de enrutamiento nombrada wlan-routecon una puerta de enlace predeterminada y crear reglas para enviar condicionalmente el tráfico 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 secuencia de comandos anotada 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
bahamat
fuente
Gracias por tomarse el tiempo de investigar esto. Sin embargo, esto ya es lo que estaba usando (como se describe en la otra pregunta), así que tengo la ruta adicional configurada, pero sigue siendo la misma. Los SYN-ACK vuelven a 192.168.0.2 pero aparentemente nunca llegan a la aplicación.
Rumpel
Regrese y lea mi respuesta nuevamente. Me dirigí a eso.
bahamat
¿La parte sobre la protección contra la falsificación? Ningún cambio incluso después de intentarlo. Lo siento, léelo de un lado a otro un par de veces, pero aún no obtuve lo que me falta.
Rumpel
Debe agregar una srcopción a los ip routecomandos para especificar la dirección de origen correcta.
David Schwartz
@DavidSchwartz: POSTROUTING SNATse encargará de eso.
bahamat
8

la solución de bahamat es correcta; sin embargo, tenga en cuenta que la única forma de hacer que esto funcione fue deshabilitar rp_filter para cada interfaz del sistema, no solo las dos (eth1 y wlan0 en este caso) involucradas en la NATing.

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: Instrucciones de enrutamiento avanzado : el enlace publicado allí ya no existe, pero lo encontré a través de la máquina de retroceso)

Davide C
fuente
Gracias por estas respuestas, yo también solo pude lograr que la solución bahamats funcionara teniendo en cuenta su respuesta.
Dynalon
para mí en un cuadro bastante estándar de Ubuntu 12.04 LTS, además de deshabilitar rp_filter y vaciar la caché de ruta, también tuve que quitar el nombre de la interfaz de los argumentos de iptables. no tuvo tiempo suficiente para investigar por qué.
Costin Gușă
0

Una sugerencia: siempre debe usar en --sportlugar de --dporten la cadena de salida.

Los NAT cambian el dporty eso hará que su regla sea irrazonable.

usuario73451
fuente
2
¿Hay algo que no entiendo? El dport, como en el puerto de destino, no puede cambiar. Es el puerto del servicio que la sesión intenta alcanzar, por ejemplo, http, ssh, smtp. O confundiste deporte y deporte, o me falta algo obvio. : P
Alguien
0

Creo que a continuación se necesita:

ip ru add from 192.168.0.2 table 3 prio 300
ip ro add table 3 default via 192.168.0.1 dev wlan0
usuario181234
fuente