La respuesta a esta interrogante puede parecer simple: "pues mirar en la boca de red de la interfaz de nuestra computadora a ver si tiene un cable conectado". Aunque la cosa cambia si estamos trabajando con un servidor, en un entorno corporativo. La respuesta puede cambiar a: "pues vamos hasta el CPD (centro de procesamiento de datos, centro de cómputos) a ver si el servidor tiene un cable conectado a la interfaz de red", eso si el CPD queda cerca de nuestra ubicación actual, y si tenemos permisos de acceso físico al mismo. Puede que estemos realizando un trabajo de consultoría en un cliente y no tengamos permiso de acceso físico al centro de cómputos. Pero la situación se complica aún más si el CPD queda relativamente lejos. Puede que estemos trabajando remotamente en un equipo ubicado a algunos cientos de metros, inclusive kilómetros, o miles de kilómetros si es un servicio en la nube. La posibilidad de acercarse físicamente al servidor a revisar su interfaz se diluye.
Por ello, en este breve artículo voy a demostrar diferentes técnicas para determinar, en GNU/Linux, si el cable de red está conectado a la interfaz y tiene enlace (link), es decir, que en la otra punta del cable haya algo conectado, y no sea una tostadora.
La primera técnica es la más común y conocida, y la que no puede fallar nunca: utilizar el viejo y querido comando ip
. La herramienta ip
es una suite completa para manipular absolutamente todos los componentes del protocolo IP (Internet Protocol) desde dispositivos, direcciones, tablas y políticas de ruteo, túneles y monitoreo. Esta herramienta se incluye desde la versión 2.2 del kernel Linux, razón por la cual funciona en absolutamente todo sistema GNU/Linux existente (no sé cuantos sistemas con kernel Linux < 2.2 pueden quedar aún con vida).
Esta herramienta aplica y obtiene configuraciones utilizando diferentes "objetos" para cada componente del protocolo. Por ejemplo, las direcciones IP se obtienen y configuran a través del objeto address
, el cual se puede identificar utilizando "address", "addr", o simplemente "a". Puede resultar una herramienta demasiado avanza y compleja para un novato en el área de redes y teleprocesamiento, así que simplemente voy a comentar que para obtener configuraciones a nivel dispositivo se debe utilizar el objeto "link".
Por ejemplo, para obtener el estado de enlace del dispositivo "eth0", ejecutar ip link show eth0
:
root@debian7# ip link show eth0 2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP mode DEFAULT qlen 1000 link/ether ff:fe:f5:dd:d4:43 brd ff:ff:ff:ff:ff:ff
Como se observa en la salida, la información de estado, "state UP", indica que la interfaz tiene enlace (link, tiene el cable conectado y enlazado correctamente con algún otro dispositivo de red). Si no tiene link, la salida reporta "state DOWN":
root@debian7# ip link show eth1 3: eth1: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN mode DEFAULT qlen 1000 link/ether ff:fe:f5:dd:d4:44 brd ff:ff:ff:ff:ff:ff
Si se desea ver el estado de enlace de todos los dispositivos, simplemente ejecutar ip link show
.
Utilizando esta herramienta es posible, por ejemplo, agregar una dirección IP adicional a una interfaz ejecutando ip address add 192.168.1.34/24 dev eth0
, o de forma abreviada ip a a 192.168.1.34/24 dev eth0
. La suite ip
autocompleta todos los objetos y comandos (al igual que Quagga es un comportamiento heredado de una conocida marca de equipos de red). Cabe aclarar que todos los cambios realizados con esta suite se pierden en cada reinicio, por ello cada distribución GNU/Linux implementa la persistencia de las configuraciones de red de diferentes formas.
Para dominar esta herramienta, leer la página de manual: man ip
. En debian y derivados la documentación se encuentra separada en diferentes manpages: ip-address(8), ip-addrlabel(8), ip-l2tp(8), ip-link(8), ip-maddress(8), ip-monitor(8), ip-mroute(8), ip-neighbour(8), ip-netns(8), ip-ntable(8), ip-route(8), ip-rule(8), ip-tunnel(8) y ip-xfrm(8).
Otra forma de obtener información del estado de un enlace es utilizar ethtool
. Esta herramienta se utiliza para consultar y controlar dispositivos de red Ethernet cableados. En Debian y derivados se instala ejecutando apt-get install ethtool
.
Esta herramienta reporta información interesante, como la velocidad negociada y los modos de links soportados y ofrecidos:
root@debian7# ethtool eth0 Settings for eth0: Supported ports: [ TP ] Supported link modes: 10baseT/Half 10baseT/Full 100baseT/Half 100baseT/Full 1000baseT/Full Supported pause frame use: No Supports auto-negotiation: Yes Advertised link modes: 10baseT/Half 10baseT/Full 100baseT/Half 100baseT/Full 1000baseT/Full Advertised pause frame use: No Advertised auto-negotiation: Yes Speed: 1000Mb/s Duplex: Full Port: Twisted Pair PHYAD: 1 Transceiver: internal Auto-negotiation: on MDI-X: Unknown Supports Wake-on: g Wake-on: d Link detected: yes
La salida reporta si una interfaz tiene enlace, y es posible filtrarla con grep
:
root@debian7# ethtool eth0 | grep Link Link detected: yes
Una tercera técnica para determinar si una interfaz tiene link, consiste en consultar el nodo /sys/class/net
del sistema de archivos virtual /sys
que contiene información de controladores y dispositivos:
root@debian7# ls /sys/class/net/ eth0 eth1 eth2 eth3 lo
Como se observa, en este nodo existe un directorio para cada dispositivo de red, y diferentes archivos que exportan información relevante sobre los mismos:
root@debian7# ls /sys/class/net/eth0 addr_assign_type broadcast dev_id flags iflink netdev_group queues subsystem uevent address carrier dormant ifalias link_mode operstate speed tx_queue_len addr_len device duplex ifindex mtu power statistics type
Los archivos carrier
y operstate
reportan si la interfaz tiene "carrier" (cual es el estado del link físico, es decir, si la interfaz tiene señal) y cual es su estado operacional, respectivamente:
root@debian7# cat /sys/class/net/eth0/carrier 1
root@debian7# cat /sys/class/net/eth0/operstate up
Como se observa, la interfaz tiene carrier y está levantada (up). Los diferentes estados operacionales pueden ser: "unknown" (por ejemplo, si no tiene driver), "notpresent" (no se detecta su presencia), "down", "lowerlayerdown" (si la interfaz está apilada a otra interfaz que está "down"), "testing", "dormant" y "up".
Si desconectan el cable el carrier pasa a 0, y el estado operacional a "down":
root@debian7# cat /sys/class/net/eth0/carrier 0
root@debian7# cat /sys/class/net/eth0/operstate down
Yo hice la prueba con una máquina virtual VMware, ya que permite desconectar el cable sin remover la interfaz de hardware virtual (QEMU/KVM aún no posee esta funcionalidad).