lunes, 26 de septiembre de 2016

Sacando partido a nuestra tarjeta de red con ethtool

Linux siempre ha destacado por su versatilidad y por la libertad que le ofrece a uno para cambiar lo que desee, ya sea a nivel de código fuente o configuración. Entre todas estas libertades, obviamente tenemos también la libertad de modificar el comportamiento de nuestra tarjeta de red... Algo poco común, pero que puede sernos de una enorme utilidad en algunos casos específicos en los que por algún motivo u otro la tarjeta de red no actúa como nosotros queremos... La velocidad del enlace nos la adecuada, la conexión no es Full Duplex, no detecta el enlace, etc... Generalmente con usar las herramientas clásicas como ping, traceroute e ifconfig, podemos solucionar los errores más comunes, pero a veces necesitamos tener información más detallada o "tunear" la tarjeta de red y para ello tendremos que usar una utilidad más avanzada; una utilidad llamada ethtool.

ethtool_portada

Ethtool es una herramienta que nos permite obtener información de nuestra tarjeta de red, de nuestro enlace y, lo más importante de todo, es que nos permite modificar ciertos parámetros para adaptarlos lo mejor posible a nuestra conexión; obviamente la herramienta no siempre nos dejará hacer todo lo que queramos, pero sí que nos permite tener cierta flexibilidad de la que generalmente careceríamos.

Comencemos con el uso más básico de ethtool, que sería la obtención de la información general de la tarjeta de red; algo tan sencillo como hacer:

ethtool $interfaz_de_red

Esto significaría que si quisiésemos hacer referencia a la interfaz de red más común de todas, es decir eth0, escribiríamos:

ethtool eth0

El resultado obtenido variaría dependiendo de la interfaz de red que tengamos, del tipo de conexión, de si el comando es realizado sobre una máquina virtual, el tipo de máquina virtual, etc... Pero un resultado de ejemplo sería:

ethtool_base

Esta información está especialmente orientada al enlace entre el equipo y el router/switch (u otro equipo), pero a veces deseamos tener información del driver, información que con el comando lspci no nos es suficiente. En este caso habría que añadir el parámetro -i antes de especificar la interfaz de red.

ethtool -i eth0

ethtool_i

Otro dato muy interesante que podemos obtener de la interfaz de red es el de un listado de estadísticas que mostrarían la cantidad de bytes enviados, recibidos y el tipo de éstos... Esta información puede parecer superflua, pero nos puede dar una pista sobre el tráfico generado a través de esta interfaz... Por ejemplo no tiene sentido que una interfaz de red que, supuestamente, está pensada para la gestión del equipo vía SSH, genere tráfico multicast, cosa que gracias a esta herramienta podríamos saberlo sin requerir el uso de Wireshark. Esto lo lograríamos mediante el parámetro -S.

ethtool -S eth0

ethtool_S

Pero con esto no tendríamos suficiente... Conocer las características de la tarjeta y del enlace de ésta está muy bien, pero es mucho más útil modificarla a nuestro gusto para que se adapte a nuestras necesidades. Todo cambio realizado por ethtool, requiere del uso del parámetro -s (minúscula), tras el cual se pueden indicar qué parámetros deseamos cambiar. Aquí los cambios que se pueden hacer son varios y suelen estar estrechamente vinculados con los mostrados mediante la orden básica de ethtool (es decir ethtool $interfaz_de_red), con lo que antes de mostraros un par de ejemplos vamos a ver algunos de los parámetros más populares:

  • speed: Probablemente el parámetro más veces modificado de todos. Determina la velocidad de la conexión, la cual es establecida en megabytes por segundo; La velocidad varía dependiendo de la tarjeta de red; algunas soportan 10, otras 100 e incluso hay tarjetas de red que soportan 1000 o incluso 10000 megabytes por segundo, con lo que dependiendo de la capacidad de nuestra tarjeta podremos seleccionar una velocidad u otra. Para saber las velocidades que soporta nuestra tarjeta (y las velocidades que podemos escoger), tendremos que revisar los parámetros Supported link modes (que nos dirá la velocidad a la que puede trabajar la tarjeta de red) y Advertised Link modes (que nos dirá qué tipo de velocidad podemos especificar, pues a veces el switch/dispositivo al que estamos conectado no soporta las mismas velocidades que nosotros). Ambos parámetros pueden ser consultados mediante el uso del comando básico de ethtool. Para especificar la velocidad simplemente habría que poner speed, seguido de la velocidad; Ejemplo: ethtool -s eth0 speed 100.
  • port: Un parámetro que tiene bastante importancia en las conexiones es el tipo de puerto que se especifica en la interfaz de red al realizar una conexión. Generalmente este parámetro es "negociado" automáticamente cuando se conectan dos máquinas, pero a veces queremos optar por una opción más "artesanal". Los tipos de puerto que podemos especificar son:
    • tp: Un enlace de red usando un cable de Ethernet del tipo Twisted Pair (el enlace más común).
    • aui: Un enlace del tipo Attachment Unit Interface, que es el que se realizaría con un HUB.
    • bnc: Una conexión Ethernet que usa conectores BNC y cable coaxial (es poco común, pero la opción en sí existe).
    • mii: Una conexión de red usando Media Independent Interface (muy poco usado).
    • fibre: Como su propio nombre indica, haría que la conexión fuese de Ethernet si bien el enlace sería del tipo fibra óptica; lo cual generalmente se logra a través de adaptadores. 
          Ejemplo: ethtool -s eth0 port tp.
  • duplex: A veces queremos que el enlace actué de una manera distinta la "habitual"; es decir que la conexión sea half duplex, en vez de full duplex y viceversa. Esta información se obtiene también mediante el uso básico de ethtool y para cambiar dicho parámetro simplemente tendremos que poner duplex, seguido de half (para half duplex) o full (para full duplex). Ejemplo: ethtool -s eth0 duplex full.
  • autoneg: Otro de los grandes "favoritos" cuando queremos modificar un parámetro. Este parámetro establece si la autonegociación del enlace está activa o no... ¿Qué significa ésto? Que si tenemos la tarjeta de red sin conectar a ningún sitio y realizamos la conexión, los parámetros speed y port serán "negociados" automáticamente entre ambas partes, ignorando cualquier "manualidad" que hayamos realizado antes con ethtool; es por ello que generalmente se desactiva la autonegociación cuando hacemos uso de ethtool. El parámetro autoneg se puede establecer a on o a off; es decir que únicamente se activar o desactivar dicha opción. Ejemplo: ethtool -s eth0 autoneg off.

Existen más parámetros a modificar, pero los mencionados serían los más "conocidos" o importantes. Obviamente son perfectamente combinables entre sí y podemos crear modificaciones tales como las siguientes:

  1. #Cambio de velocidad a 100 megabytes por segundo y autonegociación a off
  2. ethtool -s speed 100 autoneg off
  3. #Cambio de puerto y de tipo de enlace a uno adaptado para HUBS
  4. ethtool -s duplex half port aui
  5. #Establecer a mano todos los parámetros
  6. ethtool -s speed 1000 duplex full port tp autoneg off

Por último hay un comando de ethtool que, si bien no es "indispensable", si que lo podríamos considerar como curioso. Imaginemos que tenemos varias interfaces de red; cada una con una ip estática configurada y perfectamente preparada para dar servicio pero que no sabemos qué puerto físico corresponde a cada interfaz debido a que se nos ha olvidado o debido a que la ubicación de los puertos físicos no da una información demasiada intuitiva. Una opción sería coger un cable de red e ir testeando puerto por puerto, pero nos podemos ahorrar dicha tarea haciendo que el puerto de red parpadee gracias a ethtool. Simplemente sería necesario usar ethtool seguido de parámetro -p y el nombre de la interfaz de red... La tarjeta de red parpadearía constantemente hasta que finalizásemos el comando pulsando ctrl + c.

ethtool -p eth0

Como podéis ethtool es una herramienta con un alto grado de flexibilidad que puede ayudarnos a ajustar nuestra tarjeta de red para que se adapte lo mejor posible a nuestras respectivas necesidades, convirtiéndose en una herramienta muy a tener en cuenta.

Espero que os haya sido útil.

Saludos.