iptables: MultiWAN y reenvío y redirección de puertos

iptables: MultiWAN y reenvío y redirección de puertos

Estoy ejecutando Gentoo Linux, por lo que uso iptbales simples para administrar mi firewall y mi red. Normalmente uso wan0 para todo mi tráfico, pero como ya tengo un servidor web detrás, me gustaría wan1 (vincular a otro dominio) para mi segundo servidor web.

Tengo tres interfaces:

  • eth0 = LAN
  • wan0 = WAN principal utilizada (puerta de enlace predeterminada)
  • wan1 = WAN secundaria

Algunas informaciones sobre las puertas de enlace

> route -n 

Kernel IP Routentabelle
Ziel Router          Genmask         Flags Metric Ref    Use Iface
0.0.0.0         80.108.x.x      0.0.0.0         UG    0      0        0 wan0
192.168.0.0     0.0.0.0         255.255.0.0     U     0      0        0 eth0
80.108.x.0      0.0.0.0         255.255.254.0   U     0      0        0 wan0
84.114.y.0      0.0.0.0         255.255.255.0   U     0      0        0 wan1
127.0.0.0       127.0.0.1       255.0.0.0       UG    0      0        0 lo

El inicio predeterminado para NAT/MASQUEARDING es

sysctl -q -w net.ipv4.conf.all.forwarding=1

iptables -N BLOCK
iptables -A BLOCK -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A BLOCK -m state --state NEW,ESTABLISHED -i eth0 -j ACCEPT
iptables -A BLOCK -m state --state NEW,ESTABLISHED -i lo -j ACCEPT

iptables -t nat -A POSTROUTING -o eth0 -s 192.168.0.0/16 -j MASQUERADE
iptables -t nat -A POSTROUTING -o wan0 -j MASQUERADE
iptables -t nat -A POSTROUTING -o wan1 -j MASQUERADE

Detrás de esta puerta de enlace estoy ejecutando varios servidores web. En una máquina estoy ejecutando un servidor HTTP en el puerto 8000 en lugar de 80. Por lo general, cuando uso wan0 como interfaz entrante, uso las siguientes reglas:

lan_host1="192.168.0.200"
iptables -A FORWARD -i wan0 -p TCP -d $lan_host1--dport 80 -j ACCEPT
iptables -t nat -A PREROUTING -i wan0 -p TCP --dport 8000 -j DNAT --to-destination "$lan_host1":80
iptables -A FORWARD -i wan0 -p UDP -d $lan_host1--dport 80 -j ACCEPT
iptables -t nat -A PREROUTING -i wan0 -p UDP --dport 8000 -j DNAT --to-destination "$lan_host1":80

Eso funciona bien. Ahora me gustaría que se use wan1, ya que wan0 está vinculado a una IP/dominio que normalmente uso para otra cosa.

Pensé que un simple cambio a wan1 sería suficiente.

lan_host1="192.168.0.200"
iptables -A FORWARD -i wan1 -p TCP -d $lan_host1--dport 80 -j ACCEPT
iptables -t nat -A PREROUTING -i wan1 -p TCP --dport 8000 -j DNAT --to-destination "$lan_host1":80
iptables -A FORWARD -i wan1 -p UDP -d $lan_host1--dport 80 -j ACCEPT
iptables -t nat -A PREROUTING -i wan1 -p UDP --dport 8000 -j DNAT --to-destination "$lan_host1":80

Pero eso no funciona. Supongo que el problema es que wan0 es el GW predeterminado. Entonces, supongo que los paquetes recibidos por wan1 se reenvían a lan_host1, pero cuando se envían de regreso a la puerta de enlace, se envían a través de wan0 en lugar de wan1 o al menos usando la ip de wan0.

¿Alguna sugerencia sobre cómo podría gestionar esto?

Gracias de antemano Rob

Respuesta1

Como la respuesta está ligada a la configuración, hago algunas suposiciones. Tendrás que adaptar la respuesta para que se ajuste a la configuración real.

  • wan1LAN y puerta de enlace dewan1elegido arbitrariamente como 84.114.7.0/24 y 84.114.7.254.

  • No se tienen en cuenta las reglas del firewall, pero todo esto no debería interactuar con ellas.

En Linuxip link,ip addressyip routesiempre debe usarse en lugar de obsoleto ifconfigy route. routeProbablemente no pueda manejar tablas de enrutamiento adicionales de todos modos.

Sólo como recordatorio,iptableso en realidadfiltro de red, no enruta, pero mediante sus acciones puede alterar las decisiones de enrutamiento tomadas por la pila de enrutamiento IP. Esteesquemáticomuestra dónde pueden ocurrir las decisiones de enrutamiento. Para el tráfico enrutado (en lugar de originado localmente) que se encuentra solo en un lugar y las modificaciones deben ocurrir antes:crudo/PRERUTAMIENTO,mangle/PRERRUTAMIENTOonat/PRERRUTAMIENTO, concrudoa menudo poco práctico ynatsólo para casos limitados, en su mayoría dejandomutilar.

Asistema multitarjeta básico, para utilizar múltiples rutas a Internet, generalmente requiereenrutamiento de políticas, donde la ruta puede cambiar no sólo con el destino como de costumbre, sino también con el origen o con otros selectores (como se hará aquí) utilizados en las reglas de política. En Linux reglas adicionales hechas conip rulePuede seleccionar una tabla de enrutamiento diferente para seleccionar, por ejemplo, una ruta predeterminada diferente (aún habrá solo una ruta predeterminada, pero unapor tabla de enrutamiento).

Así que aquí está el principio, sin dejar de estar activo.Reenvío de ruta inversa estricto(filtro_rp), es aceptar paquetes provenientes dewan1y enrútelos como de costumbre haciaeth0usando una tabla alternativa (que permitirá pasarfiltro_rp). Esta tabla de enrutamiento adicional debe duplicar la tabla de enrutamiento principal, pero usando solo las rutas necesarias para la ruta alternativa (wan1) y por lo tanto no incluye las rutas habituales con el camino "normal" (wan0). Si otras rutas (como VPN, etc.) tienen que estar involucradas en los flujos que pasanwan1, lo más probable es que también sea necesario agregar su ruta, o que se tengan que crear otras reglas y tablas adicionales para hacer frente a eso.

Dado que Linux descontinuó el uso de un caché de enrutamiento en el kernel 3.6, nada en la pila de enrutamiento indicaría devolver paquetes de respuesta desdeanfitrión1al cliente a través dewan1y terminarían saliendo usando la ruta principal por defecto a travéswan0, NATed con la IP incorrecta para esta interfaz (filtro de redes independiente de la ruta y ya había elegido la NAT que se realizará al recibir el primer paquete de la conexión) y probablemente lo abandonó el siguiente enrutador del ISP que también realiza un filtrado estricto de ruta inversa. Hay unafiltro de redCaracterística que permite copiar la marca de un paquete en la marca de conntrack y volver a colocarla en el paquete: esto actuará como memoria de ruta para la conexión. Entoncesiptablesyfiltro de red'sconectarse utilizará para dos funciones relacionadas: marcar el paquete para alterar la decisión de enrutamiento y restaurar esta marca en los paquetes de respuesta identificados como parte de la misma conexión.

Todo esto se traduce en estos comandos:

  • parte de enrutamiento

Utilice para paquetes marcados (valor de marca arbitrario 101) una tabla de enrutamiento adicional (valor arbitrario no relacionado también 101):

    ip rule add fwmark 101 lookup 101

Llene la tabla con entradas similares a lasprincipaltabla de enrutamiento, menoswan0entradas:

    ip route add table 101 192.168.0.0/16 dev eth0
    ip route add table 101 84.114.7.0/24 dev wan1
    ip route add table 101 default via 84.114.7.254 dev wan1
  • iptables/filtro de redparte

Hay varias optimizaciones posibles en los siguientes comandos. Probablemente se puedan mejorar.

Restaure una posible marca anterior ya guardada, de modo que los paquetes de respuesta obtengan la misma marca que los paquetes originales:

    iptables -t mangle -A PREROUTING -j CONNMARK --restore-mark

Marcar los paquetes que llegan desdewan1para alterar la decisión de enrutamiento anterior:

    iptables -t mangle -A PREROUTING -i wan1 -j MARK --set-mark 101 

Si hay una marca, guárdela enconectar(podría haberse hecho en elnattabla para hacerlo solo una vez por flujo de conexión en lugar de por cada paquete):

    iptables -t mangle -A PREROUTING -m mark ! --mark 0 -j CONNMARK --save-mark

En realidad, esto seguirá fallandoReenvío de ruta inversa estrictocomprobar, ya que estocaracterística indocumentadase agregó en 2010. Debe usarse aquí:

sysctl -w net.ipv4.conf.wan1.src_valid_mark=1

información relacionada