Как я могу определить, является ли сетевой интерфейс физическим (устройство) или виртуальным (псевдоним)?

17

У меня есть небольшой домашний маршрутизатор под управлением OpenWrt (вид встроенного Linux для маршрутизаторов). Он имеет пять портов Ethernet, один с меткой 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

Как видите, довольно много устройств, но только один MAC-адрес.

Я понимаю, что некоторые из этих устройств являются виртуальными. Давайте отложим в сторону loи pppoe-wanэто устройство loopback и мое соединение 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

Помимо непонятной детализации txqueuelenненулевого значения eth0, единственное различие заключается в том, что в нем eth0есть Interruptзапись, которая, насколько я знаю, является аппаратной функцией. Так вот как вы говорите, что сетевой интерфейс является физическим или нет, ища Interruptвход в ifconfig? Или есть лучший способ? Простой и понятный способ узнать, является ли сетевое устройство физическим или виртуальным?

Обратите внимание, что есть связанный вопрос, но, хотя он и имеет принятый ответ, он не является окончательным.

Обновить

В ответ на ответ Дероберта вот информация, полученная из 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

[Приложение к этому списку: wlan0показалось бы так же хорошо wlan0 -> ../../devices/platform/ath9k/net/wlan0, но когда я скопировал приведенный выше список, у меня была отключена WLAN, поэтому он не появился.]

Я бы сказал, eth0это единственное устройство. Не понятно что это dsa.0такое.

И в ответ на ответ Брайана Эйджи:

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
источник
Вы уже ответили на свой вопрос (ищите элементы, относящиеся к оборудованию, такие как IRQ, txqueue, ...). Вопрос, который возникает у меня, - почему вы должны дифференцировать это в вашем случае использования?
Нильс
@ Nils, у меня нет четкого представления о конфигурации сети на моем маршрутизаторе после того, как я установил на него OpenWrt. Я нахожу это полностью запутанным. Документы по проектам и форум предоставили некоторую помощь, но не достаточно, оставив без ответа основные вопросы. Один из тех вопросов, который поднимается здесь. Теперь мне кажется, что у моего маршрутизатора есть только один сетевой адаптер, когда я был уверен, что у него было два. Уточнение деталей уменьшает путаницу. Поэтому.
Lumi
Можете ли вы поставить маленькое фото или ссылку на фото / документацию для этого роутера здесь? Могут быть такие вещи, как соединение / соединение / NATting, которые скрывают настоящие MAC-адреса ...
Nils
Вы должны быть в состоянии увидеть более подробную информацию, и те, которые вам нужны, используяlshw -class network
Nathan V
@Nils, вот и вы: wiki.openwrt.org/toh/tp-link/tl-wr941nd - @Nathan, всего 4 МБ флэш-памяти, поле довольно ограничено и lshwотсутствует в списке пакетов. Знающий и целеустремленный парень может успешно установить инструменты разработки tmpfs, но стоит ли это того? Я собираюсь углубить свое понимание работы с сетью Linux с помощью стандартного ПК. Это будет проще. Хотя я не совсем понимаю эту конфигурацию маршрутизатора, она работает нормально. Спасибо за вашу помощь.
Луми

Ответы:

19

Вы можете проверить /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

Итак, реальные устройства отображаются в / 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 порта локальной сети работали как коммутатор (так что вы можете разделить этот коммутатор).

derobert
источник
Благодарю. Я добавил аналогичный вывод на мой вопрос. Это не так ясно, как вывод, который вы показываете здесь, с шиной PCI или чем-то подобным; хотя я не совсем понимаю вывод, я согласен, что он выглядит как аппаратные идентификаторы. В случае моего вывода, опубликованного выше, именно наличие ag71xxэтого заставляет меня думать, что это аппаратное обеспечение, так как оно выглядит как драйвер.
Lumi
@Lumi отредактировал, чтобы попытаться ответить.
Дероберт
Это, вероятно, более практично, чем мой ответ.
Брайан Эйджи
Благодарю. Примечание wlan0будет присутствовать в списке устройств, если /sys/class/netоно было включено, когда я скопировал список. :) Я уже добавил это выше. Я не согласен с вами по количеству устройств, думаю, их всего два, LAN и WLAN. Но это мелочь ... хороший ответ, принят, спасибо!
Луми
@Lumi использовать brctrl delif br-lan lan1(или аналогичный), чтобы сбросить порт с моста. Я подозреваю, что тогда он будет функционировать как отдельный порт (не является частью коммутатора локальной сети).
Дероберт
5

Предполагая, что MAC-адрес вашего интерфейса не был подделан , вы можете попробовать использовать ethtool :

ethtool -P {Network interface name}

« Постоянный адрес: 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

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

Я бы начал с заглядывания внутрь /etc/network/config; большинство дистрибутивов имеют аналогичный файл для определения и настройки сетевых устройств. В Debian / Ubuntu это / etc / network / interfaces. Если бы вы разместили содержимое этого, мы могли бы определить псевдоним, связь и записи моста; остальное будет вашим физическим устройством.

Посмотрев на ifconfigвывод, вы можете сказать (как вы уже упоминали) по устройствам, которые имеют прерывания (IRQ); многим также назначена память, чего нет у виртуальных интерфейсов.

Вы никогда не сможете судить только по MAC-адресам, так как связи ( агрегация ссылок ) переопределят mac отдельных устройств, и мосты будут использовать то же самое. Таким образом, если у вас есть два устройства, связанных и соединенных мостом - общая конфигурация для виртуальных хостов и маршрутизаторов высокой доступности - будет четыре устройства с одним и тем же 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

Очевидно, что псевдонимы, используемые в openwrt, не те, что указаны выше, но концепция верна; Я использовал их, потому что они стандартная практика.

Брайан Эйджи
источник
Это не учитывает интерфейсы, созданные другими способами, которые работают по «стандартному» /etcпринципу. Например, интерфейсы, созданные NetworkManager, там не упоминаются.
gertvdijk 12.12.12
@gertvdijk Это правда, хотя openwrt не упаковывает NetworkManager в эти 4 МБ, поэтому все интерфейсы должны быть в конфигурации.
Брайан Эйджи
-2

Я думаю, что простой проверки, если значение /sys/class/net/<interface>/type1 (ARPHRD_ETHER) должно быть достаточно, чтобы понять, является ли устройство физическим.

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

например. базовое имя $ (dirname grep -l ^1$ /sys/class/net/*/type)

Убальдо Порчедду
источник
Я вижу 1 для многих интерфейсов (eth, wireless, bridge & vlan, висящий на мосту - так нет)
nhed