¿Cómo puedo saber si una interfaz de red es física (dispositivo) o virtual (alias)?

17

Tengo un pequeño enrutador doméstico que ejecuta OpenWrt (tipo de Linux incorporado para enrutadores). Tiene cinco puertos Ethernet, uno etiquetado WAN y cuatro etiquetados LAN 1 a 4. Tiene las siguientes interfaces de red definidas según ifconfig:

root@TIBERIUS: ~ > ifconfig | grep Link
br-lan    Link encap:Ethernet  HWaddr 00:23:CD:20:C3:B0
eth0      Link encap:Ethernet  HWaddr 00:23:CD:20:C3:B0
lan1      Link encap:Ethernet  HWaddr 00:23:CD:20:C3:B0
lan2      Link encap:Ethernet  HWaddr 00:23:CD:20:C3:B0
lan3      Link encap:Ethernet  HWaddr 00:23:CD:20:C3:B0
lan4      Link encap:Ethernet  HWaddr 00:23:CD:20:C3:B0
lo        Link encap:Local Loopback
pppoe-wan Link encap:Point-to-Point Protocol
wan       Link encap:Ethernet  HWaddr 00:23:CD:20:C3:B0
wlan0     Link encap:Ethernet  HWaddr 00:23:CD:20:C3:B0

Como puede ver, hay muchos dispositivos, pero solo una dirección MAC.

Entiendo que algunos de esos dispositivos son virtuales. Dejemos de lado loy pppoe-wan, ese es el dispositivo de bucle invertido y mi conexión PPPoE. Pero para el resto de ellos, ¿cómo se supone que debo saber si son físicos o virtuales? Entiendo que hay una convención de nomenclatura para etiquetar interfaces virtuales como eth0.1, pero eso obviamente no se cumple aquí. Veamos la salida de ifconfigdos de estas interfaces:

root@TIBERIUS: ~ > ifconfig wan
wan       Link encap:Ethernet  HWaddr 00:23:CD:20:C3:B0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:15007 errors:0 dropped:0 overruns:0 frame:0
          TX packets:12055 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:13341276 (12.7 MiB)  TX bytes:1831757 (1.7 MiB)

root@TIBERIUS: ~ > ifconfig eth0
eth0      Link encap:Ethernet  HWaddr 00:23:CD:20:C3:B0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:25799 errors:0 dropped:0 overruns:23 frame:0
          TX packets:25294 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:15481996 (14.7 MiB)  TX bytes:15160380 (14.4 MiB)
          Interrupt:4

Además del oscuro detalle de txqueuelentener un valor distinto de cero eth0, la única diferencia sorprendente es que eth0tiene una Interruptentrada, que hasta donde yo sé es una característica de hardware. Entonces, ¿es así como sabes que una interfaz de red es física o no, buscando una Interruptentrada ifconfig? ¿O hay un mejor camino? ¿Una forma simple y directa de averiguar si un dispositivo de red es físico o virtual?

Tenga en cuenta que hay una pregunta relacionada, pero si bien tiene una respuesta aceptada, no es concluyente.

Actualizar

En respuesta a la respuesta de derobert, aquí hay información derivada de ls -l /sys/class/net:

br-lan      -> ../../devices/virtual/net/br-lan
eth0        -> ../../devices/platform/ag71xx.0/net/eth0
lan1        -> ../../devices/platform/dsa.0/net/lan1
lan2        -> ../../devices/platform/dsa.0/net/lan2
lan3        -> ../../devices/platform/dsa.0/net/lan3
lan4        -> ../../devices/platform/dsa.0/net/lan4
lo          -> ../../devices/virtual/net/lo
pppoe-wan   -> ../../devices/virtual/net/pppoe-wan
wan         -> ../../devices/platform/dsa.0/net/wan

[Anexo a esta lista: wlan0habría aparecido también wlan0 -> ../../devices/platform/ath9k/net/wlan0, pero cuando copié la lista anterior tenía WLAN deshabilitada, por lo que no apareció.]

Yo diría que eth0es el único dispositivo. No está claro qué dsa.0es.

Y en respuesta a la respuesta de Bryan Agee:

root@TIBERIUS: ~ > cat /etc/config/network

config interface 'loopback'
        option ifname 'lo'
        option proto 'static'
        option ipaddr '127.0.0.1'
        option netmask '255.0.0.0'

config interface 'eth'
        option ifname 'eth0'
        option proto 'none'

config interface 'lan'
        option ifname 'lan1 lan2 lan3 lan4'
        option type 'bridge'
        option proto 'static'
        option ipaddr '192.168.33.1'
        option netmask '255.255.255.0'

config interface 'wan'
        option ifname 'wan'
        option proto 'pppoe'
        option username '…'
        option password '…'
Lumi
fuente
Ya respondió su propia pregunta (busque elementos específicos de hardware como IRQ, txqueue, ...). La pregunta que me surge es: ¿por qué necesita diferenciar eso en su caso de uso?
Nils
@Nils, no tengo una idea clara de la configuración de red en mi dispositivo enrutador después de mostrar OpenWrt en él. Lo encuentro completamente confuso. Los documentos del proyecto y el foro han proporcionado algo de ayuda, pero no suficiente, y han dejado preguntas básicas sin responder. Una de esas preguntas es la que se plantea aquí. Ahora me parece que mi enrutador solo tiene una NIC cuando estaba seguro de que tenía dos. Clarificar detalles reduce la confusión. Es por eso.
Lumi
¿Puedes poner una foto pequeña o un enlace a una foto / documentación para ese enrutador aquí? Puede haber cosas como la vinculación / puente / NATting que ocultan los MAC reales ...
Nils
Debería poder ver mejores detalles, y los que necesita, usandolshw -class network
Nathan V
@Nils, aquí tienes: wiki.openwrt.org/toh/tp-link/tl-wr941nd - @Nathan, con solo 4 MB de flash, el cuadro es bastante limitado y lshwno está en la lista de paquetes. Un tipo bien informado y decidido podría tener éxito en la instalación de herramientas de desarrollo tmpfs, pero ¿valdría la pena? Voy a profundizar mi comprensión de las redes Linux mediante una PC estándar. Esto va a ser más fácil. Si bien no entiendo correctamente esta configuración de enrutador, funciona bien. Gracias por tu ayuda.
Lumi

Respuestas:

19

Puedes consultar /sys:

anthony@Zia:/sys/class/net$ ls -l /sys/class/net/
total 0
lrwxrwxrwx 1 root root 0 Dec 11 15:38 br0 -> ../../devices/virtual/net/br0
lrwxrwxrwx 1 root root 0 Dec 11 15:38 lan -> ../../devices/pci0000:00/0000:00:1e.0/0000:07:01.0/net/lan
lrwxrwxrwx 1 root root 0 Dec 11 15:38 lo -> ../../devices/virtual/net/lo
lrwxrwxrwx 1 root root 0 Dec 11 15:38 tun0 -> ../../devices/virtual/net/tun0

Entonces, los dispositivos reales se muestran en / sys / class / net. Tenga en cuenta que los alias (como lan: 0) no lo hacen (por lo que puede decir cuáles son alias). Y puede ver claramente cuáles son hardware real (lan) y cuáles no (br0, lo, tun0).

para aclarar

Puedes decir cuáles son reales en lo anterior porque los virtuales están todos en virtual. Y lan está en el bus PCI.

En su caso, tiene seis: eth0, wan y lan1–4. Esto es bastante extraño, ya que usted dice que solo tiene cinco puertos en total. Supongo que eth0 está realmente conectado a un chip switch-ish, y los otros 5 puertos son puertos en ese switch. wlan0 probablemente también sea real (sería el adaptador inalámbrico), aunque no se muestra en / sys….

Por lo tanto, diría que, a todos los efectos prácticos, sus puertos reales son wan, lan1–4 y wlan0. br-lan es un puente configurado para hacer que los 4 puertos lan funcionen como un conmutador (por lo que puede dividir ese conmutador).

derobert
fuente
Gracias. Agregué un resultado similar a mi pregunta. No es tan claro como el resultado que está mostrando aquí, con el bus PCI o lo que no aparece allí; Aunque realmente no entiendo el resultado, estoy de acuerdo en que se parece a los identificadores de hardware. En el caso de mi salida publicada anteriormente, es la presencia de ag71xxeso lo que me hace pensar que es hardware, ya que parece un controlador.
Lumi
@Lumi editó para intentar responder.
derobert
Esto es probablemente más práctico que mi respuesta.
Bryan Agee
Gracias. La nota wlan0habría estado presente en la lista de dispositivos debajo de la /sys/class/netcual se habilitó cuando copié la lista. :) Ahora lo he agregado arriba. No estoy de acuerdo con usted en la cantidad de dispositivos, creo que solo hay dos, LAN y WLAN. Pero ese es un punto menor ... buena respuesta, aceptado, ¡gracias!
Lumi
@Lumi usa brctrl delif br-lan lan1(o similar) para soltar un puerto del puente. Sospecho que funcionará como un puerto separado (no parte del conmutador LAN) entonces.
derobert
5

Suponiendo que la dirección MAC de su interfaz no fue falsificada , puede intentar usar ethtool :

ethtool -P {Network interface name}

" Dirección permanente: 00: 00: 00: 00: 00: 00 " indicará que es una interfaz de red virtual.

El siguiente bucle bash mostrará la dirección MAC para todas las interfaces de red:

for i in $(ip -o link show | awk -F': ' '{print $2}'); \
do mac=$(ethtool -P $i) \
&& printf '%-10s %-10s\n' "$i" "$mac"; \
done

lo         Permanent address: 00:00:00:00:00:00
enp5s0f0   Permanent address: 44:1e:a1:73:39:c8
enp4s0f0   Permanent address: 00:9c:02:b0:ef:20
enp5s0f1   Permanent address: 44:1e:a1:73:39:c9
enp4s0f1   Permanent address: 00:9c:02:b0:ef:24
virbr1     Permanent address: 00:00:00:00:00:00
virbr1-nic Permanent address: 00:00:00:00:00:00
virbr0     Permanent address: 00:00:00:00:00:00
virbr0-nic Permanent address: 00:00:00:00:00:00
vnet0      Permanent address: 00:00:00:00:00:00
vnet1      Permanent address: 00:00:00:00:00:00
Noam Manos
fuente
2

Empezaría por mirar adentro /etc/network/config; La mayoría de las distribuciones tienen un archivo similar para definir y configurar dispositivos de red. En debian / Ubuntu, es / etc / network / interfaces. Si publicara el contenido de eso, podríamos identificar entradas de alias, enlace y puente; el resto serían tus dispositivos físicos.

Al observar la ifconfigsalida, puede distinguir (como mencionó) los dispositivos que tienen interrupciones (IRQ); muchos también tienen memoria asignada, que las interfaces virtuales no tienen.

Nunca puede juzgar solo por las direcciones mac, ya que los enlaces ( agregación de enlaces ) anularán la mac de los dispositivos individuales, y los puentes usarán lo mismo. Entonces, si tiene dos dispositivos enlazados y en puente, una configuración común para hosts virtuales y enrutadores HA, habrá cuatro dispositivos con la misma Mac:

eth0  - physical device 1
eth1  - physical device 2
bond0 - the virtual device that uses either or both of the above
br0   - the bridge that uses bond0 and allows sharing/forwarding across bond0

Claramente, los alias utilizados en openwrt no son los anteriores, pero el concepto es válido; Los usé porque son una práctica estándar.

Bryan Agee
fuente
Esto no tiene en cuenta las interfaces creadas de otras maneras, trabajadas en torno a la forma 'estándar' /etc. Por ejemplo, las interfaces creadas por NetworkManager no se mencionan allí.
gertvdijk
@gertvdijk Eso es cierto, aunque openwrt no incluye NetworkManager en esos 4 MB, por lo que todas las interfaces deben estar en la configuración.
Bryan Agee
-2

Creo que solo verificar si el valor de /sys/class/net/<interface>/typees 1 (ARPHRD_ETHER) debería ser suficiente para entender si el dispositivo es físico.

http://lxr.linux.no/linux+v3.0/include/linux/if_arp.h#L30

p.ej. basename $ (dirname grep -l ^1$ /sys/class/net/*/type)

Ubaldo Porcheddu
fuente
Estoy viendo 1 para muchas interfaces (eth, wireless, bridge y vlan colgando de un puente, así que no)
nhed