Norma de convención de nomenclatura para interfaces Ethernet y Wi-Fi en máquinas Linux

13

¿Cuál es el estándar de la convención de nomenclatura para interfaces Ethernet y Wi-Fi en una máquina Linux?

Estamos desarrollando una herramienta que debe mostrar solo las interfaces Ethernet y Wi-Fi de la máquina Linux y su estado actual.

Por ejemplo, a continuación se muestra la lista de interfaces de red (tanto físicas como virtuales) en mi máquina Linux (Ubuntu):

docker0, enp0s25, lo,wlp3s0

Cuando ejecuto la herramienta, a continuación se muestra el resultado que obtengo:

enp0s25, wlp3s0

Hemos escrito el código con la lógica de que todas las interfaces Ethernet siempre comienzan con la letra ey las interfaces Wi-Fi siempre comienzan con la letra w.

¿Es correcta la lógica? Si no, ¿cómo podemos abordar esto?

Mohan Raj
fuente
relacionado: unix.stackexchange.com/a/179931/117549
Jeff Schaller
Me gustaría ver cómo iwconfigfiltra las interfaces WiFi de otras.
Patrick Mevzek el
1
¿Hay alguna razón por la que no mirarías algo como lshw? Específicamente inspeccionar el contenido de lshw -class networktal vez? ¿Busca todo lo que es capabilities: ethernet physical? ¿Posiblemente busque algunas de las otras capacidades también?
Zoredache el
Para hacer frente al desafío del marco planteado por @dirkt, una pregunta mejor sería simplemente: "¿cómo obtengo el tipo de interfaz de red en Linux (o macOS u otro ...)?"
Roger Lipscombe

Respuestas:

41

Las interfaces de red pueden tener cualquier nombre, así que no importa lo que haga, se encontrará con situaciones en las que (1) hay una interfaz de red "física" con un nombre que no coincide con su patrón, o (2) hay un interfaz de red "física" que coincidirá con su patrón.

Además de eso, si fuera usuario de su herramienta, en el momento en que su herramienta no me permitiera hacer algo que quisiera, porque tengo una interfaz de red que es "virtual", aunque para fines prácticos debería considerarse " físico "en mi configuración, comenzaría a maldecir en voz alta y enérgica en su aplicación, y nunca lo volveré a usar.

Las interfaces de red físicas y virtuales comparten una API común son una cosa que hace que Linux sea realmente flexible. Por favor, no trate de cuidar a su usuario y quítele eso. Tus usuarios te lo agradecerán.

dirkt
fuente
11
En realidad no has respondido la pregunta; has pasado 3 párrafos desafiando el contexto de fondo de la pregunta. Si bien soy consciente de que las respuestas de desafío de marco son una cosa, este no se siente como uno de esos casos ... especialmente porque user4556274 dio una respuesta sucinta a la pregunta tal como se la hizo.
Mike Ounsworth el
18
@MikeOunsworth: El problema es que la respuesta de user4556274 no funciona en el caso general, solo funciona si los nombres de interfaz son nombres de interfaz predecibles. Que un simple ip link set ... name ...puede cambiar. Y sí, podría haber enumerado los nombres de interfaz predecibles yo mismo. La respuesta a la pregunta original es "por favor, no lo hagas así". Porque no importa cómo lo hagas, no funcionará.
dirkt
@ fpmurphy1 No, creo que se refiere a nombres de interfaz predecibles. No importa si es systemd, tradicional (ethN), las convenciones específicas de su empresa o cualquier otro estándar que haga predecibles los nombres
slebetman
12
@MikeOunsworth: La respuesta está en la primera subcláusula de la primera oración del primer párrafo: "Las interfaces de red se pueden nombrar de cualquier forma [...]" Por lo tanto, lo que pregunta el OP es imposible y no se puede hacer. . No puede detectar el tipo de una interfaz de red basada en un estándar de convención de nomenclatura, porque no existe un estándar de convención de nomenclatura y cualquiera puede nombrar sus interfaces como quiera. Por ejemplo, en mi antiguo router Linux, me dirijo adhesivos de color en la parte posterior, y las interfaces Ethernet físicas fueron nombrados red, bluey green.
Jörg W Mittag
1
@ JörgWMittag, por supuesto, puede detectarlos en función de un estándar, si sabe que se utiliza el estándar (y está esperando uno que exporte esa información en el nombre en primer lugar). Sabemos que systemd tiene un estándar para nombrar la interfaz de red , por lo que no sirve de nada decir que no existe.
ilkkachu
28

Para los nombres de interfaz predecibles de systemd , los prefijos se pueden ver en udev-builtin-net_id.c:

* Two character prefixes based on the type of interface:
*   en — Ethernet
*   ib — InfiniBand
*   sl — serial line IP (slip)
*   wl — wlan
*   ww — wwan

por lo tanto, tanto para el ethXestilo tradicional de denominación como para la denominación systemd más reciente, una letra inicial e debería ser una interfaz ethernet para cualquier nombre de interfaz generado automáticamente. Todas las interfaces wifi deben comenzar con una w en ambos esquemas, aunque no todas las interfaces que comienzan con w serán wifi.

Si esta herramienta tiene que trabajar en un ambiente arbitraria (en lugar de sólo en ambientes internos que control), nota que los usuarios pueden cambiar el nombre de las interfaces de sistemas Linux con nombres arbitrarios, tales como [ wan0, lan0, lan1, dmz0] que romperá ninguna hipótesis sobre letras iniciales .

usuario4556274
fuente
77
Y algunos de nosotros somos firmes rechazos del sistema.
chrylis -on strike-
1
Tenga en cuenta que esta solución no funcionará en los sistemas que utilizan biosdevnamepara nombrar interfaces, donde se puede nombrar una interfaz Ethernet como p3p7. Este método es un predecesor de los nuevos nombres predecibles de systemd y aunque ahora está en desuso en distribuciones comunes, todavía habrá muchos sistemas que lo detectaron cuando era el predeterminado hace unos años.
TooTea
systemd llama útilmente a una de mis interfaces de ethernet 'rename3'. Cuál es puede variar, suspiro :(
user1908704
1
@ user1908704: Por lo general, esto significa que se le dijo a udev que diera el mismo nombre a múltiples interfaces. (¿Quizás tenga un viejo archivo de "nombres persistentes" generado automáticamente en /etc/udev/rules.d?) Dicho esto, el proceso de cambio de nombre se arregló en v187 para ser completamente atómico (ya sea exitoso o revertir) y el rename%uformato no ha sido correcto No existía en el código fuente desde 2012. Me gustaría suspirar porque su software está seis años desactualizado.
user1686
1
@grawity Esto es Ubuntu 18.04. Resulta que las placas base particulares tienen dos NIC con la misma entrada ACPI, lo que hace que ambas sean eno1. Como eso no puede suceder, uno de ellos se llama 'rename3'. No he desarrollado completamente la lógica de quién gana la carrera, pero cualquier cambio puede perturbar el concurso y hacer que se cambie el nombre del otro3.
user1908704
9

La convención de nomenclatura es que las interfaces LAN se nombran eth0, eth1, ... y que las interfaces WLAN se nombran wlan0, wlan1, ...

Lo que ves son los llamados "nombres predecibles" que introdujo systemd. En la práctica, son todo menos predecibles, e incluso pueden cambiar cuando se cambia el hardware, que es exactamente el problema que se supone que deben evitar.

Para adivinar, la carta de inicio puede ser lo suficientemente buena. Algunas interfaces, en particular WLAN, tienen pistas sobre /sys/class/net/*/uevent:

DEVTYPE=wlan

Desafortunadamente, no existe tal DEVTYPEpara las interfaces LAN.

RalfFriedl
fuente
2
El nombre del dispositivo cambia cuando el hardware no es el problema que los nombres de interfaz predecibles intentan evitar. Los nombres de interfaz predecibles evitan cambios de nombre cuando el hardware no cambia . Este es un problema cuando los dispositivos de hardware se detectan en un orden aleatorio.
Johan Myréen
@ JohanMyréen Eso está mal: "... que (nombre de la interfaz) permanecen fijos incluso si se agrega o elimina hardware" freedesktop.org/wiki/Software/systemd/…
RalfFriedl
La motivación para introducir los nombres de interfaz predecibles fue que el sondeo no es determinista y "la asignación de los nombres" eth0 "," eth1 ", etc., ya no se corrige y bien podría suceder que" eth0 "en un arranque termine siendo "eth1" en el próximo ". Es una ventaja si los nombres predecibles pueden sobrevivir a los cambios de hardware, pero esta no fue la razón principal para ellos.
Johan Myréen
1
Gane algunos pierda algunos: en algunos escenarios, es muy deseable si el hardware modificado hace clic de manera confiable en la misma "ranura de nombres" :)
rackandboneman
@ JohanMyréen El antiguo esquema de asignación de nombres de interfaz basados ​​en MAC u otras propiedades funcionó de manera más confiable al agregar interfaces, sin la molestia de los nuevos nombres.
RalfFriedl
5

Una advertencia con mi respuesta (también se aplica a la mayoría de los demás): no sé el propósito de su solicitud. Si se trata de una aplicación descartable para solucionar un problema en particular, o para comprender mejor las redes, para nunca volver a usarse, entonces confiar en la primera letra de la interfaz puede ser una excelente opción rápida y sucia. Si planea escribir el próximo competidor a Wireshark o tcpdump, debe asegurarse de hacerlo bien para todo tipo de casos extremos.

Y si la aplicación que está escribiendo cae en algún punto entre esos extremos, solo usted (y sus clientes) pueden saber con qué cuidado necesita implementar su lógica.

Otros ya han señalado que los nombres nunca son confiables, por varias razones. El último problema es muy común en el software: suposiciones de codificación dura en lugar de confiar en hechos conocidos / documentados.

El segundo problema que no se ha mencionado también se basa en una suposición acerca de sus requisitos: que la lista de interfaces que desea enumerar siempre es exactamente "interfaces de ethernet de hardware" e "interfaces wifi".

El tercer problema es otra suposición: que todas las interfaces se incluirán en las categorías que se te ocurran en este momento. ¿Qué tal Infiniband, como lo mencionó @ user4556274? ¿Qué hay de las interfaces de túnel para una VPN? ¿Qué hay de las interfaces puenteadas? ¿Qué hay de las interfaces puenteadas que combinan interfaces físicas y lógicas?

Pero puede haber opciones para lograr lo que está buscando. Primero, defina exactamente qué caracteriza una interfaz que desea enumerar, frente a una que no tiene.

En la mayoría de los casos, una característica en la que puede confiar es la tabla de enrutamiento (sin embargo, esto solo funcionará mientras la interfaz esté activa, por lo que puede no ser lo que realmente está buscando).

Es probable que cualquier interfaz que tenga una ruta predeterminada (es decir, una ruta a 0.0.0.0) sea la que está buscando.

Tenga en cuenta que incluso esto todavía se basa en una suposición, solo una más confiable: es concebible que un sistema esté configurado para enrutar todo el tráfico saliente a través de una máquina virtual o un contenedor acoplable (por ejemplo, si hay un contenedor que ejecuta un firewall) ) Y lo contrario también es cierto: un administrador de sistemas podría bloquear el tráfico externo al eliminar la ruta predeterminada.

Otra opción es ir por el hardware real y ver qué controlador usa. Luego puede excluir ciertos controladores conocidos

Kevin Keane
fuente
4

¿Está excluyendo explícitamente las interfaces unidas o unidas? Nuestro valor predeterminado aquí es usar bond0o team0para la interfaz principal de nuestros servidores.

Creo que necesitas repensar tu lógica. Tal vez intente iterar a través de todas las interfaces de red definidas en un sistema dado, divídalas entre ethernet, wifi, infiband, serial, etc., y luego haga su magia.

doneal24
fuente
3

No codifique ni coincida con los nombres de hardware del patrón. Esto se aplica a todos los dispositivos. Confíe en las herramientas proporcionadas por udev para determinar la lista de dispositivos y tomar las medidas adecuadas. Consulte 16.7 Nombres de dispositivos persistentes y luego lea todo el documento , específicamente 16.2 y 16.3. Tenga en cuenta que udev es independiente de la distribución, y también independiente del sistema init, ya que udev es ahora el método preferido para la administración de dispositivos en Linux.

Tenga en cuenta que @ user4556274, aludió a esto en su respuesta al referirse a udev-builtin-net-id.c, lo que en resumen significa que la coincidencia de patrones que está tratando de lograr es una parte incorporada udev.

Citando PredictableNetworkInterfaceNames :

Con systemd 197, hemos agregado soporte nativo para varias políticas de nomenclatura diferentes en systemd / udevd propiamente dicho e hicimos un esquema similar al de biosdevname (pero generalmente más potente y más cercano a los esquemas de identificación de dispositivos internos del núcleo) como predeterminado. Los siguientes esquemas de nomenclatura diferentes para las interfaces de red ahora son compatibles con udev de forma nativa:

  1. Los nombres que incorporan números de índice proporcionados por Firmware / BIOS para dispositivos integrados (ejemplo: eno1)
  2. Los nombres que incorporan firmware / BIOS proporcionan números de índice de ranura de conexión en caliente PCI Express (ejemplo: ens1)
  3. Nombres que incorporan la ubicación física / geográfica del conector del hardware (ejemplo: enp2s0)
  4. Nombres que incorporan la dirección MAC de las interfaces (ejemplo: enx78e7d1ea46da) Clásico, impredecible, nombre de ethX nativo del núcleo (ejemplo: eth0)

Por defecto, systemd v197 ahora nombrará interfaces siguiendo la política 1) si esa información del firmware es aplicable y está disponible, volviendo a 2) si esa información del firmware es aplicable y disponible, volviendo a 3) si corresponde, volviendo atrás a 5) en todos los demás casos. La política 4) no se usa de manera predeterminada, pero está disponible si el usuario lo elige.

Esta política combinada solo se aplica como último recurso. Eso significa que, si el sistema tiene biosdevname instalado, tendrá prioridad. Si el usuario ha agregado reglas udev que cambian el nombre de los dispositivos del núcleo, estas también tendrán prioridad. Además, cualquier esquema de nomenclatura específico de distribución generalmente tiene prioridad.

eyoung100
fuente
2

Como otros han dicho, no puedes depender completamente del nombre.

En mi caso, parece que para wireless /sys/class/net/<ifacename>/tendrá un directorio llamado "wireless" si es una interfaz inalámbrica:

# kbrandt @ kbrandtlx in /sys/class/net [9:47:43] C:130
$ ls
br-b293588ecdae  enp11s0  lo    veth6061cd8  virbr0-nic
docker0          enp12s0  ppp0  virbr0       wlp13s0

# kbrandt @ kbrandtlx in /sys/class/net [9:47:44] 
$ echo  /sys/class/net/*/wireless
/sys/class/net/wlp13s0/wireless
Kyle Brandt
fuente