Jak mogę sprawdzić, czy interfejs sieciowy jest fizyczny (urządzenie) czy wirtualny (alias)?

17

Mam mały domowy router z systemem OpenWrt (rodzaj wbudowanego systemu Linux dla routerów). Ma pięć portów Ethernet, jeden oznaczony WAN i cztery oznaczone LAN od 1 do 4. Ma następujące interfejsy sieciowe zdefiniowane zgodnie z 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

Jak widać, sporo urządzeń, ale tylko jeden adres MAC.

Rozumiem, że niektóre z tych urządzeń są wirtualne. Odłóżmy na bok loi pppoe-wan, to jest urządzenie loopback i moje połączenie PPPoE. Ale dla reszty z nich, jak mam wiedzieć, czy są one fizyczne, czy wirtualne? Rozumiem, że istnieje konwencja nazewnictwa do etykietowania wirtualnych interfejsów eth0.1, ale oczywiście nie jest to przestrzegane. Zobaczmy dane wyjściowe ifconfigdla dwóch z tych interfejsów:

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

Poza niejasnym szczegółem txqueuelenposiadania niezerowej wartości eth0, jedyną uderzającą różnicą jest to, że eth0ma Interruptpozycję, która, o ile wiem, jest cechą sprzętową. Czy w ten sposób można stwierdzić, że interfejs sieciowy jest fizyczny, czy nie, szukając Interruptwpisu ifconfig? Czy jest jakiś lepszy sposób? Prosty i bezpośredni sposób na sprawdzenie, czy urządzenie sieciowe jest fizyczne czy wirtualne?

Zauważ, że istnieje powiązane pytanie, ale chociaż ma ono zaakceptowaną odpowiedź, nie jest rozstrzygające.

Aktualizacja

W odpowiedzi na odpowiedź derobert, oto informacje pochodzące z 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

[Dodatek do tej listy: wlan0pojawiłby się również wlan0 -> ../../devices/platform/ath9k/net/wlan0, ale kiedy skopiowałem powyższą listę, miałem wyłączoną sieć WLAN, dlatego się nie pojawiła.]

Powiedziałbym, że eth0to jedyne urządzenie. Nie wiadomo, co dsa.0jest.

I w odpowiedzi na odpowiedź Bryana Agee'a:

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
źródło
Odpowiedziałeś już na swoje pytanie (poszukaj elementów specyficznych dla sprzętu, takich jak IRQ, txqueue, ...). Powstaje dla mnie pytanie - dlaczego musisz to rozróżnić w przypadku użycia?
Nils,
@ Nils, nie mam jasnego pojęcia o konfiguracji sieci na moim routerze po sflashowaniu na niego OpenWrt. Uważam to za całkowicie mylące. Dokumenty projektu i forum zapewniły pewną pomoc, ale niewystarczającą i pozostawiając podstawowe pytania bez odpowiedzi. Jednym z tych pytań jest pytanie postawione tutaj. Teraz wydaje mi się, że mój router ma tylko jedną kartę sieciową, kiedy byłem pewien, że ma dwa. Wyjaśnienie szczegółów zmniejsza zamieszanie. Dlatego.
Lumi,
Czy możesz tutaj umieścić małe zdjęcie lub link do zdjęcia / dokumentacji tego routera? Mogą istnieć takie rzeczy, jak łączenie / mostkowanie / NATting, które ukrywają prawdziwe adresy MAC ...
Nils
Powinieneś być w stanie zobaczyć lepsze szczegóły i te, których potrzebujesz, używająclshw -class network
Nathan V
@Nils, proszę bardzo: wiki.openwrt.org/toh/tp-link/tl-wr941nd - @Nathan, z zaledwie 4 MB pamięci flash, pudełko jest raczej ograniczone i lshwnie ma go na liście pakietów. Kompetentny i zdeterminowany facet może odnieść sukces w instalowaniu narzędzi programistycznych tmpfs, ale czy warto? Zamierzam pogłębić swoją wiedzę na temat pracy w sieci Linux za pomocą standardowego komputera. To będzie łatwiejsze. Chociaż nie rozumiem poprawnie tej konfiguracji routera, działa ona dobrze. Dzięki za pomoc.
Lumi,

Odpowiedzi:

19

Możesz sprawdzić /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

Tak więc rzeczywiste urządzenia wyświetlają się w / sys / class / net. Zauważ, że aliasy (jak lan: 0) nie (więc możesz powiedzieć, które to są aliasy). I możesz wyraźnie zobaczyć, które są rzeczywistym sprzętem (lan), a które nie (br0, lo, tun0).

w celu wyjaśnienia

Możesz powiedzieć, które są prawdziwe powyżej, ponieważ wirtualne są wszystkie wirtualne. A lan jest na szynie PCI.

W twoim przypadku masz sześć: eth0, wan i lan1–4. Jest to dość dziwne, ponieważ mówisz, że masz tylko pięć portów ogółem. Sądzę, że eth0 jest podłączony do układu przełącznika, a pozostałe 5 portów to porty tego przełącznika. wlan0 jest prawdopodobnie również prawdziwy (byłby to adapter bezprzewodowy), chociaż nie wyświetla się w / sys….

Powiedziałbym więc, że dla wszystkich praktycznych celów twoje prawdziwe porty to wan, lan1–4 i wlan0. br-lan to most skonfigurowany tak, aby wszystkie 4 porty LAN działały jako przełącznik (więc możesz być w stanie podzielić ten przełącznik).

derobert
źródło
Dzięki. Dodałem podobny wynik do mojego pytania. Nie jest tak wyraźny, jak pokazane tutaj wyjście, z szyną PCI lub czymś tam pokazanym; chociaż tak naprawdę nie rozumiem wyniku, zgadzam się, że wygląda jak identyfikatory sprzętowe. W przypadku mojego wyjścia opublikowanego powyżej, obecność ag71xxtego powoduje, że myślę, że to sprzęt, ponieważ wygląda jak sterownik.
Lumi
@Lumi edytowano, aby spróbować odpowiedzieć.
derobert
Jest to prawdopodobnie bardziej praktyczne niż moja odpowiedź.
Bryan Agee
Dzięki. Uwaga wlan0byłaby obecna na liście urządzeń, /sys/class/netponieważ została włączona, gdy kopiowałem listę. :) Dodałem go powyżej. Nie zgadzam się z tobą co do liczby urządzeń, myślę, że są tylko dwa, LAN i WLAN. Ale to drobna uwaga… dobra odpowiedź, zaakceptowana, dziękuję!
Lumi,
@Lumi użyj brctrl delif br-lan lan1(lub podobnego), aby upuścić port z mostu. Podejrzewam, że będzie wtedy działał jako osobny port (nie jest częścią przełącznika LAN).
derobert,
5

Zakładając, że adres MAC interfejsu nie został sfałszowany , możesz spróbować użyć ethtool :

ethtool -P {Network interface name}

Stały adres: 00: 00: 00: 00: 00: 00 ” oznacza, że ​​jest to interfejs sieci wirtualnej.

Następująca pętla bash wyświetli adres MAC dla wszystkich interfejsów sieciowych:

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
źródło
2

Zacznę od zaglądania /etc/network/config; większość dystrybucji ma podobny plik do definiowania i konfigurowania urządzeń sieciowych. W debian / Ubuntu jest to / etc / network / interfaces. Jeśli opublikujesz jego treść, możemy zidentyfikować wpisy aliasu, obligacji i mostu; reszta to twoje fizyczne urządzenia.

Patrząc na dane ifconfigwyjściowe, możesz rozpoznać (jak wspomniałeś) przez urządzenia, które mają przerwania (IRQ); wielu ma również przypisaną pamięć, czego nie mają interfejsy wirtualne.

Nie możesz nigdy oceniać samych adresów mac, ponieważ wiązania ( agregacja łączy ) zastąpią mac poszczególnych urządzeń, a mosty będą używać tego samego. Więc jeśli masz dwa połączone i zmostkowane urządzenia - wspólna konfiguracja wirtualnych hostów i routerów HA - będą cztery urządzenia z tym samym komputerem 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

Najwyraźniej aliasy użyte w openwrt nie są powyższymi, ale koncepcja jest zachowana; Użyłem ich, ponieważ są standardową praktyką.

Bryan Agee
źródło
Nie uwzględnia to interfejsów utworzonych w inny sposób, działających w sposób „standardowy” /etc. Na przykład interfejsy utworzone przez NetworkManager nie są tam wspomniane.
gertvdijk 12.12.12
@gertvdijk To prawda, chociaż openwrt nie pakuje NetworkManagera do tych 4 MB, więc wszystkie interfejsy powinny znajdować się w konfiguracji.
Bryan Agee,
-2

Myślę, że samo sprawdzenie, czy wartość /sys/class/net/<interface>/typewynosi 1 (ARPHRD_ETHER) powinno wystarczyć, aby zrozumieć, czy urządzenie jest fizyczne.

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

na przykład. basename $ (nazwa katalogu grep -l ^1$ /sys/class/net/*/type)

Ubaldo Porcheddu
źródło
Widzę 1 dla wielu interfejsów (eth, wireless, bridge i vlan zwisający z mostu - więc nie)
nhed