如何为WSL2配置静态IP以实现局域网内稳定访问其服务?
如何为WSL2配置静态IP以实现局域网内稳定访问其服务?
兄弟,太懂你这种每次重启WSL2就得重新改端口映射的崩溃感了!WSL2默认用的NAT网络确实坑,IP每次重启都抽风变,但咱有俩靠谱的法子能解决,让你局域网访问WSL服务再也不用折腾IP的事儿。
方法一:用启动脚本固定NAT网段内的静态IP
这个方法不用改WSL的网络模式,靠脚本每次启动时自动给WSL设固定IP,适合不想折腾网桥的朋友。
- 在WSL2里创建静态IP配置脚本
打开WSL的终端,创建一个脚本文件:
sudo nano /etc/init.d/static-ip.sh
把下面的内容粘进去(可以根据自己的需求调整静态IP的最后一段,比如改成101、102都行):
#!/bin/bash # 自动获取WSL默认网关 GATEWAY=$(ip route | grep default | awk '{print $3}') # 设置固定静态IP(和网关同网段,最后一段设为100) STATIC_IP=$(echo $GATEWAY | awk -F '.' '{print $1"."$2"."$3".100"}') # 清空旧的网络配置,设置新IP和路由 ip addr flush dev eth0 ip addr add $STATIC_IP/20 broadcast + dev eth0 ip route add default via $GATEWAY dev eth0 # 保留主机的DNS配置(避免WSL上网出问题) echo "nameserver $(cat /etc/resolv.conf.bak | grep nameserver | head -n1 | awk '{print $2}')" > /etc/resolv.conf
保存退出后,给脚本加执行权限:
sudo chmod +x /etc/init.d/static-ip.sh
- 让WSL启动时自动运行脚本
创建或修改/etc/wsl.conf文件:
sudo nano /etc/wsl.conf
添加以下内容:
[network] generateResolvConf = false # 禁止自动生成DNS配置 [boot] command = /etc/init.d/static-ip.sh # 启动时执行静态IP脚本
保存退出后,先备份当前的DNS配置(避免后续上网出问题):
sudo cp /etc/resolv.conf /etc/resolv.conf.bak
- 在Windows上设置永久端口转发
打开PowerShell(管理员权限),比如要把Windows的80端口转发到WSL的80端口,运行:
netsh interface portproxy add v4tov4 listenport=80 listenaddress=0.0.0.0 connectport=80 connectaddress=172.21.32.100
(这里的172.21.32.100就是你刚才脚本里设置的静态IP,要对应上)
最后别忘了允许这个端口通过Windows防火墙:
New-NetFirewallRule -DisplayName "WSL2 HTTP服务" -Direction Inbound -LocalPort 80 -Protocol TCP -Action Allow
这样以后重启WSL2,IP都会固定成你设的那个,端口转发规则也不用再改了。
方法二:改用网桥模式(Windows 11 22H2+适用)
这个方法更彻底,让WSL2直接接入你的局域网,获取和主机同网段的IP,局域网设备可以直接用这个IP访问服务,连端口转发都省了。
准备物理网卡
打开Windows的「控制面板」→「网络和共享中心」→「更改适配器设置」,找到你的物理网卡(比如「以太网」或「Wi-Fi」),右键→「属性」,确保「Microsoft 网络适配器多路传送器协议」已勾选(没安装的话点「安装」→「协议」→「添加」找到它)。配置WSL的网桥模式
先关掉所有WSL实例:
wsl --shutdown
然后打开文件资源管理器,进入C:\Users\你的用户名,创建或编辑.wslconfig文件,添加以下内容:
[wsl2] networkingMode=bridged vmSwitch=你的物理网卡名称 # 比如填「以太网」或「Wi-Fi」,要和适配器里的名称完全一致
- 重启WSL并固定IP
启动WSL2后,用ip a命令查看它的IP,这个IP是局域网网段的。你可以去路由器后台给这个IP设置静态DHCP绑定,这样以后WSL重启IP也不会变了。
小提醒
- 用网桥模式的话,WSL2的网络和主机是独立的,如果你遇到上网问题,可以在WSL里手动设置DNS,比如
echo "nameserver 8.8.8.8" > /etc/resolv.conf。 - 脚本方法如果遇到Windows更新WSL后失效,重新检查一下脚本的权限和
wsl.conf的配置就行。
备注:内容来源于stack exchange,提问作者MadHatter




