¿Es posible tener múltiples puertas de enlace predeterminadas para conexiones salientes?

15

Me gustaría tener varias NIC (eth0 y wlan0) en la misma subred y servir como respaldo para las aplicaciones en el host si falla una de las NIC. Por esta razón, he creado una tabla de enrutamiento adicional. Así es como se /etc/network/interfacesve:

iface eth0 inet static
address 192.168.178.2
netmask 255.255.255.0
dns-nameserver 8.8.8.8 8.8.4.4
    post-up ip route add 192.168.178.0/24 dev eth0 src 192.168.178.2
    post-up ip route add default via 192.168.178.1 dev eth0
    post-up ip rule add from 192.168.178.2/32
    post-up ip rule add to 192.168.178.2/32

iface wlan0 inet static
wpa-conf /etc/wpa_supplicant.conf
wireless-essid xyz
address 192.168.178.3
netmask 255.255.255.0
dns-nameserver 8.8.8.8 8.8.4.4
    post-up ip route add 192.168.178.0/24 dev wlan0 src 192.168.178.3 table rt2
    post-up ip route add default via 192.168.178.1 dev wlan0 table rt2
    post-up ip rule add from 192.168.178.3/32 table rt2
    post-up ip rule add to 192.168.178.3/32 table rt2

Eso funciona para conectarse al host: todavía puedo usar SSH en él si falla una de las interfaces. Sin embargo, las aplicaciones en el host no pueden inicializar una conexión con el mundo exterior si eth0está inactivo. Ese es mi problema

Investigué ese tema y encontré la siguiente información interesante:

Cuando un programa inicia una conexión saliente, es normal que use la dirección de origen comodín (0.0.0.0), lo que indica que no hay preferencia en cuanto a qué interfaz se utiliza siempre que se pueda acceder a la dirección de destino relevante. Esto no se reemplaza por una dirección de origen específica hasta que se haya tomado la decisión de enrutamiento. Por lo tanto, el tráfico asociado con tales conexiones no coincidirá con ninguna de las reglas de política anteriores y no se dirigirá a ninguna de las tablas de enrutamiento recientemente agregadas. Suponiendo una configuración normal, caerá a la tabla de enrutamiento principal. http://www.microhowto.info/howto/ensure_symmetric_routing_on_a_server_with_multiple_default_gateways.html

Lo que quiero es que la tabla de ruta principal tenga más de una puerta de enlace predeterminada (una encendida eth0y otra encendida wlan0) y que vaya a la puerta de enlace eth0predeterminada por defecto y por wlan0si eth0está inactiva.

¿Es eso posible? ¿Qué necesito hacer para lograr tal funcionalidad?

rosix
fuente
Muy brevemente: varias rutas predeterminadas elegirán una interfaz al azar, lo que genera problemas porque la IP asignada es diferente. Lo que quiere es multihoming o agrupación , lo cual es difícil de hacer, vea, por ejemplo, aquí
dirkt
1
Puede usar la conmutación por error dinámica con la vinculación . No hay necesidad de jugar con las rutas predeterminadas.
Ingo

Respuestas:

17

Lo resolví yo mismo. Parece que hay muy poca información sobre las cosas de redes que puede hacer con Linux, por lo que he decidido documentar y explicar mi solución en detalle. Esta es mi configuración final:

  • 3 NIC: eth0 (cable), wlan0 (wifi incorporado, débil), wlan1 (adaptador wifi usb, señal más fuerte que wlan0)
  • Todos ellos en una única subred, cada uno con su propia dirección IP.
  • eth0 se debe utilizar para el tráfico entrante y saliente de forma predeterminada.
  • Si eth0 falla, entonces se debe usar wlan1.
  • Si wlan1 falla, entonces se debe usar wlan0.

Primer paso : crear una nueva tabla de ruta para cada interfaz en /etc/iproute2/rt_tables. Llamémoslos rt1, rt2 y rt3

#
# reserved values
#
255 local
254 main
253 default
0 unspec
#
# local
#
#1  inr.ruhep
1 rt1
2 rt2
3 rt3

Segundo paso : configuración de red en /etc/network/interfaces. Esta es la parte principal y trataré de explicar todo lo que pueda:

auto eth0 wlan0
allow-hotplug wlan1

iface lo inet loopback

iface eth0 inet static
address 192.168.178.99
netmask 255.255.255.0
dns-nameserver 8.8.8.8 8.8.4.4
    post-up ip route add 192.168.178.0/24 dev eth0 src 192.168.178.99 table rt1
    post-up ip route add default via 192.168.178.1 dev eth0 table rt1
    post-up ip rule add from 192.168.178.99/32 table rt1
    post-up ip rule add to 192.168.178.99/32 table rt1
    post-up ip route add default via 192.168.178.1 metric 100 dev eth0
    post-down ip rule del from 0/0 to 0/0 table rt1
    post-down ip rule del from 0/0 to 0/0 table rt1

iface wlan0 inet static
wpa-conf /etc/wpa_supplicant.conf
wireless-essid xyz
address 192.168.178.97
netmask 255.255.255.0
dns-nameserver 8.8.8.8 8.8.4.4
    post-up ip route add 192.168.178.0/24 dev wlan0 src 192.168.178.97 table rt2
    post-up ip route add default via 192.168.178.1 dev wlan0 table rt2
    post-up ip rule add from 192.168.178.97/32 table rt2
    post-up ip rule add to 192.168.178.97/32 table rt2
    post-up ip route add default via 192.168.178.1 metric 102 dev wlan0
    post-down ip rule del from 0/0 to 0/0 table rt2
    post-down ip rule del from 0/0 to 0/0 table rt2

iface wlan1 inet static
wpa-conf /etc/wpa_supplicant.conf
wireless-essid xyz
address 192.168.178.98
netmask 255.255.255.0
dns-nameserver 8.8.8.8 8.8.4.4
    post-up ip route add 192.168.178.0/24 dev wlan1 src 192.168.178.98 table rt3
    post-up ip route add default via 192.168.178.1 dev wlan1 table rt3
    post-up ip rule add from 192.168.178.98/32 table rt3
    post-up ip rule add to 192.168.178.98/32 table rt3
    post-up ip route add default via 192.168.178.1 metric 101 dev wlan1
    post-down ip rule del from 0/0 to 0/0 table rt3
    post-down ip rule del from 0/0 to 0/0 table rt3

Si escribe ip rule show, debería ver lo siguiente:

0:  from all lookup local 
32756:  from all to 192.168.178.98 lookup rt3 
32757:  from 192.168.178.98 lookup rt3 
32758:  from all to 192.168.178.99 lookup rt1 
32759:  from 192.168.178.99 lookup rt1 
32762:  from all to 192.168.178.97 lookup rt2 
32763:  from 192.168.178.97 lookup rt2 
32766:  from all lookup main 
32767:  from all lookup default 

Esto nos dice que el tráfico entrante o saliente de la dirección IP "192.168.178.99" usará la tabla de ruta rt1. Hasta aquí todo bien. Pero el tráfico que se genera localmente (por ejemplo, desea hacer ping o ssh desde la máquina a otro lugar) necesita un tratamiento especial (vea la gran cita en la pregunta).

Las primeras cuatro líneas posteriores /etc/network/interfacesson sencillas y se pueden encontrar explicaciones en Internet, la quinta y última línea posterior es la que hace que la magia suceda:

post-up ip r add default via 192.168.178.1 metric 100 dev eth0

Tenga en cuenta que no hemos especificado una tabla de ruta para esta línea posterior. Si no especifica una tabla de ruta, la información se guardará en la maintabla de ruta que vimos en ip rule show. Esta línea posterior coloca una ruta predeterminada en la tabla de rutas "principal" que se utiliza para el tráfico generado localmente que no es una respuesta al tráfico entrante. (Por ejemplo, un MTA en su servidor que intenta enviar un correo electrónico).

Las tres interfaces ponen una ruta predeterminada en la tabla de rutas principal, aunque con diferentes métricas. Echemos un vistazo a la maintabla de rutas con ip route show:

default via 192.168.178.1 dev eth0  metric 100 
default via 192.168.178.1 dev wlan1  metric 101 
default via 192.168.178.1 dev wlan0  metric 102 
192.168.178.0/24 dev wlan0  proto kernel  scope link  src 192.168.178.97 
192.168.178.0/24 dev eth0  proto kernel  scope link  src 192.168.178.99 
192.168.178.0/24 dev wlan1  proto kernel  scope link  src 192.168.178.98

Podemos ver que la tabla de rutas principales tiene tres rutas predeterminadas, aunque con diferentes métricas. La prioridad más alta es eth0, luego wlan1 y luego wlan0 porque los números métricos más bajos indican una prioridad más alta. Dado que eth0tiene la métrica más baja, esta es la ruta predeterminada que se utilizará mientras eth0esté activa. Si eth0baja, el tráfico saliente cambiará a wlan1.

Con esta configuración podemos escribir ping 8.8.8.8en una terminal y ifdown eth0en otra. pingtodavía debería funcionar porque porque ifdown eth0eliminará la ruta predeterminada relacionada con eth0, el tráfico saliente cambiará a wlan1.

Las líneas posteriores aseguran que las tablas de rutas relacionadas se eliminen de la base de datos de políticas de enrutamiento ( ip rule show) cuando la interfaz deja de funcionar, para mantener todo ordenado.

El problema que queda es que cuando desconecta el enchufe de eth0la ruta predeterminada eth0todavía está allí y el tráfico saliente falla. Necesitamos algo para monitorear nuestras interfaces y ejecutarlas ifdown eth0si hay un problema con la interfaz (es decir, falla de NIC o alguien que desconecta).

Último paso : entrar ifplugd. Es un demonio que mira las interfaces y se ejecuta ifup/ifdownsi desconectas o si hay un problema con la conexión wifi /etc/default/ifplugd:

INTERFACES="eth0 wlan0 wlan1"
HOTPLUG_INTERFACES=""
ARGS="-q -f -u0 -d10 -w -I"
SUSPEND_ACTION="stop"

Ahora puede conectar el enchufe eth0, el tráfico saliente cambiará a wlan1y si vuelve a enchufarlo, el tráfico saliente volverá a cambiar eth0. Su servidor permanecerá en línea mientras funcione cualquiera de las tres interfaces. Para conectarse a su servidor, puede usar la dirección IP de eth0 y, si eso falla, la dirección IP de wlan1 o wlan0.

rosix
fuente
Intente hacer una conexión que tome más tiempo (por ejemplo, scp un archivo grande), observe qué interfaz de red usa, desactive esa interfaz y vea qué sucede.
dirkt
La scpsesión se interrumpirá porque la dirección IP cambia. Puede intentar usar withsctppara mantener viva la conexión en tal caso o usar en rsynclugar de scpcancelar la transferencia desde el punto donde se detuvo.
rosix
El punto es: si se rompe, ¿cuál es la ventaja de su configuración complicada sobre tener solo una ruta predeterminada, digamos en la interfaz de red más rápida actualmente en funcionamiento? withsctpTambién funcionará para una sola ruta predeterminada.
dirkt
1
"¿Cuál es la ventaja de su configuración complicada sobre tener solo una ruta predeterminada, digamos en la interfaz de red más rápida actualmente en funcionamiento?" >> Eso es exactamente lo que está haciendo mi configuración. Solo la ruta predeterminada más rápida (eth0) se usa por defecto. De nada.
rosix
10

Linux ofrece una solución mejor que su solución alternativa con guión: enlace de respaldo activo.

De esta manera, su máquina tendrá solo una dirección IP (y una dirección MAC) y cambiará de forma automática y transparente las interfaces si una de ellas no está disponible. Sin interrupción de ninguna conexión TCP (ni a su LAN interna ni a Internet).

Estoy usando esta configuración para realizar una conmutación por error automática de eth0 a wlan0 en mi computadora portátil Debian cuando la desconecto de la estación de acoplamiento.

Mi / etc / network / interfaces:

# The primary network interface
allow-hotplug eth0
iface eth0 inet manual
        bond-master bond0
        bond-primary eth0

# The secondary network interface
allow-hotplug wlan0
iface wlan0 inet manual
        pre-up sleep 5
        wpa-conf /etc/wpa_supplicant.conf
        bond-master bond0
        bond-primary eth0

# The bonding interface
allow-hotplug bond0
iface bond0 inet dhcp
        bond-slaves eth0 wlan0
        bond-primary eth0
        bond-mode active-backup
        bond-miimon 10
        bond_downdelay 10
        bond_updelay 4000

Puede ampliar fácilmente esta configuración para incluir múltiples dispositivos wlan. Establecer la primary_reselectopción para better(seleccionar automáticamente el enlace más rápido) debería ayudar aquí.

Para obtener más información, consulte https://wiki.linuxfoundation.org/networking/bonding y https://wiki.debian.org/Bonding

Y (por supuesto) la documentación del kernel de Linux en https://www.kernel.org/doc/Documentation/networking/bonding.txt

Thilo
fuente