Lo resolví yo mismo. Parece que hay muy poca información sobre las cosas de red que puede hacer con Linux, así que he decidido documentar y explicar mi solución en detalle. Esta es mi configuración final:
- 3 NIC:eth0 (cable), wlan0 (wifi integrado, débil), wlan1 (adaptador wifi usb, señal más fuerte que wlan0)
- Todos ellos en una sola subred,cada uno de ellos con su propia dirección IP.
- eth0 debe usarse para el tráfico entrante y saliente de forma predeterminada.
- Si eth0 falla, se debe usar wlan1.
- Si wlan1 falla, se debe usar wlan0.
Primer paso :Cree una nueva tabla de rutas 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ías 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" utilizará la tabla de rutas rt1. Hasta aquí todo bien. Pero el tráfico que se genera localmente (por ejemplo, si desea hacer ping o ssh desde la máquina a otro lugar) necesita un tratamiento especial (vea la cita grande en la pregunta).
Las primeras cuatro líneas posteriores en /etc/network/interfaces
son sencillos y se pueden encontrar explicaciones en Internet, la quinta y última línea de publicación es la que hace que suceda la magia:
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 rutas para esta línea de publicación. Si no especifica una tabla de rutas, la información se guardará en el main
tabla de rutas que vimos en ip rule show
. Esta línea posterior coloca una ruta predeterminada en la tabla de rutas "principal" que se usa 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 colocan una ruta predeterminada en la tabla de rutas principal, aunque con diferentes métricas. Echemos un vistazo al main
tabla 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 principal 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. Desde eth0
tiene la métrica más baja, esta es la ruta predeterminada que se utilizará hasta eth0
depende. Si eth0
se cae, el tráfico saliente cambiará a wlan1
.
Con esta configuración podemos escribir ping 8.8.8.8
en una terminal y ifdown eth0
en otro. ping
todavía debería funcionar porque porque ifdown eth0
eliminará la ruta predeterminada relacionada con eth0
, el tráfico saliente cambiará a wlan1
.
Las líneas post-down 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 se cae, para mantener todo ordenado.
El problema que queda es que cuando sacas el enchufe de eth0
la ruta predeterminada para eth0
todavía está allí y el tráfico saliente falla. Necesitamos algo para monitorear nuestras interfaces y ejecutar ifdown eth0
si hay un problema con la interfaz (es decir, una falla de la NIC o alguien desconectando el enchufe).
Último paso :ingresa ifplugd
. Ese es un demonio que observa las interfaces y ejecuta ifup/ifdown
si tiras del enchufe 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 desconectar eth0
, el tráfico saliente cambiará a wlan1
y si vuelves a conectarlo, el tráfico saliente volverá a eth0
. Tu servidor permanecerá en línea siempre que cualquiera de las tres interfaces funcione. 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.
Linux proporciona una mejor solución que su solución alternativa programada:vinculación de copias de seguridad activas.
De esta manera, su máquina tendrá solo uno dirección ip (y una dirección mac) y cambiar de interfaz de forma automática y transparente si una interfaz deja de estar disponible. Sin interrupción de ninguna conexión TCP (ni a su LAN interna ni a Internet).
Yo mismo uso esta configuración para realizar una conmutación por error automática de eth0 a wlan0 en mi computadora portátil Debian cuando desconecto mi computadora portátil de la estación de acoplamiento.
Mi /etc/red/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 varios dispositivos WLAN. Configuración del
primary_reselect
opción a better
(seleccione 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