Como posso saber se uma interface de rede é física (dispositivo) ou virtual (alias)?

14

Eu tenho um pequeno roteador doméstico executando o OpenWrt (tipo de Linux embarcado para roteadores). Possui cinco portas Ethernet, uma rotulada WAN e quatro rotuladas LAN 1 a 4. Ela possui as seguintes Interfaces de Rede definidas como 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 você pode ver, vários dispositivos, mas apenas um endereço MAC.

Eu entendo que alguns desses dispositivos são virtuais. Vamos colocar de lado lo e pppoe-wan , esse é o dispositivo de loopback e minha conexão PPPoE. Mas para o resto deles, como posso saber se são físicos ou virtuais? Eu entendo que há uma convenção de nomenclatura para rotular Interfaces virtuais como eth0.1 , mas isso obviamente não é respeitado aqui. Vamos ver a saída de ifconfig para duas dessas 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

Além do detalhe obscuro de txqueuelen ter um valor diferente de zero para eth0 , a única diferença marcante é que eth0 tem uma entrada Interrupt , que, até onde eu sei, é um recurso de hardware. Então é assim que você diz a uma Interface de Rede que é física ou não, procurando por uma entrada Interrupt em ifconfig ? Ou há uma maneira melhor? Uma maneira simples e direta de descobrir se um dispositivo de rede é físico ou virtual?

Observe que há uma pergunta relacionada , mas embora tenha uma resposta aceita, ela não é conclusiva.

Atualizar

Em resposta à resposta de derobert, aqui estão as informações derivadas 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

[Adendo a esta lista: wlan0 teria aparecido bem como wlan0 -> ../../devices/platform/ath9k/net/wlan0 , mas quando eu copiei a lista acima eu tive a WLAN desativada, e é por isso que ela não apareceu.]

Eu diria que eth0 é o único dispositivo. Não está claro o que é dsa.0 .

E em resposta à resposta 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 '…'
    
por Lumi 01.12.2012 / 13:03

4 respostas

15

Você pode verificar /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

Assim, os dispositivos reais são exibidos em / sys / class / net. Note que aliases (como lan: 0) não (assim você pode dizer quais são aliases). E você pode ver claramente quais são o hardware real (lan) e quais não são (br0, lo, tun0).

para esclarecer

Você pode dizer quais são os reais acima, porque os virtuais são todos virtuais. E a lan está no barramento PCI.

No seu caso, você tem seis: eth0, wan e lan1–4. Isso é bastante estranho, já que você diz que só tem cinco portas no total. Eu acho que eth0 é realmente ligado a um chip switch-ish, e as outras 5 portas são portas nesse switch. O wlan0 provavelmente também é real (seria o adaptador sem fio), apesar de não estar aparecendo em / sys….

Então, eu diria que, para todos os efeitos práticos, suas portas reais são wan, lan1-4 e wlan0. O br-lan é uma ponte configurada para fazer com que todas as 4 portas lan funcionem como um comutador (assim você pode ser capaz de dividir o comutador).

    
por 12.12.2012 / 19:04
4

Supondo que o endereço MAC da sua interface não seja falsificado , você pode tentar usar ethtool :

ethtool -P {Network interface name}

" Endereço permanente: 00: 00: 00: 00: 00: 00 " indicará que é uma interface de rede virtual.

O seguinte loop bash exibirá o endereço MAC para todas as interfaces de rede:

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
    
por 30.01.2018 / 18:01
2

Eu começaria procurando em /etc/network/config ; a maioria das distros tem um arquivo semelhante para definir e configurar dispositivos de rede. No debian / Ubuntu, é / etc / network / interfaces. Se você fosse postar o conteúdo disso, poderíamos identificar entradas de alias, títulos e pontes; o resto seria seus dispositivos físicos.

Olhando para a saída ifconfig , você pode dizer (como você mencionou) pelos dispositivos que têm interrupções (IRQs); muitos também têm memória designada, que interfaces virtuais não têm.

Você não pode julgar apenas por endereços mac, já que os vínculos ( agregação de links ) substituirão o mac de cada dispositivos, e pontes usarão o mesmo. Portanto, se você tiver dois dispositivos ligados e em ponte - uma configuração comum para hosts e roteadores virtuais de alta disponibilidade - haverá quatro dispositivos com o mesmo 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

É evidente que os aliases usados no openwrt não são os acima, mas o conceito é válido; Eu usei isso porque eles são uma prática padrão.

    
por 12.12.2012 / 17:39
-2

Acho que apenas verificar se o valor de /sys/class/net/<interface>/type é 1 (ARPHRD_ETHER) deve ser suficiente para entender se o dispositivo é físico.

link

por exemplo. nome de base $ (dirname grep -l ^1$ /sys/class/net/*/type )

    
por 11.05.2015 / 12:17