![Reenvío de puertos con dos enrutadores](https://rvso.com/image/761005/Reenv%C3%ADo%20de%20puertos%20con%20dos%20enrutadores.png)
Tengo servidores detrás de dos IP públicas diferentes y hago DNAT para enviar el tráfico a diferentes servidores internos según el puerto.
------------------------- -----------------------
| server a (port 80/tcp)| | router A |
| (eth0) 192.168.1.123|..................|192.168.1.1 (eth1) |
------------------------- : | (eth0) 1.2.3.4|............
: ----------------------- :
: :
: ----------------------- :.... INTERNET
------------------------- : | router B | :
| server a (port 25/tcp)| : | (eth0) 2.3.4.5|...........:
| (eth0) 192.168.1.234|..................|192.168.1.2 (eth1) |
------------------------- -----------------------
En el enrutador A y BI habilitaron el reenvío y las siguientes iptables:
iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth0 -j MASQUERADE
iptables -t nat -A PREROUTING -d ${externalIP} -i eth0 -p tcp --dport 25 -j DNAT --to 192.168.1.234
iptables -t nat -A PREROUTING -d ${externalIP} -i eth0 -p tcp --dport 80 -j DNAT --to 192.168.1.123
En realidad tengo la siguiente ruta agregada en los servidores A y B:
route add default gw 192.168.1.1
Entonces, todo el tráfico interno a Internet pasa por el enrutador A y todo el tráfico al puerto 25 y 80 se envía correctamente al servidor A y B, pero las conexiones solo funcionan si el tráfico llegó a través del enrutador A. De hecho, el tráfico a través del enrutador B llega a los servidores pero se devuelve a través del enrutador A en lugar del B, por lo que las conexiones no funcionan.
Agregué una nueva ruta en los servidores:
route add default fw 192.168.1.2
route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 192.168.1.1 0.0.0.0 UG 0 0 0 eth0
0.0.0.0 192.168.1.2 0.0.0.0 UG 0 0 0 eth0
192.168.1.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0
Pero las conexiones siguen sin funcionar.
¿Cómo puedo gestionar eso?
No es importante equilibrar el tráfico Interno -> Externo, pero quiero que todas las conexiones entrantes de Internet con las IP externas estén establecidas correctamente.
NOTA: También intenté hacer el DNAT en uno de los enrutadores contra la IP externa del otro enrutador, pero están en redes diferentes y no funcionó:
iptables -t nat -I PREROUTING -p tcp --dport 25 -d ${ExternalIPA} -i eth0 -j DNAT --to ${ExternalIPB}
Respuesta1
Su configuración actual no funcionará según lo previsto. Necesita tener una IP virtual que flote sobre Router-A
y Router-B
. Esto también equilibrará la carga entre los dos enrutadores con simplicidad. En este ejemplo, usaré el estándar de la industria.VRRPen un enrutador Linux (Ubuntu-16).
Aquí está el procedimiento:
Tanto en Linux Router-A
como en Router-B
Linux, ejecute los siguientes comandos:
$ sudo echo "net.ipv4.ip_nonlocal_bind=1" >> /etc/sysctl.conf
$ sudo sysctl -p
Instale keepalived en ambos enrutadores
$ sudo apt-get update
$ sudo apt-get install keepalived -y
Luego ve a Router-A
eso actuará como MASTER
. Cree un nuevo archivo de configuración /etc/keepalived/keepalived.conf
con las siguientes entradas:
vrrp_instance VI_1 {
interface eth1
state MASTER
virtual_router_id 50
priority 101
authentication {
auth_type AH
auth_pass pass123
}
virtual_ipaddress {
192.168.1.99
}
}
Luego vaya a Router-B
que actuará como BACKUP
y haga lo mismo con el nuevo archivo de configuración /etc/keepalived/keepalived.conf
:
vrrp_instance VI_1 {
interface eth1
state BACKUP
virtual_router_id 50
priority 100
authentication {
auth_type AH
auth_pass pass123
}
virtual_ipaddress {
192.168.1.99
}
}
Explicación:
net.ipv4.ip_nonlocal_bind=1
le dice al kernel que la IP virtual NO debe estar vinculada a ninguna interfaz física.
vrrp_instance VI_1
debe coincidir en ambos enrutadores. Este es un identificador, ya que puede tener varios VRRP ejecutándose en el mismo enrutador.
interface eth1
es la interfaz que está orientada a la LAN (frente a los servidores internos).
state MASTER
una Router-A
y state BACKUP
otra vez Router-B
se explica por sí misma.
virtual_router_id 50
debe coincidir en ambos enrutadores. Este es un identificador.
priority 101
una Router-A
y priority 100
otra vez Router-B
(el enrutador A tiene una prioridad más alta en este caso).
authentication
debe coincidir en ambos enrutadores. En este caso utilicé una clave precompartida depassw123
virtual_ipaddress
es la dirección IP flotante que utilizará VRRP. Esta IP debe coincidir en ambos enrutadores. Esta IP no debe ser utilizada por ningún dispositivo en el segmento LAN. En este caso elegí192.168.1.99
Habilitar el servicio Keepalived
$ sudo systemctl enable keepalived
Iniciar servicio keepalived
$ sudo systemctl start keepalived
Es hora de manipular las reglas de iptables en ambos enrutadores.
Borre todas las reglas NAT de ambos enrutadores (deshágase de las reglas NAT infringidas)
$ sudo iptables -t nat -F
$ sudo iptables -t mangle -F
Luego agregue las reglas NAT correctas:
Enrutador-A
$ sudo iptables -t nat -A POSTROUTING -o eth0 -s 192.168.1.0/24 -j SNAT --to 192.168.1.99
$ sudo iptables -t nat -A PREROUTING -d ${externalIP} -i eth0 -p tcp --dport 25 -j DNAT --to 192.168.1.234
Enrutador-B
$ sudo iptables -t nat -A POSTROUTING -o eth0 -s 192.168.1.0/24 -j SNAT --to 192.168.1.99
$ sudo iptables -t nat -A PREROUTING -d ${externalIP} -i eth0 -p tcp --dport 80 -j DNAT --to 192.168.1.123
Eso es todo lo que necesitas desde el lado del enrutador. Ahora salte a los servidores (Servidor-A y Servidor-B), elimine la puerta de enlace predeterminada existente ( 192.168.1.1
) y asigne la nueva puerta de enlace ( 192.168.1.99
).
$ sudo ip route del 0/0
$ sudo route add default gw 192.168.1.99
Cuando se establecen conexiones desde Internet, los dos servidores (Servidor-A y Servidor-B) devolverán el tráfico a la IP virtual ( 192.168.1.99
) que está flotando arriba Router-A
yRouter-B
Referencia:https://www.keepalived.org/manpage.html
Respuesta2
Finalmente logré hacerlo funcionar sin usar una IP virtual, básicamente usando CONNNMARK y agregando diferentes rutas:
NOTA:
- Enrutador A eth1 MAC = AA:AA:AA:AA:AA:AA
- Enrutador B eth1 MAC = BB:BB:BB:BB:BB:BB
Tengo que agregar las siguientes rutas e iptables en todos los servidores que usan rutas asimétricas:
# add the two routing tables
ip route add to default table 11 via 192.168.1.1 dev eth0
ip route add to default table 33 via 192.168.1.2 dev eth0
# add the mark to the routing tables
ip rule add priority 99 table 11 fwmark 11
ip rule add priority 99 table 33 fwmark 33
# mark the packets that came from the different routes
iptables -t mangle -A OUTPUT ! -d 192.168.1.0/24 -m addrtype --dst-type UNICAST -j CONNMARK --restore-mark
iptables -A INPUT -i eth0 ! -s 192.168.1.0/24 -m addrtype --src-type UNICAST -m mac --mac-source AA:AA:AA:AA:AA:AA -j CONNMARK --set-mark 33
iptables -A INPUT -i eth0 ! -s 192.168.1.0/24 -m addrtype --src-type UNICAST -m mac --mac-source BB:BB:BB:BB:BB:BB -j CONNMARK --set-mark 11
Ahora todo está funcionando bien. Todas las conexiones de Internet a cualquiera de las direcciones IP externas se enrutan a través del enrutador que gestiona la conexión DNAT.