在较低级别更改网络接口的 MAC 地址

sig*_*lor 3 linux networking mac-address

我知道我可以通过关闭接口来更改网络接口的 MAC 地址,使用类似ifconfig eth0 hw ether 00:11:22:33:44:55or的命令ip link set eth0 address 00:11:22:33:44:55,然后再次打开接口。类似ip link show eth0then的命令确认更改成功。

不过,我最近发现的文件/sys/class/net(最初从这个答案):每一个都是一个符号链接到包含有关的记录的接口信息文件的目录位置。例如,我的机器上,以太网接口enp3s0(我不知道为什么它有一个奇怪的名字),并/sys/class/net/enp3s0链接到/sys/devices/pci0000:00/0000:00:1c.2/0000:03:00.0/net/enp3s0.

在这个目录中,我找到了一个文件address,它只是一个包含接口 MAC 地址的文本文件。但是,当我尝试使用上述命令之一更改地址时,address文件保持不变,因此显然,这些命令不会更改最低级别的 MAC 地址。也不可能以任何方式更改此文件,即使是超级用户也无权这样做。

所以现在,出于好奇:是否可以在此级别更改网络接口的 MAC 地址?

gro*_*mal 6

背景

/proc/sys文件系统只是内核结构的一个视图,两个文件系统都驻留在内存中。尽管这两个文件系统都是可写的(好吧,其中的一些文件是可写的),但假设它们的行为方式与真实文件系统相同是不明智的。

允许您写入文件内部/proc/sys以钩子结束然后作为函数调用的操作。例如:

# echo 3 > /proc/sys/vm/drop_caches
Run Code Online (Sandbox Code Playgroud)

并不真正写入该文件,它调用用户空间内核函数。

如果没有为某个写入定义函数,您将获得:

write error: Input/output error
Run Code Online (Sandbox Code Playgroud)

那是因为写入该文件没有意义。这与写入没有关联驱动程序的 USB 设备的字符设备没有什么不同。内核不知道该做什么。

没有针对 writes 定义函数/sys/class/net/enp3s0/address,因此这不是更改该接口 MAC 地址的可行途径。

我可以改变,而无需调用的MAC地址ifconfigip link set

是的你可以。

如果您查看代码,iproute2您会发现很多参数解析和rtnl_talk. 它看起来如下(这是来自ip/iplink.c文件):

/* lot of argument parsing and `req` setting */

if (rtnl_talk(&rth, &req.n, 0, 0, NULL, NULL, NULL) < 0)
        exit(2);

return 0;
Run Code Online (Sandbox Code Playgroud)

req.n其中有传递给rnetlink函数的 MAC 地址rtnl_talkman rnetlink此处相关)。如果您编写执行此调用的程序,它将触发系统调用并更新 MAC 地址。然而,那么你将做完全相同的事情ip link set