更改下层网络接口的MAC地址

更改下层网络接口的MAC地址

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

但我最近发现了这些文件/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 地址?

答案1

背景

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

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

# echo 3 > /proc/sys/vm/drop_caches

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

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

write error: Input/output error

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

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

ifconfig我可以在不致电或 的情况下更改 MAC 地址吗ip 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;

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

答案2

通过在更高级别更改您的 MAC 地址(例如使用网络管理器),您不会更改物理 MAC 地址。您正在“欺骗”系统,将物理 MAC 链接到您输入的 MAC。物理MAC地址在生产时就被烧录到网卡中,如果不改变硬件就无法改变。

相关内容