WSL2 Ubuntu 20.04设置静态IP解决vhost需每日更新Windows hosts问题
WSL2 IP动态变化问题解决方案
为什么之前的操作不生效
WSL2的网络默认由Windows Hyper-V虚拟网卡管理,每次WSL重启时Hyper-V会重新分配子网及IP,Ubuntu内部的netplan配置无法覆盖Hyper-V的网络分配规则,所以执行sudo netplan apply会报错。
方案1:开启镜像网络模式(最优解,适用WSL 0.47.1及以上版本)
该模式下WSL2会直接共享Windows的网络栈,所有WSL内启动的服务都可以通过Windows的127.0.0.1/localhost直接访问,只需配置一次hosts即可永久生效:
- 按下
Win + R输入%USERPROFILE%打开Windows用户目录 - 在目录下新建名为
.wslconfig的文件(注意文件名开头带点),写入以下内容:
[wsl2] networkingMode=mirrored dnsTunneling=true firewall=true autoProxy=true
- 打开PowerShell执行
wsl --shutdown关闭WSL,重新启动后配置生效 - 在Windows的
C:\Windows\System32\drivers\etc\hosts文件中添加固定的vhost映射即可,示例:
127.0.0.1 site1.test 127.0.0.1 site2.test
方案2:PowerShell脚本自动同步IP到hosts(适用旧版WSL)
如果使用的是不支持镜像网络的旧版WSL,可以通过脚本自动完成IP更新操作:
- 新建后缀为
.ps1的PowerShell脚本,写入以下内容(按实际vhost域名修改替换规则):
# 获取WSL2 Ubuntu实例的IP $wslIp = wsl -d Ubuntu-20.04 hostname -I | ForEach-Object { $_.Trim() } # hosts文件路径 $hostsPath = "C:\Windows\System32\drivers\etc\hosts" # 替换hosts中对应域名的IP (Get-Content $hostsPath) -replace "^\d+\.\d+\.\d+\.\d+ site1.test", "$wslIp site1.test" -replace "^\d+\.\d+\.\d+\.\d+ site2.test", "$wslIp site2.test" | Set-Content $hostsPath
- 手动测试:右键点击脚本选择「使用PowerShell运行」,授予管理员权限后查看hosts是否已经更新为当前WSL的IP
- 设置开机自动运行:
- 打开Windows任务计划程序,创建新任务
- 「常规」选项卡勾选「使用最高权限运行」
- 「触发器」选项卡新建触发条件,选择「登录时」
- 「操作」选项卡新建操作,程序选
powershell.exe,添加参数输入-ExecutionPolicy Bypass -File "你的脚本完整路径.ps1" - 保存任务即可,后续每次开机都会自动更新hosts中的IP
内容的提问来源于stack exchange,提问作者Gunnar Polte
相关产品推荐
相关产品推荐

