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.

10 comentarios :

  1. Respuestas
    1. Me alegro de que te haya sido útil.

      Saludos!

      Eliminar
  2. Esto es para darle prioridad a una interfaz de red para mandar el trafico?

    ResponderEliminar
    Respuestas
    1. Así es, pues por defecto las puertas de enlace en Linux van con defecto con la misma prioridad.

      Saludos!

      Eliminar
  3. y en el caso de que una tarjeta de red este por dhcp y la otra estatica como seria ??

    ResponderEliminar
    Respuestas
    1. el procedimiento sería el mismo, pues debajo del inet podrías añadir el post-up, si bien habría que tener cuidado en saber qué gateway recibimos. Otra opción es ponerle una métrica más alta a la estática, ya que cuanto más "baja" sea la métrica (por ejemplo 1), mayor prioridad tiene la puerta de enlace. Es decir que puedes hacer que la puerta de enlace de la estática tenga una métrica de (por ejemplo) 200, para que así solamente se salga por dicha puerta de enlace en caso de que la puerta de enlace dada por el DHCP sea inalcanzable.

      Espero que esto haya podido resolver tu duda.

      Saludos.

      Eliminar
  4. Hola, tengo un equipo Linux sobre un automovil, que tiene dos tarjetas de red conectadas a dos routers diferentes, uno con una coneccion LTE de celular y el otro se conecta a una red WIFI.
    No se si me puedas ayudar quiciera que siempre que el auto no este en casa se conectara con la red LTE pero tan pronto se acerque a mi casa detectara la red WIFI y conectarme a travez del wifi.. puedo lograr esto con metricas? Lo intente siguiendo tu post pero aun no lo consigo.

    ResponderEliminar
    Respuestas
    1. Seguramente se deba a que el cliente wifi es tiene DHCPCLIENT. Esto hace que al pedir IP al router ponga por defecto su métrica... Teniendo en cuenta que la métrica por defecto es 100, tal vez poniéndole una métrica menor a la otra interfaz te solucione el problema.

      Eliminar
  5. caso similar al de francisco mi tocayo, solo que yo uso una vpn qu tiene que correr cuendo ya exista una conexion a internet. La idea es basicamente la misma: esta conectada el wifi y si se pierde esa conexion, se conecta por el modem 3g. Si es por el modem 3g, debería ejecutar el wvdial. gracias y saludos

    ResponderEliminar
    Respuestas
    1. Seguramente se deba a que el cliente wifi es tiene DHCPCLIENT. Esto hace que al pedir IP al router ponga por defecto su métrica... Teniendo en cuenta que la métrica por defecto es 100, tal vez poniéndole una métrica menor a la otra interfaz te solucione el problema.

      Eliminar