真实硬件mac地址必须用sudo ethtool -p ens33读取网卡eeprom中出厂烧录的不可变地址;ip link show和/sys/class/net/xxx/address仅显示当前生效地址,可能被临时修改。

ip link show 显示的不是真实硬件 MAC 地址,而是当前内核正在使用的生效地址——它可能已被软件临时修改过。要确认“真实硬件 MAC”,必须查网卡 EEPROM 中烧录的出厂地址;而合规修改 MAC,则需明确区分“临时生效”与“不可逆写入”的边界。
查真实硬件 MAC:用 ethtool -P 读取 EEPROM
真实硬件 MAC 是网卡出厂时写入 ROM/EEPROM 的唯一标识,软件无法覆盖。必须用以下命令:
- 执行 sudo ethtool -P ens33(注意是大写 -P,不是小写 -p)
- 输出形如 Permanent address: 00:11:22:33:44:55,这个值才是可信的物理身份
- 普通用户权限不够,必须加 sudo
- 不是所有网卡都支持:veth、macvlan、部分 Realtek 或 USB 网卡会返回 No data available;某些 Intel 千兆卡驱动未实现该接口,可能返回全零
查当前生效 MAC:ip link show 和 /sys/class/net/xxx/address
这两个来源本质一致,反映的是当前内核实际使用的地址,适合日常运维和脚本调用:
- ip link show ens33 | grep "link/ether" | awk '{print $2}' —— 字段固定,兼容性好,网卡 down 了也能查
- cat /sys/class/net/ens33/address —— 输出纯字符串,无空格无前缀,普通用户可读,适合容器或轻量脚本
- ⚠️ 这两个值都会随
ip link set dev ens33 address xx:xx:xx:xx:xx:xx改变,不等于硬件身份证
合规修改 MAC:仅限临时生效,且需满足前提
Linux 允许通过 ip link set 修改 MAC,但这是纯内存级操作,重启或 down/up 后失效。合规使用需注意:
-
必须先关闭网卡:
sudo ip link set ens33 down -
再设置新地址:
sudo ip link set dev ens33 address 00:aa:bb:cc:dd:ee -
最后启用:
sudo ip link set ens33 up - 修改后
ip link show ens33和/sys/class/net/ens33/address会同步更新,但ethtool -P输出不变 - 不建议在生产环境长期使用软改 MAC,尤其涉及资产审计、License 绑定或网络准入策略时,应以
ethtool -P值为准
怎么确认你查/改的是物理网卡?
系统里常有 lo、docker0、veth*、br-* 等虚拟接口,它们没有真实 EEPROM。选错设备,一切操作都失去意义:
- 快速筛选物理以太网卡:
ip -br link | grep -E '^en' | grep -v 'docker|veth|br-' - 更稳妥方式:
lspci -k | grep -A 3 -i ethernet,看哪个设备绑定了 kernel driver(如 igb、r8169、e1000e) - 别硬编码 eth0 —— 现代系统多用 enp0s3、ens160 等可预测命名,
ls /sys/class/net/看一眼最保险











