Come posso sapere se un'interfaccia di rete è fisica (dispositivo) o virtuale (alias)?


17

Ho un piccolo router domestico che esegue OpenWrt (tipo di Linux incorporato per router). Ha cinque porte Ethernet, una etichettata WAN e quattro etichettate LAN da 1 a 4. Ha le seguenti interfacce di rete definite come 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

Come puoi vedere, un certo numero di dispositivi, ma solo un indirizzo MAC.

Capisco che alcuni di quei dispositivi sono virtuali. Mettiamo da parte loe pppoe-wan, questo è il dispositivo di loopback e la mia connessione PPPoE. Ma per il resto, come potrei essere in grado di dire se sono fisici o virtuali? Capisco che esiste una convenzione di denominazione per l'etichettatura di interfacce virtuali come eth0.1, ma ovviamente non è rispettata qui. Vediamo l'output di ifconfigper due di queste interfacce:

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

A parte l'oscuro dettaglio di txqueuelenavere un valore diverso da zero eth0, l'unica notevole differenza è che eth0ha una Interruptvoce, che per quanto ne so è una funzionalità hardware. Quindi è così che dici che un'interfaccia di rete è fisica o no, cercando una Interruptvoce ifconfig? O c'è un modo migliore? Un modo semplice e diretto per scoprire se un dispositivo di rete è fisico o virtuale?

Nota che c'è una domanda correlata ma sebbene abbia una risposta accettata, non è conclusiva.

Aggiornare

In risposta alla risposta di Derobert, ecco le informazioni derivate da 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

[Addendum a questo elenco: wlan0sarebbe comparso così come wlan0 -> ../../devices/platform/ath9k/net/wlan0, ma quando ho copiato l'elenco sopra avevo WLAN disabilitato, motivo per cui non è stato visualizzato.]

Direi che eth0è l'unico dispositivo. Non è chiaro cosa dsa.0sia.

E in risposta alla risposta di 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 '…'

Hai già risposto alla tua domanda (cerca elementi specifici dell'hardware come IRQ, txqueue, ...). La domanda che mi si pone è: perché devi differenziarlo nel tuo caso d'uso?
Nils,

@Nil, non ho una chiara comprensione della configurazione di rete sul mio dispositivo router dopo aver eseguito il flashing di OpenWrt su di esso. Lo trovo completamente confuso. I documenti del progetto e il forum hanno fornito un aiuto, ma non abbastanza, e hanno lasciato senza risposta le domande di base. Una di queste domande è quella sollevata qui. Ora mi sembra che il mio router abbia una sola scheda di rete quando ero sicuro che ne avesse due. Chiarire i dettagli riduce la confusione. Ecco perchè.
Lumi,

Puoi mettere una piccola foto o un link a una foto / documentazione per quel router qui? Potrebbero esserci cose come bonding / bridging / NATting che nascondono i veri MAC ...
Nils,

Dovresti essere in grado di vedere dettagli migliori e quelli di cui hai bisogno, usandolshw -class network
Nathan V

@Nils, eccoti qui: wiki.openwrt.org/toh/tp-link/tl-wr941nd - @Nathan, con solo 4 MB di flash, la scatola è piuttosto limitata e lshwnon è nell'elenco dei pacchetti. Un ragazzo esperto e determinato potrebbe riuscire a installare gli strumenti di sviluppo tmpfs, ma varrebbe la pena? Ho intenzione di approfondire la mia comprensione della rete Linux tramite un PC standard. Questo sarà più facile. Anche se non capisco correttamente questa configurazione del router, funziona benissimo. Grazie per l'aiuto.
Lumi,

Risposte:


19

Puoi controllare /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

Quindi, i dispositivi effettivi vengono visualizzati in / sys / class / net. Nota che gli alias (come lan: 0) non lo fanno (quindi puoi dire quali sono gli alias). E puoi vedere chiaramente quali sono l'hardware effettivo (lan) e quali no (br0, lo, tun0).

chiarire

Puoi dire quali sono reali in quanto sopra perché quelli virtuali sono tutti virtuali. E lan è sul bus PCI.

Nel tuo caso, ne hai sei: eth0, wan e lan1–4. Questo è piuttosto strano, dal momento che dici di avere solo cinque porte in totale. Immagino che eth0 sia effettivamente collegato a un chip switch-ish e le altre 5 porte sono porte su quello switch. probabilmente anche wlan0 è reale (sarebbe l'adattatore wireless), sebbene non sia mostrato in / sys….

Quindi, direi che per tutti gli scopi pratici, le tue porte reali sono wan, lan1–4 e wlan0. br-lan è un bridge impostato per far funzionare tutte e 4 le porte lan come switch (quindi potresti essere in grado di dividere tale switch).


Grazie. Ho aggiunto un output simile alla mia domanda. Non è chiaro come l'output che stai mostrando qui, con bus PCI o quant'altro mostrato lì; anche se non capisco davvero l'output, sono d'accordo che sembra identificatori hardware. Nel caso del mio output pubblicato sopra, è la presenza di ag71xxciò che mi fa pensare che sia hardware, dal momento che sembra un driver.
Lumi,

@Lumi modificato per provare a rispondere.
derobert il

Questo è probabilmente più pratico della mia risposta.
Bryan Agee,

Grazie. Nota wlan0sarebbe stato presente nell'elenco dei dispositivi sotto il quale /sys/class/netè stato abilitato quando ho copiato l'elenco. :) Ora l'ho aggiunto sopra. Non sono d'accordo con te sul numero di dispositivi, penso che ce ne siano solo due, LAN e WLAN. Ma questo è un punto secondario ... buona risposta, accettata, grazie!
Lumi,

@Lumi usa brctrl delif br-lan lan1(o simile) per eliminare una porta dal bridge. Ho il sospetto che funzionerà come una porta separata (non parte dello switch LAN).
derobert il

5

Supponendo che l'indirizzo MAC dell'interfaccia non sia stato falsificato , puoi provare a utilizzare ethtool :

ethtool -P {Network interface name}

" Indirizzo permanente: 00: 00: 00: 00: 00: 00 " indicherà che si tratta di un'interfaccia di rete virtuale.

Il seguente loop bash mostrerà l'indirizzo MAC per tutte le interfacce di rete:

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

2

Vorrei iniziare guardando /etc/network/config; la maggior parte delle distro ha un file simile per definire e configurare i dispositivi di rete. In debian / Ubuntu, è / etc / network / interfaces. Se dovessi pubblicare il contenuto di questo, potremmo identificare voci alias, bond e bridge; il resto sarebbero i tuoi dispositivi fisici.

Guardando l' ifconfigoutput, puoi capire (come hai detto) dai dispositivi che hanno interruzioni (IRQ); molti hanno anche memoria assegnata, a differenza delle interfacce virtuali.

Non puoi mai giudicare dai soli indirizzi mac, poiché le obbligazioni ( aggregazione dei collegamenti ) sostituiranno il mac dei singoli dispositivi e i bridge useranno lo stesso. Quindi, se hai due dispositivi collegati e collegati - una configurazione comune per host e router virtuali HA - ci saranno quattro dispositivi con lo stesso 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

Chiaramente gli alias usati in openwrt non sono quelli sopra, ma il concetto vale; Li ho usati perché sono una pratica standard.


Questo non tiene conto delle interfacce create in altri modi, aggirate nel modo "standard" /etc. Ad esempio, le interfacce create da NetworkManager non sono menzionate qui.
gertvdijk,

@gertvdijk È vero, anche se openwrt non racchiude NetworkManager in quei 4 MB, quindi tutte le interfacce dovrebbero essere nella configurazione.
Bryan Agee,

-2

Penso che solo verificare se il valore di /sys/class/net/<interface>/typeè 1 (ARPHRD_ETHER) dovrebbe essere sufficiente per capire se il dispositivo è fisico.

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

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


Sto vedendo 1 per molte interfacce (eth, wireless, bridge e vlan che pendono da un bridge - quindi no)
nhed
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.