Moh*_*Raj 14 networking wifi ethernet network-interface
Linux 机器上以太网和 Wi-Fi 接口的命名约定标准是什么?
我们正在开发一个工具,它应该只显示Linux 机器的以太网和 Wi-Fi 接口及其当前状态。
例如,下面是我的 Linux (Ubuntu) 机器上的网络接口(物理和虚拟)列表:
docker0, enp0s25, lo,wlp3s0
当我运行该工具时,以下是我得到的结果:
enp0s25, wlp3s0
我们编写的代码的逻辑是所有以太网接口总是以字母开头,e而 Wi-Fi 接口总是以字母开头w。
逻辑对吗?如果没有,我们如何解决这个问题?
dir*_*rkt 40
网络接口可以命名为任何名称,因此无论您做什么,您都会遇到以下情况:(1) 存在名称与您的模式不匹配的“物理”网络接口,或者 (2) 存在将匹配您的模式的“物理”网络接口。
最重要的是,如果我是您工具的用户,那么您的工具不允许我做我想做的事情的那一刻,因为我有一个“虚拟”的网络接口,但出于实际目的,应该考虑“物理”在我的设置中,我会开始大声而有力地诅咒您的应用程序,并且再也不会使用它。
物理和虚拟网络接口都共享一个公共 API,这是使 Linux 真正灵活的一件事。请不要试图照顾您的用户,并将其从他或她身边带走。您的用户会感谢您。
use*_*274 27
对于 systemd可预测的接口名称,前缀可以在udev-builtin-net_id.c:
* Two character prefixes based on the type of interface:
* en — Ethernet
* ib — InfiniBand
* sl — serial line IP (slip)
* wl — wlan
* ww — wwan
Run Code Online (Sandbox Code Playgroud)
因此,对于传统ethX的命名方式和较新的 systemd 命名方式,首字母e应该是任何自动生成的接口名称的以太网接口。在这两种方案中,所有 wifi 接口都应以w开头,尽管并非所有以w开头的接口都是 wifi。
如果此工具必须在任意环境中工作(而不仅仅是在您控制的内部环境中),请注意用户可以使用任意名称重命名 linux 系统上的接口,例如 [ wan0, lan0, lan1, dmz0] 这将打破任何关于首字母的假设.
命名约定是 LAN 接口命名为eth0, eth1, ... 而 WLAN 接口命名为wlan0, wlan1, ...
您看到的是 systemd 引入的所谓“可预测名称”。在实践中,它们是不可预测的,甚至可以在硬件更改时更改,这正是它们应该避免的问题。
猜测一下,起始字母可能就足够了。一些接口,特别是 WLAN,有以下提示/sys/class/net/*/uevent:
DEVTYPE=wlan
Run Code Online (Sandbox Code Playgroud)
不幸的是,DEVTYPELAN 接口没有这样的接口。
我的回答有一个警告(也适用于大多数其他人):我不知道您申请的目的。如果它是用于解决特定问题的一次性应用程序,或者是为了更好地了解网络,永远不会再次使用,那么依赖界面的第一个字母可能是一个很好的快速而肮脏的选择。如果您打算编写 Wireshark 或 tcpdump 的下一个竞争对手,您需要确保它适合各种边缘情况。
如果您正在编写的应用程序介于这些极端之间,那么只有您(和您的客户)才能知道您需要多么小心地实现您的逻辑。
其他人已经指出,出于多种原因,这些名称从不可靠。最终的问题是软件中一个非常常见的问题:硬编码假设而不是依赖已知/记录的事实。
尚未提及的第二个问题也是基于对您的要求的假设:您要列出的接口列表始终完全是“硬件以太网接口”和“wifi 接口”。
第三个问题是另一个假设:所有界面都将归入您现在可以想到的类别。@user4556274 提到的 Infiniband 怎么样?VPN的隧道接口怎么样?桥接接口怎么样?结合物理和逻辑接口的桥接接口怎么样?
但是可能有一些选项可以完成您正在寻找的内容。首先,准确定义您想要列出的接口的特征,以及您不想列出的接口的特征。
在大多数情况下,您可以依赖的一个特性是路由表(但是,这仅在接口启动时才有效,因此它可能不是您实际需要的)。
任何具有默认路由(即到 0.0.0.0 的路由)的接口都可能是您正在寻找的接口。
请注意,即使这仍然基于一个假设,只是一个更可靠的假设:可以想象,系统被配置为通过虚拟机或 docker 容器路由所有出站流量(例如,如果有一个容器运行防火墙)。反过来也是如此:系统管理员可能会通过删除默认路由来锁定外部流量。
另一种选择是查看实际硬件并查看它使用的驱动程序。然后您可以排除某些知名驱动程序