我正在使用带有自定义内核 4.4.21 的 SuSE 12.2(与实时环境相关的微小更改)。
MAC 地址更改期间是否真的需要关闭/开启接口?我观察到,这并不是真正必要的(更改在启用的接口上成功,无需将其关闭)。
然而 - 互联网上的大多数示例建议关闭接口,然后更改 MAC 地址,然后再次启动它,例如howtogeek.com。文档中是否描述了此过程?
答案1
更改接口的 MAC 地址取决于硬件和驱动程序。当接口启动时,必须执行更多操作来更新接口的状态,同时仍在运行。有些驱动程序还不支持它,或者因为接口的硬件不允许这样的功能。
在接口上区分此功能的现代方法是 priv_flagIFF_LIVE_ADDR_CHANGE
它出现在内核 3.6 中。我不知道之前是否有其他机制可以实现这一点,以及以前是否有可能。人们可以只运行较旧的内核并检查哪些内容正在工作。
介绍这个的补丁是:
2012-06-30net:引入新的 priv_flag 指示 iface 能够在运行时更改 mac
引入
IFF_LIVE_ADDR_CHANGE
priv_flag 并使用它来禁用 eth_mac_addr() 中的 netif_running() 检查
正如人们所预料的那样,这一功能是在一些简单的虚拟设备之后添加的,例如假的界面:
2012-06-30virtio_net:使用IFF_LIVE_ADDR_CHANGE
priv_flag
2012-06-30团队:使用IFF_LIVE_ADDR_CHANGE
priv_flag
2012-06-30虚拟:使用IFF_LIVE_ADDR_CHANGE
priv_flag
每个驱动程序随着时间的推移进一步添加此功能的一些示例:
2014-06-10gre:允许在设备启动时更改 MAC 地址
2018-07-03r8169:修复 MAC 地址更改
这里有一个非常古老的3Com 龙卷风网卡不允许这样做,我仍然可用:
# uname -r
4.19.0-0.bpo.6-686-pae
# ethtool -i eth1|grep driver
driver: 3c59x
# lspci|grep 3Com
02:0c.0 Ethernet controller: 3Com Corporation 3c905C-TX/TX-M [Tornado] (rev 78)
# ip link set dev eth1 address 02:00:00:00:00:01
RTNETLINK answers: Device or resource busy
# ip link set dev eth1 down
# ip link set dev eth1 address 02:00:00:00:00:01
# ip link set dev eth1 up
# ip link show dev eth1
2: eth1: <BROADCAST,MULTICAST,ALLMULTI,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP mode DEFAULT group default qlen 1000
link/ether 02:00:00:00:00:01 brd ff:ff:ff:ff:ff:ff
因此,关闭接口以更改 MAC 地址的建议在这里仍然适用。
答案2
首先,为了解决你的问题,你应该验证显示的新设置是否已经生效。只是不要相信什么ifconfig
或某些命令可能会说 - 测试它。例如,通过使用tcpdump
或嗅探来自网络接口的流量Wireshark
。
更大的问题是,为什么要更改 MAC 地址。
如果您担心的是隐私,这是一个完全合理的理由。但那你应该改变它前网络服务启动。有不同的方法可以实现自动化。
如果您考虑一下,您的计算机可能已经向网络发送了 DHCP 请求(例如,如果您的以太网电缆已插入),因此泄露你的真实 MAC 地址。因此,此后更改 MAC 地址并不会改变先前(真实)地址可能已泄漏(并且可能已记录在某处)的事实。
网络管理器已经具有随机化 MAC 地址的选项。或者您可能使用普通/etc/network/interfaces
文件。指令pre-up
会处理它。
参见示例这个帖子更多细节。
如果目标是隐私,那么手动ifdown
更改 MAC 地址可能不是一个好的做法。ifup
最后,请务必记住,典型的 DHCP 请求不仅包含 MAC 地址,还包含主机名和各种标识符,其中一些标识符可能是恒定/唯一的。因此,仅更改 MAC 地址可能不足以达到匿名目的。