Dominando el Comando `ip route add` en Linux para Rutas Estáticas

El sistema operativo Linux, pilar fundamental en la infraestructura de redes moderna, ofrece un conjunto robusto de herramientas para la gestión y configuración de redes. Entre estas, el comando ip se erige como un reemplazo moderno y potente para utilidades más antiguas como ifconfig y route. Esta herramienta, parte del paquete iproute2, es esencial para administrar las interfaces de red, direcciones IP, tablas de enrutamiento y mucho más. En particular, el subcomando ip route add es crucial para definir rutas estáticas, permitiendo un control granular sobre cómo el tráfico de red viaja dentro y fuera de un sistema Linux.

La Evolución de la Gestión de Red en Linux: De ifconfig a iproute2

Durante muchos años, ifconfig y route fueron los comandos predilectos para la configuración de redes en Linux. Sin embargo, con el avance de la tecnología y la creciente complejidad de las redes, surgió la necesidad de una solución más integral y flexible. El paquete iproute2, que incluye el comando ip, fue desarrollado para satisfacer estas demandas. A diferencia de sus predecesores, iproute2 unifica la gestión de diversas funcionalidades de red bajo un único comando, simplificando la administración y ofreciendo capacidades avanzadas. Distribuciones modernas como Debian 9 y posteriores, así como otras populares como Ubuntu, Red Hat y Fedora, han adoptado iproute2 como la herramienta estándar, haciendo que el aprendizaje de ip route add sea no solo recomendable, sino necesario.

Diagrama comparativo de ifconfig vs ip command

Entendiendo el Comando ip route add

El comando ip route add se utiliza para añadir una entrada estática a la tabla de enrutamiento del kernel de Linux. Una ruta estática especifica un camino predefinido para que el tráfico de red alcance un destino particular, especialmente útil cuando ese destino no es accesible a través de la puerta de enlace predeterminada.

La sintaxis básica para añadir una ruta estática es la siguiente:

ip route add <NETWORK/MASK> via <GATEWAY_IP> [dev <INTERFACE_NAME>]

Desglosemos los componentes clave:

  • ip route add: El comando principal para añadir una ruta.
  • <NETWORK/MASK>: Especifica la red de destino y su máscara de subred utilizando la notación CIDR (Classless Inter-Domain Routing). Por ejemplo, 192.168.1.0/24 define la red 192.168.1.0 con una máscara de subred de 255.255.255.0. Para redes IPv6, se debe utilizar la opción -6.
    • Dirección de Red: El primer bit de la dirección IP.
    • Máscara de Subred: Determina el tamaño de la red. Un /24 indica que los primeros 24 bits definen la parte de red de la dirección IP.
    • Dirección IP (Ejemplo IPv4): 11000000.10101000.00000001 representa 192.168.1.0.
    • Máscara de Subred (Ejemplo IPv4): 255.255.255.0 o /24, que en binario es 11111111.11111111.11111111.0.
    • Wildcard (Ejemplo IPv4): 0.0.0.255.
    • Red (Ejemplo IPv4): 192.168.1.0/24.
    • HostMin (Ejemplo IPv4): 192.168.1.1.
    • HostMax (Ejemplo IPv4): 192.168.1.254.
    • Broadcast (Ejemplo IPv4): 192.168.1.255.
  • via <GATEWAY_IP>: Indica la dirección IP del gateway (puerta de enlace) que se utilizará para reenviar el tráfico destinado a la red especificada.
  • [dev <INTERFACE_NAME>]: (Opcional) Especifica la interfaz de red a través de la cual se enviarán los paquetes. Si no se especifica, el sistema intentará seleccionar la interfaz más adecuada.

Rutas Estáticas para IPv6

Para configurar rutas estáticas para redes IPv6, se debe utilizar la opción -6:

ip -6 route add <IPv6_NETWORK/PREFIX> via <IPv6_GATEWAY_IP> [dev <INTERFACE_NAME>]

Por ejemplo:

ip -6 route add 2001:db8:abcd:1::/64 via fe80::1 dev eth0

Caso de Uso Práctico: Conectando Redes Aisladas

Imaginemos un escenario de pentesting donde necesitamos que dos redes locales, que no comparten una puerta de enlace común, puedan comunicarse.

Topología:

  • Máquina Atacante: IP 10.10.10.2, Gateway 10.10.10.9, Red 10.10.10.0/24.
  • Máquina A: IP 10.10.10.3 y 192.168.3.3 (Dual-Homed), Redes 10.10.10.0/24 y 192.168.3.0/24.
  • Máquina B: IP 192.168.3.2, Red 192.168.3.0/24.

La Máquina Atacante puede comunicarse con la Máquina A porque ambas están en la misma LAN (10.10.10.0/24). Sin embargo, no puede alcanzar la Máquina B (192.168.3.0/24) directamente. La Máquina A, al tener dos interfaces de red, puede comunicarse con ambas redes.

Diagrama de red con tres hosts y dos subredes

Para que la Máquina Atacante pueda comunicarse con la Máquina B, debemos añadir una ruta estática en la Máquina Atacante.

Pasos:

  1. Verificar las rutas existentes en la Máquina Atacante:Se puede usar ip route o route -n para ver la tabla de enrutamiento actual.

    # Ejemplo de salida de 'ip route'Kernel IP routing tableDestination Gateway Flags Metric Ref Use Ifacedefault 10.10.10.9 UG 100 0 0 eth010.10.10.0/24 0.0.0.0 U 100 0 0 eth0# No hay ruta para 192.168.3.0/24
  2. Añadir la ruta estática:Utilizaremos ip route add para dirigir el tráfico destinado a la red 192.168.3.0/24 a través de la Máquina A, que actúa como gateway para esa red desde la perspectiva de la Máquina Atacante.

    # Añadir la ruta especificando el gatewaysudo ip route add 192.168.3.0/24 via 10.10.10.3# O especificando la interfaz de salida (si es necesario)sudo ip route add 192.168.3.0/24 via 10.10.10.3 dev eth0

    Nota: En este ejemplo, 10.10.10.3 (Máquina A) es el gateway que la Máquina Atacante usará para alcanzar la red 192.168.3.0/24. Si el gateway predeterminado fuera 10.10.10.9 y este no tuviera conocimiento de la red 192.168.3.0/24, la ruta anterior no funcionaría. La clave es que la Máquina A está "dual-homed" y puede reenviar el tráfico.

  3. Verificar la nueva ruta:Comprobamos la tabla de enrutamiento nuevamente.

    # Ejemplo de salida actualizada de 'ip route'Kernel IP routing tableDestination Gateway Flags Metric Ref Use Ifacedefault 10.10.10.9 UG 100 0 0 eth010.10.10.0/24 0.0.0.0 U 100 0 0 eth0192.168.3.0/24 10.10.10.3 UG 100 0 0 eth0

Ahora, la Máquina Atacante podrá enviar paquetes a la Máquina B (192.168.3.2), y estos serán reenviados a través de la Máquina A. Para que esto funcione completamente, la Máquina A también debe tener habilitado el reenvío de IP (IP forwarding).

Habilitar IP Forwarding en la Máquina A (Dual-Homed)

Para que la Máquina A pueda actuar como router entre las dos redes, se debe habilitar el reenvío de IP.

  1. Verificar el estado actual:

    sysctl net.ipv4.ip_forward

    Si el valor es 0, está deshabilitado.

  2. Habilitar temporalmente:

    sudo sysctl -w net.ipv4.ip_forward=1
  3. Habilitar permanentemente:Edite el archivo /etc/sysctl.conf y descomente o añada la siguiente línea:net.ipv4.ip_forward=1Luego, aplique los cambios con:bashsudo sysctl -p

Configuración de tabla de rutas en GNU/Linux - route e ip route

Consideraciones Adicionales y Opciones de ip route

El comando ip route ofrece una gran flexibilidad y permite configurar aspectos más complejos del enrutamiento.

Tipos de Rutas y Su Propósito

Las entradas en la tabla de enrutamiento pueden tener diferentes tipos, cada uno con un propósito específico:

  • unicast: La ruta más común, utilizada para enviar tráfico a un destino específico. Si se omite el tipo, ip asume unicast.
  • local: Rutas para direcciones asignadas al propio host.
  • broadcast: Rutas para direcciones de broadcast.
  • unreachable: Indica que los destinos son inalcanzables. El paquete se descarta silenciosamente.
  • blackhole: Similar a unreachable, los destinos son inalcanzables y los paquetes se descartan sin notificación.
  • prohibit: Indica que los destinos son inalcanzables debido a una prohibición administrativa. Se genera un mensaje ICMP de "administratively prohibited".
  • nat: Una ruta especial para NAT (Network Address Translation).
  • multicast: Un tipo especial utilizado para el enrutamiento multicast.

Modificadores y Atributos de Ruta

Al añadir o manipular rutas, se pueden especificar varios atributos:

  • tos (Type Of Service): Permite aplicar políticas de enrutamiento basadas en el campo TOS del paquete IP.
  • preference: Un valor numérico que determina la preferencia de una ruta sobre otra si existen múltiples rutas al mismo destino.
  • table: Especifica la tabla de enrutamiento a la que se añadirá la ruta. Linux puede tener múltiples tablas de enrutamiento (definidas en /etc/iproute2/rt_tables). La tabla main (ID 254) es la tabla principal utilizada por el kernel.
  • vrf: Permite añadir rutas a un Virtual Routing and Forwarding (VRF) instance.
  • mtu: El Maximum Transmission Unit a lo largo de la ruta.
  • rtt: Estimación inicial del Round Trip Time.
  • rttvar: Estimación inicial de la varianza del RTT.
  • window: El clamp para la ventana de congestión.
  • features: Habilita o deshabilita características por ruta.
  • nexthop: Define el siguiente salto en rutas multipath.

Múltiples Tablas de Enrutamiento

Una de las capacidades más potentes de iproute2 es la creación y gestión de múltiples tablas de enrutamiento. Por defecto, el sistema utiliza la tabla main (ID 254). Sin embargo, se pueden crear tablas adicionales (hasta 253) para implementar políticas de enrutamiento complejas, como dirigir el tráfico de diferentes interfaces por caminos distintos.

Para definir una ruta que pertenezca a una tabla específica:

sudo ip route add <NETWORK/MASK> via <GATEWAY_IP> table <TABLE_NAME_OR_ID>

Por ejemplo, para añadir una ruta a la tabla mi_tabla:

sudo ip route add 192.168.5.0/24 via 10.10.10.1 table mi_tabla

Los archivos en /etc/iproute2/rt_tables y /etc/iproute2/rt_scopes contienen definiciones y precedencias para tablas y alcances de rutas.

Persistencia de las Rutas

Es importante notar que las rutas añadidas con ip route add son temporales y se pierden al reiniciar el sistema. Para hacerlas persistentes, se deben configurar a través de los mecanismos de gestión de red de la distribución (por ejemplo, archivos de configuración en /etc/network/interfaces en Debian/Ubuntu, o NetworkManager en sistemas más modernos).

Un ejemplo de configuración de red persistente que incluye rutas estáticas podría verse así (para sistemas que usan archivos de configuración de red tradicionales):

# /etc/network/interfacesauto eth0iface eth0 inet static address 10.10.10.2 netmask 255.255.255.0 gateway 10.10.10.9auto eth1iface eth1 inet static address 192.168.3.3 netmask 255.255.255.0# Añadir ruta estática para la red 192.168.3.0/24 a través de eth0up ip route add 192.168.3.0/24 via 10.10.10.3 dev eth0# Añadir ruta estática para la red 10.10.10.0/24 a través de eth1up ip route add 10.10.10.0/24 via 192.168.3.3 dev eth1

En sistemas que utilizan NetworkManager, la configuración se realiza a través de nmcli o archivos .nmconnection.

Ventajas de iproute2 y el Comando ip

La adopción de iproute2 sobre las herramientas más antiguas ofrece varias ventajas significativas:

  • Enfoque Unificado: Consolida la funcionalidad de ifconfig, route, arp, y más, bajo el comando ip.
  • Soporte IPv4 e IPv6: Maneja de manera nativa y consistente ambos protocolos.
  • Flexibilidad Avanzada: Permite la configuración detallada de interfaces, enrutamiento, túneles, QoS, y políticas de enrutamiento.
  • Gestión de Múltiples Tablas de Enrutamiento: Facilita la implementación de escenarios de red complejos.
  • Mejor Rendimiento: Generalmente se considera más eficiente que las utilidades antiguas.

Limitaciones y Curva de Aprendizaje

A pesar de sus beneficios, iproute2 presenta una curva de aprendizaje más pronunciada que ifconfig. La falta de una interfaz gráfica y la sintaxis detallada pueden ser un obstáculo inicial. Además, la migración de scripts antiguos que dependen de ifconfig o route puede requerir modificaciones significativas.

Conclusión Parcial

El comando ip route add es una herramienta indispensable para cualquier administrador de sistemas Linux que necesite configurar rutas estáticas. Su capacidad para definir caminos de red específicos, gestionar múltiples tablas de enrutamiento y operar con ambos protocolos IPv4 e IPv6 lo convierten en un componente clave de la administración de redes avanzada. Si bien puede requerir una inversión de tiempo para dominarlo, los beneficios en términos de control y flexibilidad de la red son sustanciales. En entornos donde la optimización del tráfico y la conectividad entre redes diversas son primordiales, ip route add se convierte en una solución esencial.

tags: #ip #route #add #en #linux