如何判断网络接口是物理(设备)还是虚拟(别名)?

Lum*_*umi 20 devices networkcard

我有一个运行 OpenWrt(一种用于路由器的嵌入式 Linux)的小型家用路由器。它有五个以太网端口,一个标记为 WAN,四个标记为 LAN 1 到 4。它具有以下定义的网络接口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
Run Code Online (Sandbox Code Playgroud)

如您所见,设备数量众多,但只有一个 MAC 地址。

我知道其中一些设备是虚拟的。让我们抛开lopppoe-wan,这是回环设备和我的PPPoE连接。但是对于其余的,我应该如何分辨它们是物理的还是虚拟的?我知道有一个命名约定来标记虚拟接口,如eth0.1,但显然这里没有遵守。让我们看看其中ifconfig两个接口的输出:

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
Run Code Online (Sandbox Code Playgroud)

除了txqueuelen具有非零的晦涩 Detail for 之外eth0,唯一显着的区别是它eth0有一个Interrupt条目,据我所知是一个硬件功能。那么,您是如何通过在 中查找Interrupt条目来判断网络接口是否为物理接口的ifconfig?或者,还有更好的方法?找出网络设备是物理设备还是虚拟设备的简单而直接的方法?

请注意,有一个相关的问题,但虽然它确实有一个可接受的答案,但它并不是决定性的。

更新

在回复 derobert 的回答时,以下信息来自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
Run Code Online (Sandbox Code Playgroud)

[此列表的附录:wlan0本来也会显示wlan0 -> ../../devices/platform/ath9k/net/wlan0,但是当我复制上面的列表时,我禁用了 WLAN,这就是它没有显示的原因。]

我会说eth0是唯一的设备。不清楚是什么dsa.0

并回复 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 '…'
Run Code Online (Sandbox Code Playgroud)

der*_*ert 22

您可以检查/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
Run Code Online (Sandbox Code Playgroud)

因此,实际设备显示在 /sys/class/net 中。请注意,别名(如 lan:0)不会(因此您可以分辨哪些是别名)。您可以清楚地看到哪些是实际硬件 (lan),哪些不是 (br0, lo, tun0)。

澄清

你可以在上面分辨哪些是真实的,因为虚拟的都是虚拟的。并且 lan 在 PCI 总线上。

在您的情况下,您有六个:eth0、wan 和 lan1-4。这很奇怪,因为您说您总共只有五个端口。我猜想 eth0 实际上是硬连线到交换机芯片上的,其他 5 个端口是该交换机上的端口。wlan0 也可能是真实的(可能是无线适配器),尽管它没有显示在 /sys....

所以,我想说,出于所有实际目的,您真正的端口是 wan、lan1-4 和 wlan0。br-lan 是一个网桥,它使所有 4 个 lan 端口都用作交换机(因此您可以拆分该交换机)。


Noa*_*nos 7

假设您的接口 MAC 地址没有被欺骗,您可以尝试使用ethtool

ethtool -P {Network interface name}
Run Code Online (Sandbox Code Playgroud)

永久地址:00:00:00:00:00:00 ”将表明它是一个虚拟网络接口。

以下 bash 循环将显示所有网络接口的 MAC 地址:

for i in $(ip -o link show | awk -F': ' '{print $2}'); \
do mac=$(ethtool -P $i) \
&& printf '%-10s %-10s\n' "$i" "$mac"; \
done
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)