Aprende a configurar la red de un servidor Linux con ip (iproute2 suite)

Cuando necesitamos configurar la red de un servidor basado en Linux, hace años se usaba el comando «ifconfig», de hecho, lo puedes seguir utilizando, pero tendrás que instalar un paquete adicional en tu sistema operativo, porque por defecto ahora se utiliza la suite iproute2, y el popular comando «ip». Todos los usuarios de Linux siempre han usado ifconfig, pero el nuevo comando ip es mucho más intuitivo y fácil de utilizar, además, también podremos configurar rutas estáticas en el sistema operativo sin tener que usar otro programa adicional (route). ¿Quieres conocer todo sobre el comando ip de la suite iproute2 para configurar tu servidor Linux a nivel de red?

Principales características de IProute2 en Linux

Iproute2 es un paquete de utilidades de red que hoy en día se encuentra de manera predeterminada en la mayoría de sistemas operativos basados en Linux, como Debian, Ubuntu, RedHat y muchas otras distribuciones orientadas tanto a escritorio como a servidores. Este paquete incluye un conjunto de herramientas muy completas que nos permitirán configurar y administrar las interfaces de red en detalle. Este paquete reemplaza por completo las funcionalidades de ifconfig, route y arp, todo ello bajo el mismo comando «ip» para facilitar a los usuarios el uso de esta potente herramienta. Por supuesto, no solamente disponemos de las mismas características de siempre, sino que en iproute2 han añadido funcionalidades muy importantes.

IProute2 es una herramienta mucho más completa y moderna que ifconfig, por lo que es recomendable su uso a la hora de gestionar diferentes aspectos de nuestra red. Con IP se pueden llevar a cabo las mismas acciones que podemos hacer con ifconfig y, al ser una suite bastante más completa, podremos configurar más parámetros que ifconfig no nos permitiría.

QoS (Quality of Service)

iproute2 nos proporciona QoS, es capaz de priorizar distintos tipos de tráfico de manera eficiente, el control de tráfico está compuesto por varias operaciones que las realiza internamente la herramienta, como el mecanismo de clasificación de los paquetes, colocación en distintas clases o flujos, e incluso limitación del número de paquetes o bytes que se pueden usar en un flujo de datos.

Balanceo de carga y túneles IP

Esta herramienta permite asignarle pesos a cada una de las interfaces de red que tengamos en el servidor, por tanto, podremos hacer un balanceo de carga basado en diferentes algoritmos, ideal para balancear el tráfico entre varias interfaces y no colapsar una de ellas. iproute2 también nos permite crear túneles que encapsulan paquetes en formato IPv4 y se envían a través de infraestructura IP.

Múltiples tablas de enrutamiento

iproute2 nos permitirá crear varias tablas de enrutamiento en el sistema operativo, podremos configurar una tabla de enrutamiento principal, y posteriormente crear diferentes tablas de enrutamiento para enrutar eficientemente todo el tráfico. Por supuesto, en cada tabla de enrutamiento podremos definir una puerta de enlace predeterminada (gateway) diferente. Esto es ideal por si tenemos varias interfaces de red en el servidor, y queremos que el tráfico que llegue por una interfaz, salga por esa misma interfaz, aunque también podría salir por otra interfaz, todo depende de cómo tengas configurado el routing en tu servidor. Sin lugar a dudas, esta funcionalidad es una de las más importantes que integra iproute2 ya que nos permitirá una gran flexibilidad.

Funcionamiento del comando ip

La herramienta principal de iproute2 es el comando «ip», con el que podremos ver y configurar direcciones IP, ver y configurar tablas de enrutamiento, ver y configurar túneles IP, y también ver y configurar la interfaz física. La sintaxis que debemos utilizar con este comando es la siguiente:

  • ip [ OPCIONES ] OBJETO [ COMANDO ]

Los «OBJETOS» que tenemos en ip son los siguientes, y son los que podremos ver y configurar los enlaces físicos, direcciones ip, rutas y más. Es muy importante que todas las órdenes estén tal y como os las ponemos, todo en minúsculas, de lo contrario, devolverá error. A continuación, tenéis los principales:

  • link: nos sirve para configurar las interfaces de red físicas o lógicas, por ejemplo, para ver el estado de todas las interfaces de red.
  • address: permite ver y configurar las direcciones IPv4 y IPv6 asociadas a las diferentes interfaces de red. Cada interfaz debe tener al menos, una dirección IP configurada.
  • addrlabel: permite añadir una etiqueta
  • neighbour: permite ver los enlaces de vecindad, es decir, se puede ver la tabla ARP del sistema operativo.
  • rule: permite ver y configurar políticas de enrutado y cambiarlas, esto se utiliza sobre todo cuando vas a configurar varias tablas de enrutamiento.
  • route: permite ver y configurar las tablas de enrutamiento, tanto de la tabla de enrutamiento principal, como de las «secundarias» que configures.
  • tunnel: permite ver los túneles IP y también configurarlos.
  • maddr: permite ver y configurar las direcciones multienlace.
  • mroute: permite ver y configurar la tabla de enrutamiento multicast.
  • mrule: permite ver y configurar políticas de enrutamiento de direcciones multicast.
  • monitor: permite monitorizar el estado de las tarjetas de red de manera continua, también direcciones IP y rutas.
  • ntable: gestiona el caché de neighbour (ARP)
  • tuntap: gestiona las interfaces TUN/TAP, orientado a las VPN como OpenVPN o WireGuard.
  • maddress: configuración de las direcciones multicast
  • xfrm: gestiona las políticas IPsec.
  • netns: administrar espacios de nombres de red
  • l2tp: configuración de L2TP
  • tcp_metrics: gestiona métricas TCP.
  • token: gestiona los identificadores con token de las interfaces.

Funcionamiento del comando ip route

Aunque «ip route» está integrado dentro de iproute2, tiene una configuración específica adicional. «ip route» nos permite ver y configurar la tabla de enrutamiento del sistema operativo, pero también nos permitirá ver y configurar todas las tablas de enrutamiento que nosotros creemos en el propio sistema operativo. Debemos tener en cuenta, que por cada entrada en la tabla de enrutamiento, debemos tener la dirección de red, máscara y el gateway, además, también podríamos configurar el ToS (tipo de servicio). El sistema operativo Linux nos permitirá crear un total de 253 tablas de enrutamiento, por defecto, el sistema operativo introduce las rutas en la tabla de enrutamiento principal que tiene ID 254, y el núcleo solamente usa esta tabla para calcular los caminos. La tabla de enrutamiento con ID 255 es la tabla de direcciones locales y de broadcast, esta tabla es mantenida por el núcleo y los administradores de red no deberían tocarla.

Si queremos añadir o quitar tablas de enrutamiento, debemos editar el archivo «/etc/iproute2/rt_tables», en RedesZone os enseñaremos más adelante cómo crear una segunda tabla de enrutamiento y configurarla, ya que tendremos que hacer uso de «ip rule» y también de «ip route».

Comandos «ip» para configurar el direccionamiento IP

En RedesZone os vamos a indicar los principales comandos que podemos utilizar la ver y configurar el direccionamiento IP, ya no deberíamos hacer uso nunca del comando «ifconfig», pero os vamos a indicar la «traducción» para que podáis comparar ambos comandos.

Mostrar dispositivos de red y su configuración

Con el comando «ifconfig» podíamos ver todas las interfaces y la configuración del direccionamiento IP en detalle.

ifconfig

Con el comando ip, tenemos dos comandos parecidos, uno de ellos nos mostrará toda la información a nivel de direccionamiento IP (ip addr show), y el otro nos mostrará el estado de la interfaz física (ip link show):

ip addr show ip link show

Estos dos comandos son muy importantes, porque podremos ver toda la información de direccionamiento IP, máscara de subred y muchos otros datos importantes para la red local, además, también podremos ver cómo tenemos configurada la interfaz física, el MTU que tenemos configurado e incluso si está o no habilitada esta interfaz de red.

Activar una interfaz de red

Si queremos activar una interfaz de red (levantarla) porque está desactivada, el comando es muy similar al del antiguo «ifconfig», pero ahora tendremos que hacer uso de «ip link» para configurar esta característica. El funcionamiento es realmente sencillo, en este caso, los comandos son muy parecidos.

ifconfig ens33 up ip link set ens33 up

Desactivar una interfaz de red

Si queremos deshabilitar o desactivar una interfaz de red, los comandos con ifconfig y con ip link son casi iguales, tal y como ocurría anteriormente para activar la red.

ifconfig ens33 down ip link set ens33 down

Para ejecutar la ayuda de «ip link» y ver todos los comandos que podemos ejecutar, simplemente basta con poner:

ip link help

Este comando de «help» podremos ejecutarlo también en otros comandos de «ip» para ver todas las opciones de configuración disponibles, de esta forma, podremos ver en detalle todas las opciones disponibles que podremos aplicar.

Configurar una dirección IP en una interfaz

Configurar una dirección IP en una interfaz es realmente sencillo, tanto con ifconfig como también con el comando «ip», y es que la sintaxis es muy parecida a la sintaxis utilizada en los routers Cisco con el típico «ip addr» que todos hemos utilizado alguna vez.

ifconfig ens33 192.168.1.1/24 ip addr add 192.168.1.1/24 dev ens33

Con este comando estaremos indicando que queremos poner una dirección IP y una máscara de subred específica a una interfaz que nosotros hemos definido.

Eliminar una dirección IP de una interfaz.

Esta característica no es soportada por ifconfig directamente, sino que se debe configurar la dirección IP 0.0.0.0

ifconfig ens33 0.0.0.0

En el caso de ip, es tan fácil como sustituir el «add» para configurar una IP, por «del» para eliminarla (delete).

ip addr del 192.168.1.1 dev ens33

Tal y como podéis ver, es realmente fácil y rápido eliminar una dirección IP de una interfaz con la suite iproute2.

Añadir una interfaz virtual (alias)

En todas las interfaz físicas tenemos la posibilidad de configurar interfaces virtuales para otro tipo de usos, esto también se le conoce como «alias». En el caso de ifconfig y de «ip» lo podremos hacer de forma fácil y rápida sin muchas complicaciones.

En el caso de ifconfig, se podría hacer así:

ifconfig ens33:1 10.0.0.1/8

En el caso de ip, simplemente tenemos que poner la IP de siempre, pero con «label ens33:1» o el alias que queramos.

ip addr add 10.0.0.1/8 dev ens33 label ens33:redeszone

Mientras que con «ifconfig» no es necesario poner ningún tipo de «label», en el caso de «ip» sí tendremos que colocarlo a modo de etiqueta, además, la parte positiva de este label es que podremos nombrar la interfaz de red virtual recién creada como nosotros queramos, no es necesario que siga la sintaxis ens33:1 o lo que sea, podremos poner un nombre.

Para ejecutar la ayuda de «ip addr» y ver todos los comandos que podemos ejecutar, simplemente basta con poner:

ip addr help

Debemos recordar que la ayuda de «ip» es realmente útil y nos permitirá saber qué comandos se permiten ejecutar.

Ver las entradas en la tabla ARP

arp -n ip neigh show

Añadir una entrada en la tabla ARP

En el caso de «ifconfig», no se hace con este comando, sino con el comando «arp» que ahora ha desaparecido:

arp -i eth0 -s 192.168.0.1 00:11:22:33:44:55

En el caso de iproute2, tenemos que usar el objeto «neigh», tal y como podéis ver:

ip neigh add 192.168.0.1 lladdr 00:11:22:33:44:55 nud permanent dev ens33

Quitar una entrada de ARP

ifconfig -arp ens33 ip neigh del 192.168.0.1 lladdr 00:11:22:33:44:55 nud permanent dev ens33

Para ejecutar la ayuda de «ip neigh» y ver todos los comandos que podemos ejecutar, simplemente basta con poner:

ip neigh help

Tal y como habéis visto, las posibilidades de iproute2 con ip link, ip addr y ip neigh son casi infinitas, además, la sintaxis es muy intuitiva, pareciéndose muchísimo a los routers Cisco que tan conocidos son en el mundo de las redes.

Comandos «ip route» para configurar rutas

El comando «ip route» nos permitirá configurar la tabla de enrutamiento principal del sistema operativo, y también las tablas de enrutamiento adicionales que configuremos en el sistema operativo. A continuación, tenéis algunos ejemplos de uso con únicamente el comando ip route, sin utilizar el antiguo «route» que teníamos con la suite de «ifconfig».

Añadir una ruta en la tabla de enrutamiento

ip route add 10.8.0.0/24 via 192.168.1.2

Borrar una ruta en la tabla de enrutamiento

ip route del 10.8.0.0/24 via 192.168.1.2

Cambiar una ruta en la tabla de enrutamiento

ip route chg 10.8.0.0/24 via 192.168.1.3

Agregar la puerta de enlace predeterminada (gateway)

ip route add default via 192.168.1.1

Borrar la puerta de enlace predeterminada (gateway)

ip route del default via 192.168.1.254

Ver el estado de la tabla de enrutamiento principal

ip route show ip route list

Tal y como podéis ver, agregar, borrar y cambiar rutas estáticas es realmente fácil, igual que definir una puerta de enlace predeterminada en nuestro sistema operativo.

Cómo configurar varias tablas de enrutamiento en Linux

Una de las características principales de iproute2, es que nos permite crear múltiples tablas de enrutamiento, con el objetivo de poder tener varios gateways. Lo primero que tenemos que hacer es editar el archivo que está en «/etc/iproute2/rt_tables», cuyo contenido es el siguiente

#
# reserved values
#
255 local
254 main
253 default
0 unspec
#
# local
#
#1 inr.ruhep

Tal y como veis, tenemos tres tablas, local, main y default. Lo único que tenemos que hacer es añadir el nombre de la nueva tabla de enrutamiento, por ejemplo, «redeszone» con un identificador de preferencia 66.

#
# reserved values
#
255 local
254 main
253 default
0 unspec
#
# local
#
#1 inr.ruhep

66 redeszone

Una vez que lo hayamos añadido, guardamos el archivo, y empezamos a añadir rutas de la forma de siempre.

Nosotros en nuestro ordenador tenemos una dirección IP privada 10.10.2.2, queremos poner que el gateway sea 10.10.2.1, y añadir una ruta a 10.8.0.0/24 en la interfaz ens37.

ip route add 10.8.0.0/24 dev ens37 src 10.10.2.2 table redeszone

Debemos poner el comando «src» seguido de la dirección IP de la interfaz física real, y posteriormente con «table» elegir el nombre de la tabla. Si queremos borrar esta ruta que hemos creado en la tabla de enrutamiento «redeszone», tenemos que poner:

ip route del 10.8.0.0/24 dev ens37 src 10.10.2.2 table redeszone

Si queremos añadir el gateway a esta nueva tabla de enrutamiento, debemos poner lo siguiente:

ip route add default via 10.10.2.1 dev ens37 table redeszone

Para que el sistema operativo sepa cuándo usar esta nueva tabla de enrutamiento que acabamos de crear, se deben configurar dos reglas, una con el tráfico entrante y otra con el tráfico saliente que llegue a una interfaz en concreto.

ip rule add from 10.10.2.2/32 table redeszone

ip rule add to 10.10.2.2/32 table redeszone

Estas dos reglas indican que el tráfico desde la dirección IP 10.10.2.2 utilice la tabla de enrutamiento «redeszone», y el tráfico a la IP 10.10.2.2 también la utilice.

Para ver el estado de la tabla de enrutamiento que acabamos de crear, ejecutamos:

ip route list table redeszone

Si queremos ver todas las reglas añadidas, ponemos:

ip rule show

Hacer persistentes todos los cambios en IPs y rutas

Si reiniciamos el servidor, todos los cambios que hayamos hecho en el sistema operativo con el comando «ip» no se guardarán al reiniciar el servidor, por tanto, debemos hacer persistentes estos cambios. Dependiendo del sistema operativo, se hace de una forma u otra, en RedesZone hemos utilizado Debian última versión para hacer esto. Lo primero que debemos hacer es editar el fichero de configuración ubicado en «/etc/network/interfaces», aquí es donde podremos poner todas las direcciones IP y las rutas y reglas que nosotros deseemos.

Un fichero de configuración de ejemplo, sería el siguiente, donde tenemos un total de tres interfaces físicas, varias direcciones IP secundarias con alias, y también un total de tres tablas de enrutamiento. Por cada tabla de enrutamiento, necesitamos un gateway y las correspondientes reglas con «ip rule»:

auto eth0
allow-hotplug eth0
iface eth0 inet static
address 192.168.1.154
netmask 255.255.255.0
gateway 192.168.1.153

iface eth0 inet static
address 192.168.1.155
netmask 255.255.255.0

auto eth1
allow-hotplug eth1
iface eth1 inet static
address 10.10.1.114
netmask 255.255.255.248
post-up ip route add 10.10.1.112/29 dev eth1 src 10.10.1.114 table tabla2
post-up ip route add default via 10.10.1.113 dev eth1 table tabla2
post-up ip rule add from 10.10.1.114/32 table tabla2
post-up ip rule add to 10.10.1.114/32 table tabla2

iface eth1 inet static
address 10.10.1.115
netmask 255.255.255.248
post-up ip route add 10.10.1.112/29 dev eth1 src 10.10.1.115 table tabla2
post-up ip rule add from 10.10.1.115/32 table tabla2
post-up ip rule add to 10.10.1.115/32 table tabla2

auto eth2
allow-hotplug eth2
iface eth2 inet static
address 10.20.200.114
netmask 255.255.255.248
post-up ip route add 10.20.200.112/29 dev eth2 src 10.20.200.114 table tabla3
post-up ip route add default via 10.20.200.113 dev eth2 table tabla3
post-up ip rule add from 10.20.200.114/32 table tabla3
post-up ip rule add to 10.20.200.114/32 table tabla3

iface eth2 inet static
address 10.20.200.115
netmask 255.255.255.248
post-up ip route add 10.20.200.112/29 dev eth2 src 10.20.200.115 table tabla3
post-up ip rule add from 10.20.200.115/32 table tabla3
post-up ip rule add to 10.20.200.115/32 table tabla3

Gracias a iproute2 podremos realizar configuraciones avanzadas realmente interesantes, si tenéis alguna duda podéis ponernos un comentario y os ayudaremos con vuestra configuración.