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

17

Eu tenho um pequeno roteador doméstico executando o OpenWrt (tipo de Linux incorporado para roteadores). Possui cinco portas Ethernet, uma rotulada WAN e quatro rotuladas LAN 1 a 4. Possui as seguintes interfaces de rede definidas conforme 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.

Entendo que alguns desses dispositivos são virtuais. Vamos deixar de lado loe pppoe-wanesse é o dispositivo de loopback e minha conexão PPPoE. Mas para o restante deles, como devo saber se eles são físicos ou virtuais? Entendo que existe 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 ifconfigpara 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 txqueuelenter um diferente de zero eth0, a única diferença marcante é que eth0tem uma Interruptentrada, que, até onde eu sei, é um recurso de hardware. Então é assim que você diz que uma interface de rede é física ou não, procurando uma Interruptentrada ifconfig? Ou há um jeito 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, 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: wlan0teria aparecido tão bem quanto wlan0 -> ../../devices/platform/ath9k/net/wlan0, mas quando copiei a lista acima, a WLAN foi 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 '…'
Lumi
fonte
Você já respondeu sua própria pergunta (procure itens específicos de hardware como IRQ, txqueue, ...). A pergunta que me surge é - por que você precisa diferenciá-la no seu caso de uso?
Nils
@ Nils, eu não tenho uma noção clara da configuração de rede no meu dispositivo roteador depois que instalei o OpenWrt nele. Acho completamente confuso. Os documentos e o fórum do projeto forneceram alguma ajuda, mas não o suficiente, e deixaram as perguntas básicas sem resposta. Uma dessas perguntas é a levantada aqui. Agora me parece que meu roteador tem apenas uma placa de rede quando eu tinha certeza de que tinha duas. O esclarecimento de detalhes reduz a confusão. É por isso.
Lumi
Você pode colocar uma foto pequena ou um link para uma foto / documentação desse roteador aqui? Pode haver coisas como bonding / ponte / natting que escondem os MACs reais ...
Nils
Você poderá ver melhores detalhes, e os de que precisa, usandolshw -class network
Nathan V
@ Nils, aqui está: wiki.openwrt.org/toh/tp-link/tl-wr941nd - @ Nathan, com apenas 4 MB de flash, a caixa é bastante restrita e lshwnão está na lista de pacotes. Um cara experiente e determinado pode ter sucesso na instalação de ferramentas de desenvolvimento tmpfs, mas valeria a pena? Vou aprofundar minha compreensão das redes Linux por meio de um PC padrão. Isso vai ser mais fácil. Embora eu não entenda corretamente essa configuração do roteador, ela funciona bem. Obrigado pela ajuda.
Lumi

Respostas:

19

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

Portanto, os dispositivos reais são exibidos em / sys / class / net. Observe que os aliases (como lan: 0) não são (para que você possa saber quais são os aliases). E você pode ver claramente quais são os hardwares reais (lan) e quais não são (br0, lo, tun0).

esclarecer

Você pode dizer quais são reais nas opções acima, porque as virtuais são todas virtuais. E lan está no barramento PCI.

No seu caso, você tem seis: eth0, wan e lan1–4. Isso é bastante estranho, pois você diz que possui apenas cinco portas no total. Eu acho que eth0 é realmente conectado a um chip switch-ish, e as outras 5 portas são portas nesse switch. wlan0 provavelmente também é real (seria o adaptador sem fio), embora não esteja sendo exibido em / sys….

Então, eu diria que, para todos os propósitos práticos, suas portas reais são wan, lan1–4 e wlan0. br-lan é uma ponte configurada para fazer com que todas as 4 portas lan funcionem como um comutador (para que você possa dividir esse comutador).

derobert
fonte
Obrigado. Eu adicionei resultados semelhantes à minha pergunta. Não é tão claro quanto a saída que você está mostrando aqui, com o barramento PCI ou outros enfeites; Embora eu realmente não entenda a saída, concordo que parece com identificadores de hardware. No caso da minha saída postada acima, é a presença ag71xxdisso que me faz pensar que é hardware, pois parece um driver.
Lumi
@Lumi editado para tentar responder.
21812 derobert
Provavelmente isso é mais prático do que minha resposta.
Bryan Agee
Obrigado. A nota wlan0estaria presente na lista de dispositivos sob a /sys/class/netqual foi ativada quando eu copiei a lista. :) Agora eu adicionei acima. Não concordo com você no número de dispositivos, acho que existem apenas dois, LAN e WLAN. Mas isso é um ponto secundário ... boa resposta, aceita, obrigado!
Lumi
O @Lumi usa brctrl delif br-lan lan1(ou similar) para soltar uma porta da ponte. Eu suspeito que funcionará como uma porta separada (não faz parte do switch LAN).
derobert
5

Supondo que o endereço MAC da interface não tenha sido falsificado , você pode tentar usar o 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
Noam Manos
fonte
2

Eu começaria olhando /etc/network/config; a maioria das distros possui um arquivo semelhante para definir e configurar dispositivos de rede. No debian / Ubuntu, é / etc / network / interfaces. Se você postasse o conteúdo disso, poderíamos identificar entradas de alias, vínculos e pontes; o resto seriam seus dispositivos físicos.

Observando a ifconfigsaída, você pode dizer (como mencionado) pelos dispositivos que possuem interrupções (IRQs); muitos também têm memória atribuída, o que interfaces virtuais não.

Você nunca pode julgar apenas pelos endereços MAC, pois os vínculos ( agregação de link ) substituirão o mac de dispositivos individuais e as 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

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

Bryan Agee
fonte
Isso não leva em conta as interfaces criadas de outras maneiras, contornadas da maneira 'padrão' /etc. Por exemplo, as interfaces criadas pelo NetworkManager não são mencionadas lá.
gertvdijk
@gertvdijk Isso é verdade, embora o openwrt não inclua o NetworkManager nesses 4 MB, portanto todas as interfaces devem estar na configuração.
Bryan Agee
-2

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

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

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

Ubaldo Porcheddu
fonte
Eu estou vendo um para muitas interfaces (eth, wireless, ponte, & enforcamento vlan de uma ponte - de modo nenhum)
nhed