Información blog

Linux, tutoriales, noticias, sistemas, redes y seguridad informática, entre otras cosas.

miércoles, 1 de abril de 2015

Métrica tarjetas de red Linux

En más de una ocasión uno puede tener instaladas dos tarjetas de red con ip estática configurada en un equipo con Linux instalado y desea que en caso de que una puerta de enlace falle, se pueda ir por una secundaria configurada para la otra tarjeta de red. Eso parece fácil así dicho, pero si se ponen dos puertas de enlace sin configuración especial alguna, el equipo se ve incapaz de decidir por qué puerta de enlace salir, y con iptables se puede hacer para salir por ambas puertas indistintamente, pero no se desea eso tampoco y en algunos entornos puede resultar algo ineficiente.

Por suerte, a la hora de configurar una puerta de enlace en /etc/network/interfaces, existe la opción de asignarles una métrica a las puertas de enlace, conocidas en Linux cómo gateways. La métrica establece la prioridad que tiene una puerta de enlace sobre la otra y cuanta más baja sea, mayor prioridad tendrá sobre el resto de puertas de enlace, así aquella que posea una métrica de 0 tendrá más prioridad que la 1 y así sucesivamente. Aún así, le métrica que se establece siempre por defecto es 0 para todos los gateways, con lo que por defecto, al poner dos gateways, ambos tendrán la misma métrica y no sabría por donde salir.

Para solucionar dicho problema existe un método muy sencillo que nos permite establecer un métrica diferente a cada puerta de enlace. Supongamos que tenemos dos interfaces configuradas con ip estática. Dichas dos interfaces ya están configuradas pero no se puede salir a internet debido a que las dos tienen una puerta de enlace y el sistema no sabe por cual salir. Este sería un fichero de configuración de ejemplo:

  1. # Loopback
  2. auto lo
  3. iface lo inet loopback
  4. # Interfaz primaria
  5. auto eth0
  6. allow-hotplug eth0
  7. iface eth0 inet static
  8.         address 192.168.1.10
  9.         netmask 255.255.255.0
  10.         network 192.168.1.0
  11.         broadcast 192.168.1.255
  12.         gateway 192.168.1.1
  13. # Interfaz secundaria
  14. auto eth1
  15. allow-hotplug eth1
  16. iface eth1 inet static
  17.         address 192.168.2.10
  18.         netmask 255.255.255.0
  19.         network 192.168.2.0
  20.         broadcast 192.168.2.255
  21.         gateway 192.168.2.1

Así tal y cómo está nunca podría funcionar, pero con unas ligeras modificaciones se podría solucionar el problema. Dichas modificaciones consisten en quitar los gateway tal y cómo están puestos y hacer para que tras activar las interfaces de red (ya sea eth0 o eth1) el sistema añada automáticamente el gateway con una métrica definida por nosotros y que al desactivarlas, borre dichos gateways. Para dicho propósito se borran las líneas de los gateways y se añaden dos líneas, que consisten en post-up y pre-down. Post-up incluye una acción tras activar la interfaz de red en cuestión mientras que pre-down incluye una acción justo antes de desactivar dicha interfaz. En este caso lo que se desea en concreto es que se añada un gateway con métrica justo después de activar la interfaz y que se elimine dicho gateway cuando la desactivemos, con lo que hablando de forma global sería algo como:

post-up route add default gateway ${IP} metric ${NÚMERO}
pre-down route del default gateway ${IP}

Eso aplicado al ejemplo que he mostrado antes quedaría así:

  1. # Loopback
  2. auto lo
  3. iface lo inet loopback
  4. # Interfaz primaria
  5. auto eth0
  6. allow-hotplug eth0
  7. iface eth0 inet static
  8.         address 192.168.1.10
  9.         netmask 255.255.255.0
  10.         network 192.168.1.0
  11.         broadcast 192.168.1.255
  12.         post-up route add default gateway 192.168.1.1 metric 1 
  13.         pre-down route del default gateway 192.168.1.1
  14. # Interfaz secundaria
  15. auto eth1
  16. allow-hotplug eth1
  17. iface eth1 inet static
  18.         address 192.168.2.10
  19.         netmask 255.255.255.0
  20.         network 192.168.2.0
  21.         broadcast 192.168.2.255
  22.         post-up route add default gateway 192.168.2.1 metric 2

  23.   pre-down route del default gateway 192.168.2.1

Por último quedaría revisar si efectivamente se han puesto las métricas cómo nosotros deseamos. Para ello sólo habría que escribir route, y tendría que mostrar algo parecido a ésto:

Destination     Gateway     Genmask Flags Metric Ref Use Iface

default          192.168.1.1    0.0.0.0       UG         1    0     0    eth0
default          192.168.2.1    0.0.0.0       UG         2    0     0    eth1

Con ésto ya tendríamos dos puertas de enlace que no colisionan entre sí y que en caso de que no se pudiese salir por la primera, se tuviese la opción de salir por la segunda automáticamente.

Saludos.

2 comentarios :