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-CARRIERstate 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,自动恢复就生效了。后续启动授权服务时,让网卡脚本先执行完成即可。

posted @ 2026-09-10 23:44  fmq03  阅读(21)  评论(0)    收藏  举报