You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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即可永久生效:

  1. 按下Win + R输入%USERPROFILE%打开Windows用户目录
  2. 在目录下新建名为.wslconfig的文件(注意文件名开头带点),写入以下内容:
[wsl2]
networkingMode=mirrored
dnsTunneling=true
firewall=true
autoProxy=true
  1. 打开PowerShell执行wsl --shutdown关闭WSL,重新启动后配置生效
  2. 在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更新操作:

  1. 新建后缀为.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
  1. 手动测试:右键点击脚本选择「使用PowerShell运行」,授予管理员权限后查看hosts是否已经更新为当前WSL的IP
  2. 设置开机自动运行:
    • 打开Windows任务计划程序,创建新任务
    • 「常规」选项卡勾选「使用最高权限运行」
    • 「触发器」选项卡新建触发条件,选择「登录时」
    • 「操作」选项卡新建操作,程序选powershell.exe,添加参数输入-ExecutionPolicy Bypass -File "你的脚本完整路径.ps1"
    • 保存任务即可,后续每次开机都会自动更新hosts中的IP

内容的提问来源于stack exchange,提问作者Gunnar Polte

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 09:15:02