Iproute2: Usas ifconfig? Es hora de actualizarse!

Publicado por Diego Córdoba en

Sí, como lo dice el título del artículo, ifconfig, el súper conocido comando de gestión de interfaces de red en sistemas Linux, está desactualizado, «deprecated» en terminología técnica, y sería interesante dejar de usarlo, en favor de la nueva suite de comandos y herramientas iproute2.

Fundamentos de ifconfig e iproute2

ifconfig es un comando correspondiente a un paquete de software denominado net-tools, heredado de sistemas Unix. Si bien el software funciona perfecto, hoy en día los sistemas Linux poseen herramientas mucho más poderosas y actualizadas

ifconfig se «utilizaba» en conjunción con route, iptunnel, y algún otro que no recuerdo, para gestionar la mayor parte de los parámetros del networking en sistemas Linux.ipa

Hoy en día, net-tools es reemplazado por el paquete iproute2. iproute incluye al comando «ip», que posee subcomandos para gestionar todos los parámetros de red que antes requerían varios comandos, y algunas cosas más 🙂

Es decir, ip viene a ser el reemplazo de ifconfig, route, iptunnel, etc, y deberíamos mantenernos actualizados, utilizando herramientas nuevas.

De hecho, las certificaciones internacionales más reconocidas, como LPI, ya incluyen en sus planes de estudio a iproute2, y la tendencia es que a corto plazo, no consideren herramientas desactualizadas como ifconfig.

Algunos comandos interesantes de iproute2

No vamos a ahondar demasiado en comandos en este artículo, en otra oportunidad aprenderemos a configurar interfaces de red, tablas de enrutamiento, o tablas ARP, ahora, una pequeña comparativa de funcionalidades.

Viendo el detalle de las interfaces de red

El conocido comando ifconfig nos permitía listar nuestras interfaces de red de nuestro equipo. Veamos una salida de ejemplo:

diego@cryptos:~$ ifconfig
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.1.10  netmask 255.255.255.0  broadcast 192.168.1.255
        inet6 fe80::be5f:f4ff:fed9:aa5e  prefixlen 64  scopeid 0x20<link>
        ether bc:5f:f4:d9:aa:5e  txqueuelen 1000  (Ethernet)
        RX packets 5166535  bytes 4159083054 (3.8 GiB)
        RX errors 0  dropped 153  overruns 0  frame 0
        TX packets 5653552  bytes 1263680962 (1.1 GiB)
        TX errors 0  dropped 2 overruns 0  carrier 0  collisions 0

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        inet6 ::1  prefixlen 128  scopeid 0x10<host>
        loop  txqueuelen 1  (Local Loopback)
        RX packets 120453  bytes 15815827 (15.0 MiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 120453  bytes 15815827 (15.0 MiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

Ifconfig solo nos muestra las interfaces activas, si quisiéramos ver todas las interfaces, deberíamos utilizar el modificador «-a» en ifconfig.

Veamos la salida de «ip a», o «ip addr», o «ip address», son todos alias de subcomando:

diego@cryptos:~$ ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    link/ether bc:5f:f4:d9:aa:5e brd ff:ff:ff:ff:ff:ff
    inet 192.168.1.10/24 brd 192.168.1.255 scope global eth0
       valid_lft forever preferred_lft forever
    inet 10.0.0.1/24 brd 10.0.0.255 scope global eth0
       valid_lft forever preferred_lft forever
    inet6 fe80::be5f:f4ff:fed9:aa5e/64 scope link
       valid_lft forever preferred_lft forever

Ahora vemos, en otro formato, todas las interfaces de red, y la salida es un poco más compacta, y, para quienes nos acostumbramos, hasta más cómoda.

Información de una interfaz en particular

Cabe aclarar que para ver la información de una interfaz en particular, también ambos comandos lo permiten:

diego@cryptos:~$ ifconfig eth0
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.1.10  netmask 255.255.255.0  broadcast 192.168.1.255
        inet6 fe80::be5f:f4ff:fed9:aa5e  prefixlen 64  scopeid 0x20<link>
        ether bc:5f:f4:d9:aa:5e  txqueuelen 1000  (Ethernet)
        RX packets 5167206  bytes 4159316272 (3.8 GiB)
        RX errors 0  dropped 153  overruns 0  frame 0
        TX packets 5654234  bytes 1263788547 (1.1 GiB)
        TX errors 0  dropped 2 overruns 0  carrier 0  collisions 0

O, más actualizado:

diego@cryptos:~$ ip a show eth0
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    link/ether bc:5f:f4:d9:aa:5e brd ff:ff:ff:ff:ff:ff
    inet 192.168.1.10/24 brd 192.168.1.255 scope global eth0
       valid_lft forever preferred_lft forever
    inet 10.0.0.1/24 brd 10.0.0.255 scope global eth0
       valid_lft forever preferred_lft forever
    inet6 fe80::be5f:f4ff:fed9:aa5e/64 scope link
       valid_lft forever preferred_lft forever

Activando o desactivando una interfaz de red con iproute2

El recordado comando ifconfig nos permitía activar o desactivar las interfaces de red de la siguiente manera:

ifconfig eth0 down

ifconfig eth0 up

Ahora, esas tareas se pueden realizar utilizando el subcomando «link» del comando ip… y como se acostumbra, «ip link», o «ip li» son alias:

ip link set dev eth0 down

ip link set dev eth0 up

Y la frutilla del postre

Para finalizar este breve artículo, veamos el comando «ip ne», o «ip neigh» o «ip neighbor», para ver los vecinos en la cache ARP de nuestro sistema:

diego@cryptos:~$ sudo ip neighbor
192.168.1.1 dev eth0 lladdr c8:3a:35:54:2d:38 REACHABLE

Si usas ifconfig, sabrás que esta información no te la puede dar el comando, y debes utilizar otros comandos relacionados a ARP, o herramientas como ethtool o lldpctl 🙂

En otra oportunidad analizaremos más en detalle las sintaxis de los comandos de «ip», y aprenderemos muchas de sus ventajas!


Aquí un vídeo donde explico estos contenidos y se pueden ver algunos ejemplos prácticos.

Espero les sea de utilidad!

¡Por cualquier consulta no duden en escribir! Y ya saben, quedan invitados a sumarse al canal de youtube de JuncoTIC y a nuestras redes sociales!


¿Comentarios? ¿Preguntas?

Si queres dejarnos tus comentarios y consultas te esperamos en el grupo de Telegram de la comunidad JuncoTIC!


Diego Córdoba

- Ingeniero en Informática - Mg. Teleinformática - Tesis pendiente - Docente universitario - Investigador

10 comentarios

david · 21 abril, 2016 a las 02:56

De todas maneras
La presentación de ifconfig sigue siendo mucho más ordenada y clara, a simple vista

    Diego Córdoba · 21 abril, 2016 a las 14:10

    Yo creo que es una cuestión de costumbre.
    Por un lado, la salida de «ip a» no incluye los datos de TX, RX, etc, que suelen no utilizarse salvo que necesites monitorear tráfico, para lo que utilizarás herramientas más completas como iftop o iptraf.
    Por otro, algo que a mi me resulta muy cómodo, cuando tenés una interfaz de red con 10 alias (ip aliassing) me es más agradable ver todas las líneas «inet» o «inet6» ordenadas en la misma interfaz, y no verlo como interfaces distintas como hace ifconfig.
    Igual, coincido en que «ip a» se ve desordenado si estás acostumbrado a ifconfig, pero con el tiempo, por lo menos a mi, me resultó más cómodo el nuevo formato.
    Gracias por comentar! Slds!

Samuel Blázquez · 27 septiembre, 2016 a las 19:43

Tiene la misma utilidad que el netsh. El que sabe usar filtros, poco o nada necesita sintaxis complejas.
Por cierto ¿que documento tecnico oficial marca como obsoleto ifconfig?

    Diego Córdoba · 27 septiembre, 2016 a las 23:28

    Hola Samuel! Gracias por comentar.

    Por lo que entiendo, el netsh que mencionas es una herramienta de Windows, no de Linux. El comando ifconfig pertenece al paquete net-tools (Unix) y se consideró obsoleto en Linux (no en Unix) desde que existe iproute2.

    Te paso un link de la Linux Foundation donde recomiendan dejar de utilizar ifconfig y relacionados, en pro de ip (iproute2), puesto que el paquete net-tools que incluye a ifconfig, no está siendo mantenido en varias distribuciones de Linux.

    https://www.linux.com/learn/replacing-ifconfig-ip

    Espero te sirva!

      Samuel Blázquez · 28 septiembre, 2016 a las 09:06

      Vale. No es un CVE ni similar.
      En el enlace no pone que sea «Unsupported» por lo que sigue soportado (confirmado con mi enlace de Red-Hat aquí en la oficina. Nos hemos reído un poco del tema).
      En cuanto a su utilidad, pues no se, pero sigo prefiriendo ifconfig | grep addr a la salida de su supuesto reemplazo, o netstat | egrep ‘tcp|udp’ a su otro reemplazo (ah, que esto no lo puede hacer). O incluso un netstat -rn que es mas rápido que route o cualquier otro.

      Vamos a ser realistas. Hasta que SystemV, Sco, BSD y demás (y trabajo bastante con HP/UX y AIX) suelten ifconfig, linux y GNU no van a arriesgarse a eliminar ifconfig, net-tools y otros en favor de algo que sinceramente, complica mucho la vida. Eso lo han aprendido de M$, donde desde W2000 se intentó reemplazar ipconfig por netsh sin exito, así que a mantener ambas, mal que le duela a ubuntu (y esto lo sabemos a ciencia cierta. A ubuntu le duele que exista el resto del mundo).

        Diego Córdoba · 28 septiembre, 2016 a las 20:53

        Si, en ningún momento se mencionó que dejó de ser soportado, solamente que está «deprecado» en pro de iproute2, y el post es referido a Linux únicamente, no a otros *nix.

        Respecto de la utilidad, no hay dudas de que el comando ip realiza las mismas tareas que ifconfig, route, iptunnel, ipmaddr y arp… pero si te gusta usar los de net-tools, no te voy a decir que no 🙂 Y más, si trabajás en ambientes Unix seguramente net-tools te sea más cómodo y fácil de usar.

        Por lo de netstat, netstat es una navaja suiza del networking en *nix y la suelo utilizar mucho, aunque, según leo en el manpage «oficial» de kernel.org [1], también parece que netstat resulta obsoleto, y da paso al comando «ss» … creo que tengo material para otro artículo 😛

        Yo trabajo en Linux, principalmente con redes, llevo varios años con iproute2 y no me puedo quejar, lejos de complicarme la vida, me la simplificó mucho.

        En cuanto a que Linux se arriesgue a eliminar el paquete aún cuando Unix lo mantenga… creo que hoy en día Linux y Unix son dos proyectos muy independientes, y la eliminación del paquete en Linux depende, me parece a mi, más de cada distribución. Que Linux Foundation recomiende iproute2 [2] o ss por considerar a net-tools obsoleto, no significa que todas las distros deban eliminarlo de sus repos… y tampoco creo que Linux dependa tanto de Unix como para que tenga alguna importancia.

        Saludos cordiales!

        Referencias:
        [1] http://man7.org/linux/man-pages/man8/netstat.8.html
        [2] https://wiki.linuxfoundation.org/networking/net-tools

Javi Felices · 29 septiembre, 2017 a las 13:31

Buenas Diego.

Antes de nada gracias por tu blog, vídeos y artículos, desde hace poco tiempo soy seguidor, un mero aprendiz y me gusta estar al día.

También comentarte que ojalá puedas publicar más artículos sobre «ip» y cosillas de red.

Una cuestión, a lo mejor antes era válido, no sé, pero me parece que para activar o desactivar una interfaz de red es:

ip link set eth0 down
ip link set eth0 up

En el código que has puesto aparece dev.

Un saludo y de nuevo gracias.

    Diego Cordoba - @d1cor · 30 septiembre, 2017 a las 00:37

    Hola Javi!
    Antes que nada muchísimas gracias por tus palabras! Por supuesto que seguiremos publicando! Y más sobre networking 🙂
    He estado muy complicado estos últimos meses con el trabajo, pero pronto volveré a la publicar más activamente!

    Por tu consulta, el comando puede ejecutarse de las dos maneras, particularmente el operador «link / li» te permite omitir el «dev»… yo lo utilizo mas que nada por costumbre, como lo utilizo en casi todos los comandos «ip».

    Así, todos estos comandos son equivalentes:

    ip link set eth0 {down|up}
    ip link set dev eth0 {down|up}
    ip li set eth0 {down|up}
    ip li set dev eth0 {down|up}
    ip l set eth0 {down|up}
    ip l set dev eth0 {down|up}

    Cualquier consulta quedo a disposición.
    Saludos y gracias nuevamente!!

      Javi Felices · 30 septiembre, 2017 a las 07:37

      Antes de nada muchas gracias por tu cordialidad y gran respuesta.

      A lo que me refería, que set tiene que ponerse, y dev es opcional, pero en el ejemplo no pones set, está así.

      ip link dev eth0 down
      ip link dev eth0 up

      Un saludo y de nuevo gracias.

        Diego Cordoba - @d1cor · 30 septiembre, 2017 a las 22:30

        Ahhh si si! tenés razón, no había entendido tu pregunta xD
        Ahí corregí lo que me decís, sí, «set» es obligatorio en el comando.
        Gracias!!

Los comentarios están cerrados.