GNU/Linux >> Tutoriales Linux >  >> Linux

Linux:¿tráfico de salida en diferentes interfaces según el puerto de destino?

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 todo el tráfico https pase por wlan0 .
Ahora, si utilizo la solución sugerida en la otra pregunta, el tráfico https pasará por wlan0 , pero aún tendrá la dirección de origen de eth1 (10.0.0.2). Dado que esta dirección no es enrutable para el wlan0 puerta de enlace, las respuestas nunca volverán. La forma más fácil sería simplemente configurar 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 los paquetes salientes correctamente y los paquetes entrantes llegan para 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- Ya se recibió ACK.

Entonces pensé, tal vez también deba volver a escribir la dirección entrante:

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?

Respuesta aceptada:

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.

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

Asegúrate de tener el iproute paquete instalado. Si tienes la ip comando entonces está listo (que parece que lo hace, pero si no lo consigue primero).

Edite /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

Linux
  1. Linux – ¿Puerto serie Raspberrypi?

  2. Linux:¿diferentes formatos de archivos de objetos en Linux?

  3. Linux:¿los diferentes kernels de Linux/unix son intercambiables?

  4. Android:¿Android está basado en Linux?

  5. Agotamiento del puerto de red de Linux

Cómo hacer un escaneo de puertos en Linux

Cómo instalar y usar el analizador de tráfico de red de Linux basado en la web Darkstat

Cómo hacer ping a un número de puerto en Linux

Explicación de la redirección de entrada y salida en Linux

Ejemplos de comandos echo de Linux

Abrir un puerto en Linux