Si hay un host Linux con dos interfaces en dos redes diferentes (la red principal y la red de administración fuera de banda, llámelas "primaria" y "mgmt"), ¿cómo se puede enrutar el tráfico de retorno a través de la misma interfaz desde ¿de dónde vino?
En otras palabras: desde donde estoy sentado, paso por un enrutador para acceder a las interfaces principal o de administración de la máquina. Cuando entro a la interfaz principal, no hay problema. Cuando hago ssh a la interfaz de administración, mi paquete llega al servidor, pero el servidor envía su respuesta a través de la puerta de enlace predeterminada que se encuentra en la interfaz principal. Por lo tanto, mi conexión no se establece. ¿Cómo puedo hacer que el servidor responda a las solicitudes a través de la red mgmt, que fueron recibidas entrantes en la red mgmt?
Respuesta1
Encontré la mayor parte de una respuesta aquí:https://unix.stackexchange.com/questions/4420/reply-on-same-interface-as-incoming
Más información aquí:http://linux-ip.net/html/routing-tables.html
Además, gracias a Tom Yan por brindar una respuesta que tenía la mayoría de las piezas necesarias. Pero publico esta respuesta porque ninguna de las otras es realmente completa, totalmente precisa o fácil de seguir.
El siguiente proceso me funciona en Centos 7. No pude hacerlo funcionar con NetworkManager porque NetworkManager no lee /etc/sysconfig/network-scripts/rule-*
y route-*
y no pude encontrar un nmcli
comando equivalente para hacer que estos cambios sean persistentes. Si alguien tiene ese comando, por favor compártalo. Entonces, el primer paso requerido es deshabilitar NetworkManager:
systemctl disable NetworkManager
systemctl enable network
systemctl stop NetworkManager
systemctl start network
Los kernels de Linux 2.2 y 2.4 admiten múltiples tablas de enrutamiento, cada una numerada del 0 al 255. Las dos tablas de enrutamiento normalmente empleadas son local
(tabla de enrutamiento 255) y main
(tabla de enrutamiento 254). Estos se enumeran en /etc/iproute2/rt_tables
. Puede crear una nueva tabla de enrutamiento eligiendo un número no utilizado (busque en /etc/iproute2/rt_tables
) y agregándolo a /etc/iproute2/rt_tables
.
En mi caso, la interfaz "principal" es eth0
192.168.20.20 con la puerta de enlace 192.168.20.1 y la interfaz "mgmt" es eth1
192.168.5.5 con la puerta de enlace 192.168.5.1.
Elijo la nueva tabla de enrutamiento número 200 y el nuevo nombre de la tabla de enrutamiento mgmt
.
echo "200 mgmt" >> /etc/iproute2/rt_tables
A continuación, debe crear una regla para utilizar la nueva tabla de enrutamiento para el tráfico recibido en la interfaz de administración. Otros recursos en Internet dicen que solo necesita hacer esto para una interfaz, pero realmente necesita hacerlo en ambas, por la siguiente razón: Tenga en cuenta que si abre solo una interfaz, esa interfaz puede responder al ping, pero si abre ambas interfaces, la que abrió primero responde al ping y la segunda no. Esto significa que si abre mgmt
primero la interfaz y luego la interfaz principal, la principal no responderá. Por eso es una buena práctica definir las reglas en ambas interfaces.
Esto se puede hacer una sola vez (no persistente) de la siguiente manera:
ip rule add from 192.168.20.20 table main
ip route add default via 192.168.20.1 dev eth0 table main
ip rule add from 192.168.5.5 table mgmt
ip route add default via 192.168.5.1 dev eth1 table mgmt
En este punto, ambas interfaces deberían estar respondiendo. Ahora, para hacerlo persistente, observe que si lee /etc/sysconfig/network-scripts/ifup-routes
, analizará todos los archivos rule-*
y route-*
y pasará cada línea como argumento a ip rule add
o ip route add
en consecuencia. Así que cree cuatro archivos nuevos, de la siguiente manera:
echo "from 192.168.20.20 table main" > /etc/sysconfig/network-scripts/rule-eth0
echo "default via 192.168.20.1 dev eth0 table main" > /etc/sysconfig/network-scripts/route-eth0
echo "from 192.168.5.5 table mgmt" > /etc/sysconfig/network-scripts/rule-eth1
echo "default via 192.168.5.1 dev eth1 table mgmt" > /etc/sysconfig/network-scripts/route-eth1
Después de reiniciar, debería encontrar que ambas interfaces funcionan de forma predeterminada.
Respuesta2
Enrutamiento basado en fuente / ip rule
.
Supongamos primary
que tiene 1.2.3.4
y mgmt
tiene 2.3.4.5
(y sus puertas de enlace predeterminadas son 1.2.3.1
y 2.3.4.1
respectivamente):
ip rule add from 1.2.3.4 table 234
ip route add default via 1.2.3.1 dev primary table 234
(lo anterior debería ser opcional)
ip rule add from 2.3.4.5 table 345
ip route add default via 2.3.4.1 dev mgmt table 345