WSL2 NAT 模式下固定 MAC 地址:解决 License 服务器重启后授权失效问题
在 WSL2 中运行按 MAC 绑定的授权服务,会遇到一个麻烦:NAT 网卡的 MAC 可能在重启后变化,导致原有许可证不再匹配。我在配置 Synopsys 全家桶时碰到了这个问题,出于某些原因我又无法使用镜像网络,只能继续用 NAT。如果直接修改 eth0 的 MAC 会导致无法联网。
最后采用的办法是保留联网的 eth0,另用一个空的 bond0 提供固定 MAC,每次启动时恢复。这个思路也适用于其他按 MAC 绑定、且能识别这种虚拟接口的授权程序。(下面的解决方案由 AI 辅助生成)
1. 先判断是否适用
前提是授权服务运行在 WSL 内,许可证按 MAC 绑定,并且软件支持读取 bonding 虚拟网卡的地址。Synopsys 和 FlexNet 的相关说明可参考这里和这里。如果只是连接其他机器上的普通浮动授权服务器,通常不需要固定 WSL 的 MAC。
在 WSL 中运行:
ip -d link show bond0
- 提示
Device "bond0" does not exist:可以继续,后面的脚本会创建它。如果有了的话,可能bond0被使用,可能需要使用其他 bond,在下面的脚本中将bond0换成其他的。
2. 创建固定 MAC 的脚本
假设许可证绑定的 hostid 是 00155df11eea,对应的 MAC 就是 00:15:5d:f1:1e:ea。执行下面的命令前,先把 mac= 后的地址换成自己的。这个命令本质上是写了一个 /usr/local/sbin/wsl-license-net 脚本。
sudo tee /usr/local/sbin/wsl-license-net >/dev/null <<'EOF'
#!/bin/sh
set -eu
PATH=/usr/sbin:/usr/bin:/sbin:/bin
dev=bond0
mac=00:15:5d:f1:1e:ea
if [ ! -e "/sys/class/net/$dev" ]; then
if create_error=$(ip link add "$dev" type bond 2>&1); then
:
elif [ ! -d "/sys/class/net/$dev/bonding" ]; then
printf 'Cannot create %s: %s\n' "$dev" "$create_error" >&2
exit 1
fi
fi
if [ ! -d "/sys/class/net/$dev/bonding" ]; then
echo "$dev is not a bonding interface" >&2
exit 1
fi
if [ -n "$(cat "/sys/class/net/$dev/bonding/slaves")" ]; then
echo "$dev has member interfaces; refusing to modify it" >&2
exit 1
fi
if [ "$(cat "/sys/class/net/$dev/address")" != "$mac" ]; then
ip link set dev "$dev" down
ip link set dev "$dev" address "$mac"
fi
ip link set dev "$dev" up
EOF
之后配置脚本可运行权限和所有权:
sudo chown root:root /usr/local/sbin/wsl-license-net
sudo chmod 755 /usr/local/sbin/wsl-license-net
上面的脚本里做了一些兼容性的检测,其实这里面最核心的就是下面内容,其它的理论上都可以不要:
dev=bond0
mac=00:15:5d:f1:1e:ea
ip link add "$dev" type bond
ip link set dev "$dev" down
ip link set dev "$dev" address "$mac"
ip link set dev "$dev" up
3. 手动运行一次
执行脚本,查看退出码和设置后的地址:
sudo /usr/local/sbin/wsl-license-net
echo "退出码=$?"
cat /sys/class/net/bond0/address
预期输出:
退出码=0
00:15:5d:f1:1e:ea
地址应与脚本中的 mac= 一致。脚本可以重复运行。空的 bond 没有实际链路,显示 NO-CARRIER 或 state DOWN 不代表 MAC 设置失败。
这里测试的是网卡地址是否设置成功,具体授权软件的配置按各自的方法处理,例如运行 lmgrd ,看看能否正常激活 license。
4. 配置开机执行
编辑 WSL 内的 /etc/wsl.conf:
sudo vim /etc/wsl.conf
加入以下内容;如果已经有 [boot],就在原有节中添加或修改 command:
[boot]
command=/usr/local/sbin/wsl-license-net
保留文件里的其他设置。如果已有其他启动命令,需要合并执行流程,不要直接覆盖。微软文档将这个启动选项标注为 Windows 11 / Server 2022 可用,命令以 root 执行。官方说明
保存工作后,在 Windows PowerShell 中重启 WSL:
wsl --shutdown
wsl
重新进入后,不要先手动运行脚本,直接查看:
cat /sys/class/net/bond0/address
如果仍是设定的 MAC,自动恢复就生效了。后续启动授权服务时,让网卡脚本先执行完成即可。

浙公网安备 33010602011771号