Información blog

Linux, tutoriales, noticias, sistemas, redes y seguridad informática, entre otras cosas.

martes, 1 de agosto de 2017

Predictable Network Interface Names: Qué es y cómo deshabilitarlo

La tecnología va evolucionando constantemente y siempre en cada versión de cada sistema operativo, se van apreciando cambios; cambios que pueden ser desde parches de seguridad a otros más "tangibles" tales como nuevas versiones de software, cambios en el init (el famoso systemd) o pequeños, pero en parte importantes, cambios en la nomenclatura, tales como los realizados en las interfaces de red. Cualquiera que haya estado usando GNU/Linux durante años sabe que "normalmente", a la hora de llamar a una interfaz de red, se le llamaba eth0, eth1, etc... o en caso de ser una tarjeta de red inalámbrica, se le llamaba wlan0, wlan1, etc... La cuestión está que esa nomenclatura ya no se mantiene y las interfaces de red reciben un nombre distinto, dicha nomenclatura no era del todo fiable ni robusta...

PNIN_portada

La explicación técnica sería que si bien los nombre usados antiguamente era fáciles de recordar, la "relación" entre el nombre de la interfaz de red y la MAC no siempre era del todo fiable, pues dicha MAC podía cambiar (en un entorno virtualizado es algo relativamente común), y a veces debido a problemas con drivers podía haber problemas. Para solucionar dicho problema, desde systemd han creado la funcionalidad: Predictable Network Interface Names.

Dicho tipo de nomenclatura se basa en nombrar las interfaces de red basado en su firmware, el tipo de interfaz y su MAC, haciendo que el proceso sea completamente automático y que se evite cualquier tipo de conflicto con los nombres y/o MACs, con el fin de evitar duplicidades y/o problemas de configuración con las interfaces de red... Este nuevo tipo de interfaces tienen 3 tipos de prefijos, seguidos de unas letras y números:

  • en: Este prefijo significaría que la interfaz de red es del tipo Ethernet (LAN)
  • wl: En este caso se haría referencia a un interfaz del tipo inalámbrica (WLAN).
  • ww: Aquí se haría referencia a una interfaz de red de área amplia inalámbrica (WWAN)

Hasta aquí la parte que más fácil se puede recordar, pues a partir de aquí la nomenclatura se torna bastante peculiar, y si bien es una nomenclatura "predictiva" que el sistema puede detectar y reconocer correctamente, a nivel humano no es, ni de lejos, tan predecible. Esta funcionalidad intentará ejecutar una serie de políticas para nombrar la interfaz de red, primero intentará una política y en caso de no poder aplicarla lo intentará con la siguiente y así sucesivamente... Las políticas a aplicar (en orden) serían:

  • Política 1: Se intentará incorporar al nombre de la interfaz, la letra o más el número de indexación que le ha dado la BIOS/firmware para los elementos integrados en la placa. Por ejemplo: eno33. Si la tarjeta de red no fuese integrada, no fuese reconocida como tal o simplemente no se pudiese aplicar dicha política, se pasaría a la política 2.
  • Política 2: Se intentará incorporar al nombre de la interfaz, la letra s más el número de indexación que le ha dado la BIOS/firmware para los elementos hotplug. Por ejemplo: ens33. Si la tarjeta de red no fuese un elemento hotplug, no fuese reconocida como tal o simplemente no se pudiese aplicar dicha política, se pasaría a la política 3.
  • Política 3: Se intentará incorporar al nombre de la interfaz de red la letra p junto con la localización física ésta. Por ejemplo: enp2s0. En caso de que tampoco se pudiera, se pasaría a la política 4.
  • Política 4: Se añadirá la letra x más MAC al nombre de la interfaz; por ejemplo: enx78e7d1ea46da
  • Política 5: Si no se hubiese podido adoptar ninguna de las anteriores políticas, se usaría la nomenclatura tradicional; por ejemplo: eth0.

Como podéis ver, las nomenclaturas usadas tienen una estructura muy bien definida, pero desgraciadamente no es del todo "amigable" pues podemos encontrarnos con casos tales como la política 3 o la política 4 en los que el nombre de nuestra interfaz es largo y difícil de recordar... Esto no significa que esa desventaja haga que el uso de las políticas antiguas sea mejor, ya que generalmente las ventajas superan a las desventajas... 

El problema del uso de esta nomenclatura viene cuando tenemos multitud de scripts "antiguos", que están preparados para trabajar con los nombres de interfaz clásicos... Pues si bien es cierto que podemos ir sustituyendo los nombres mediante el comando sed... No siempre es la mejor opción, ya que basta que la Predictable Network Interface Names (PNIN para acortar), use un nombre distinto para la interfaz para que el script no funcione... Es por ello que a veces nos puede ser más beneficioso usar las nomenclaturas antiguas en nuestro sistema, si bien ¿Cómo podemos hacerlo?

Afortunadamente el cambio es muy sencillo; cambio que además puede revertirse fácilmente por si en el futuro nos hiciesen falta las nuevas nomenclaturas. Este cambio se ha aplicado en Debian 9, pero debería ser válido en cualquier sistema similar. Dicho cambio se realiza a nivel de GRUB y para ello editaremos el fichero /etc/default/grub y editaremos la línea GRUB_CMDLINE_LINUX.

Su aspecto original sería el siguiente:
GRUB_CMDLINE_LINUX=""

Dicha línea debería ser editada para que tenga el siguiente aspecto:
GRUB_CMDLINE_LINUX="net.ifnames=0 biosdevname=0"

Con esto haríamos que tan pronto como se cargue el GRUB, la asignación del nombre se realice a nivel de kernel y con mediante PNIN, si bien para aplicar los cambios tendríamos que ejecutar dos comandos:
sudo grub-mkconfig
sudo update-grub

Ahora bien, antes de reiniciar el sistema sería necesario entrar sí o sí dentro del fichero /etc/network/interfaces para cambiar las nomenclaturas a las interfaces, pues en caso contrario la interfaz de red en cuestión, cuando obtuviese el "nuevo" nombre, no podría asociarse a una IP. Esto lo podemos hacer o bien a mano o bien mediante el comando sed, aunque para esto último tendríamos que tener muy claros los nombres. Supongamos que tenemos una sola interfaz de red en el sistema, llamada ens33... Al ser la única interfaz y ser ethernet sabemos que se convertirá en eth0 con lo que podemos ejecutar el siguiente comando:
sed -i 's/ens33/eth0/g' /etc/network/interfaces

Por último, pero no por ello menos importante, sería necesario reiniciar, con el fin de poder aplicar la nueva configuración introducida en el GRUB y poder hacer referencia a nuestra interfaz tal y cómo siempre hemos hecho.

Espero que os haya resultado útil.

Saludos.