WSL2 Mirrored 模式下 Synopsys License 与 Windows 本地代理共存配置记录 背景我的环境是Windows WSL2 UbuntuWSL 使用networkingModemirroredWindows 本地代理监听127.0.0.1:7890Synopsys SCL 2018.06FlexNet 11.14.1License Server 端口为27000License 绑定 HostID00155dec9c9bWindows 用户目录下的.wslconfig[wsl2] networkingModemirrored最初遇到的问题是lmgrd可以启动但snpslmd很快退出日志中出现Not able to resolve local host No route to host进一步使用strace排查后发现真正失败的是snpslmd对127.0.0.1的本地自连接connect(... 127.0.0.1:随机端口 ...) -1 EHOSTUNREACH而 Mirrored 模式会通过策略路由把普通用户访问127.0.0.1的 TCP/UDP 流量送到 Windows因此 FlexNet 的本地自连接和 Windows localhost 转发发生了冲突。一开始采用的全局规则为什么不行最初通过以下规则强制整个127.0.0.0/8走 WSL 本地回环sudoipruleaddpref0to127.0.0.0/8 lookuplocalsudoipruleaddpref0to127.0.0.0/8 ipproto tcp lookuplocalsudoipruleaddpref0to127.0.0.0/8 ipproto udp lookuplocal这样确实能让 License 启动但也会导致普通用户访问127.0.0.1:7890时被送到 WSL 自己而不是 Windows 代理最终出现Connection refused因此不能对所有用户全局修改 localhost 路由必须只处理 License 服务进程。最终方案最终采用以下结构blackheart 普通用户 └─ 127.0.0.1:7890 → Mirrored → Windows 代理 snpslic 服务用户 └─ 127.0.0.1 → WSL lo → FlexNet 本地自连接 bond0 └─ 只提供固定 MAC / HostID不配置 IP、不参与实际网络整体分为三部分创建专用用户snpslic运行 License仅对该用户添加uidrangelocalhost 路由通过独立bond0固定 FlexNet HostID。本文中的固定 MAC 仅用于恢复原来合法 License 已绑定的 HostID不用于修改或绕过 License 内容。1. 保持/etc/wsl.conf简洁不要再直接在[boot] command中创建网卡否则容易遇到启动时序或配置格式问题。最终的/etc/wsl.conf[user] defaultblackheart [boot] systemdtrue检查cat-n/etc/wsl.conf然后在 Windows PowerShell 中执行wsl--shutdown重新进入 WSL 后确认ps-p1-ocomm输出应为systemd2. 创建 License 专用用户sudouseradd--system\--no-create-home\--home-dir /nonexistent\--shell/usr/sbin/nologin\--commentSynopsys License Service\snpslic查看 UIDidsnpslic我的环境中 UID 为uid997(snpslic)确保该用户能够读取 License 文件并执行lmgrd/snpslmdsudo-usnpslic\/home/synopsys/scl/2018.06/linux64/bin/lmhostid-ether3. 仅为snpslic修复 localhost 路由创建脚本sudotee/usr/local/sbin/fix-wsl-mirrored-loopback.sh/dev/nullEOF #!/usr/bin/env bash set -euo pipefail LICENSE_USERsnpslic LICENSE_UID$(id -u ${LICENSE_USER}) if ! ip rule show | grep -Fq to 127.0.0.0/8 uidrange ${LICENSE_UID}-${LICENSE_UID} lookup local; then ip rule add pref 0 \ uidrange ${LICENSE_UID}-${LICENSE_UID} \ to 127.0.0.0/8 \ lookup local fi ip route flush cache EOFsudochmod755/usr/local/sbin/fix-wsl-mirrored-loopback.sh创建 systemd 服务sudotee/etc/systemd/system/wsl-mirrored-loopback-fix.service/dev/nullEOF [Unit] DescriptionWSL Mirrored Loopback Fix for Synopsys License Afternetwork-online.target Wantsnetwork-online.target Beforesynopsys-license.service [Service] Typeoneshot ExecStart/usr/local/sbin/fix-wsl-mirrored-loopback.sh RemainAfterExityes [Install] WantedBymulti-user.target EOF启用sudosystemctl daemon-reloadsudosystemctlenable--nowwsl-mirrored-loopback-fix.service检查规则iprule show|grep-Euidrange|lookup 127|127\.0\.0\.0/8正常应看到0: from all to 127.0.0.0/8 uidrange 997-997 lookup local 1: from all ipproto tcp lookup 127 1: from all ipproto udp lookup 127不要出现不带uidrange的全局规则from all to 127.0.0.0/8 lookup local如果之前添加过全局规则只需要迁移时删除一次sudoiprule del pref0to127.0.0.0/8 lookuplocalsudoiprule del pref0to127.0.0.0/8 ipproto tcp lookuplocalsudoiprule del pref0to127.0.0.0/8 ipproto udp lookuplocalsudoiproute flush cache4. 创建固定 HostID 的bond0License 文件中的 SERVER 行SERVER LAPTOP-CEUP9426 00155dec9c9b 27000对应 MAC00:15:5d:ec:9c:9bWSL 重启后普通虚拟网卡 MAC 可能变化因此创建一个只用于提供 HostID 的 bond 接口。创建脚本sudotee/usr/local/sbin/setup-synopsys-hostid.sh/dev/nullEOF #!/usr/bin/env bash set -euo pipefail IFACEbond0 MAC00:15:5d:ec:9c:9b # bond0 不存在时创建若同时被其他进程创建则继续使用已有接口 if ! ip link show ${IFACE} /dev/null 21; then ip link add ${IFACE} type bond 2/dev/null || true fi if ! ip link show ${IFACE} /dev/null 21; then echo ERROR: failed to create ${IFACE} 2 exit 1 fi ip link set dev ${IFACE} down ip link set dev ${IFACE} address ${MAC} echo ${IFACE} MAC configured as ${MAC} EOFsudochmod755/usr/local/sbin/setup-synopsys-hostid.sh创建服务sudotee/etc/systemd/system/synopsys-hostid.service/dev/nullEOF [Unit] DescriptionConfigure Synopsys FlexNet HostID Afternetwork-online.target Wantsnetwork-online.target Beforesynopsys-license.service [Service] Typeoneshot ExecStart/usr/local/sbin/setup-synopsys-hostid.sh RemainAfterExityes [Install] WantedBymulti-user.target EOF启用sudosystemctl daemon-reloadsudosystemctlenable--nowsynopsys-hostid.service验证iplinkshow bond0应看到link/ether 00:15:5d:ec:9c:9b检查 FlexNet/home/synopsys/scl/2018.06/linux64/bin/lmhostid-ether|grep-o00155dec9c9b应输出00155dec9c9bbond0保持DOWN是正常的它不需要 IP也不需要 slave只用于给 FlexNet 提供固定 HostID。5. 配置 Synopsys License 服务下面给出合并后的最终配置。我的实际环境中也可以通过多个 systemd drop-in 实现相同效果。sudotee/etc/systemd/system/synopsys-license.service/dev/nullEOF [Unit] DescriptionSynopsys License Server Requiressynopsys-hostid.service wsl-mirrored-loopback-fix.service Afternetwork-online.target synopsys-hostid.service wsl-mirrored-loopback-fix.service Wantsnetwork-online.target [Service] Typeforking Usersnpslic Groupsnpslic WorkingDirectory/home/synopsys/scl/2018.06/admin/license ExecStart/home/synopsys/scl/2018.06/linux64/bin/lmgrd -c /home/synopsys/scl/2018.06/admin/license/Synopsys.dat Restarton-failure RestartSec3 [Install] WantedBymulti-user.target EOF重新加载并启动sudosystemctl daemon-reloadsudosystemctlenablesynopsys-license.servicesudosystemctl restart synopsys-license.servicesleep3查看进程ps-eouser,pid,ppid,cmd|grep-E[l]mgrd|[s]npslmdlmgrd和snpslmd都应由snpslic运行。检查 License 时使用主机名不要使用localhost/home/synopsys/scl/2018.06/linux64/bin/lmstat\-a-c27000LAPTOP-CEUP9426|head-n15正常输出LAPTOP-CEUP9426: license server UP (MASTER) snpslmd: UP环境变量也建议使用exportSNPSLMD_LICENSE_FILE27000LAPTOP-CEUP9426不建议使用27000localhost因为普通用户的127.0.0.1要继续保留给 Mirrored 模式访问 Windows。6. 验证 Mirrored 网络没有被破坏检查 Windows localhost 代理路径iproute get127.0.0.1\ipproto tcp\dport7890\uid$(id-u)应包含dev loopback0 table 127真实连接测试python3 -PY import socket try: sock socket.create_connection((127.0.0.1, 7890), timeout3) print(Mirrored Windows localhost: SUCCESS) sock.close() except OSError as exc: print(Mirrored Windows localhost: FAILED:, repr(exc)) PY代理测试curl-I\-xhttp://127.0.0.1:7890\--max-time15\https://www.google.com正常结果HTTP/1.1 200 Connection established HTTP/2 200检查默认网络iproute get8.8.8.8iproute show default应走实际网络接口例如dev eth10不应走bond0。检查 bond0 不参与实际通信ip-braddr show bond0iproute show dev bond0cat/proc/net/bonding/bond0理想状态bond0为DOWN没有 IPv4/IPv6 地址没有路由没有 slaveMAC 为00:15:5d:ec:9c:9b这说明它只负责提供 HostID不会影响 Mirrored 网络。最终结果冷启动后同时满足synopsys-hostid.service active (exited) wsl-mirrored-loopback-fix active (exited) synopsys-license.service active (running) snpslmd: UP Mirrored Windows localhost: SUCCESS HTTP/2 200最终网络关系如下blackheart ├─ Windows localhost 代理 → loopback0 / table 127 └─ 默认网络 → eth10 等实际接口 snpslic └─ FlexNet localhost 自连接 → WSL lo bond0 └─ 固定 MAC仅提供 FlexNet HostID踩坑总结不要全局强制127.0.0.0/8走 WSL lo虽然能修复 FlexNet但会破坏 Mirrored 模式下的 Windows localhost 访问。应使用uidrange只处理 License 服务用户这样普通用户仍然可以访问 Windows 的127.0.0.1:7890。不要依赖 WSL 虚拟网卡的随机 MACWSL 更新或重启后接口和 MAC 都可能变化应单独创建固定 MAC 的 bond 接口。不要把复杂启动命令直接塞进/etc/wsl.confwsl.conf只负责启用 systemd具体初始化工作交给 systemd oneshot 服务更稳定也更容易排查日志。检查 License 时使用主机名而不是 localhost推荐使用27000LAPTOP-CEUP9426bond0为 DOWN 并不是故障只要lmhostid -ether能识别目标 HostID它就已经完成任务。