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_talk
(man rnetlink
与此处相关)。如果您编写执行此调用的程序,它将触发系统调用并更新 MAC 地址。然而,那时你会做完全相同的事情ip link set
。
答案2
通过在更高级别更改您的 MAC 地址(例如使用网络管理器),您不会更改物理 MAC 地址。您正在“欺骗”系统,将物理 MAC 链接到您输入的 MAC。物理MAC地址在生产时就被烧录到网卡中,如果不改变硬件就无法改变。