声明:本文档记录的方案已不再是作者当前在生产环境中使用的方案。本文仅作历史演进参考。
前言
在使用 WSL2 进行开发或部署服务时,默认的 NAT 模式往往会导致端口映射繁琐、IP 地址变动等问题。将 WSL2 配置为桥接模式(Bridged)并设置静态 IP,可以让 WSL2 像局域网内的一台独立物理机一样工作。
本文基于 Windows 11 + Debian 13 (Trixie) 环境,记录从网络打通到服务配置的完整流程,并重点解决了 systemd 未启动及虚拟交换机配置不生效等常见”坑点”。
环境准备
- 操作系统:Windows 11
- WSL 发行版:Debian 13 (Trixie)(安装于
D:\WSL\Debian) - 目标 IP:
- Windows 宿主机 (虚拟交换机):
192.168.86.21 - WSL2 Debian:
192.168.86.22
- Windows 宿主机 (虚拟交换机):
第一步:创建外部虚拟交换机
WSL2 的桥接模式依赖于 Hyper-V 的外部虚拟交换机。
- 打开 Hyper-V 管理器(若为家庭版系统,需先通过脚本开启 Hyper-V 功能)。
- 点击右侧的 “虚拟交换机管理器”。
- 选择 “新建虚拟网络交换机” -> “外部” -> “创建虚拟交换机”。
- 命名为
WSL_Bridge(名称需与后续配置文件一致),并在 “连接类型” 中选择你正在使用的物理网卡(如 Realtek PCIe GbE Family Controller)。 - 点击确定。此时你的物理网络可能会短暂断开,属正常现象。
第二步:配置 WSL2 全局网络参数
编辑 Windows 用户目录下的 .wslconfig 文件(路径通常为 C:\Users\<用户名>\.wslconfig),添加以下内容以启用桥接、IPv6,并禁用 WSL 自带的 DHCP:
[wsl2]
vmSwitch=WSL_Bridge
ipv6=true
networkingMode=Bridged
firewall=false
memory=10647240704
dhcp=false保存后,在 PowerShell 中执行 wsl --shutdown 重启 WSL 使配置生效。
第三步:启用 Systemd (关键步骤)
Debian 13 等现代发行版推荐使用 systemd-networkd 管理网络,但 WSL2 默认不使用 systemd 作为初始化系统。直接运行 systemctl 会报错:
System has not been booted with systemd as init system (PID 1). Can't operate.解决方法:
- 进入 WSL2,编辑
/etc/wsl.conf:
sudo vim /etc/wsl.conf添加以下配置:
[boot]
systemd=true- 在 PowerShell 中再次执行
wsl --shutdown,然后重新进入 WSL2。 - 验证:执行
ps -p 1 -o comm=,若输出systemd则说明成功。
第四步:配置 WSL2 静态 IP 与 IPv6
启用 systemd 后,即可使用 systemd-networkd 配置网络。
创建网络配置文件:
sudo vim /etc/systemd/network/10-static-eth0.network写入以下内容(根据你的实际网关修改 Gateway):
[Match]
Name=eth0
[Network]
Address=192.168.86.22/24
Gateway=192.168.86.1
IPv6AcceptRA=yes
DHCP=no启用并重启网络服务:
sudo systemctl enable systemd-networkd
sudo systemctl restart systemd-networkd验证:执行 ip a,确认 eth0 已获取 192.168.86.22 及 IPv6 地址。
配置 DNS:手工维护 /etc/resolv.conf
WSL2 默认没有 systemd-resolved,systemd-networkd 的 DNS= 配置不会生效,需要手工维护 /etc/resolv.conf。同时需在 /etc/wsl.conf 的 [network] 段设置 generateResolvConf = false(见第六步),否则 WSL 每次启动会覆盖该文件。
手工写入 DNS:
sudo tee /etc/resolv.conf << 'EOF'
nameserver 223.5.5.5
nameserver 114.114.114.114
nameserver 8.8.8.8
EOF验证解析:
nslookup baidu.com彻底解决办法
静态 IP 与 Hyper-V 下发的动态 IP 并存,虽然静态地址仍为主地址,但双地址共存可能带来路由冲突、网络不稳定,或某些场景下的连接问题。彻底解决需在 .wslconfig 中禁用 WSL 自带的 DHCP。
在 .wslconfig 中添加 dhcp=false
编辑 Windows 用户目录下的 .wslconfig,在 [wsl2] 段加入 dhcp=false(见第二步):
[wsl2]
vmSwitch=WSL_Bridge
ipv6=true
networkingMode=Bridged
firewall=false
dhcp=false修改后重启 WSL 使配置生效:
wsl --shutdown重新进入 WSL2 后执行 ip a,确认 eth0 上仅保留静态地址 192.168.86.22,动态地址不再出现。
第五步:配置 Windows 宿主机静态 IP (避坑指南)
为了让宿主机和 WSL2 在同一网段通信,需要给虚拟交换机对应的适配器设置静态 IP。
- 打开 Windows “网络连接” 面板 (
ncpa.cpl)。 - 找到名为 “vEthernet (WSL_Bridge)” 的适配器。
- 右键 -> 属性 -> 双击 “Internet 协议版本 4 (TCP/IPv4)”。
- 手动设置 IP 为
192.168.86.21,子网掩码255.255.255.0,网关留空或指向主路由。
第六步:配置主机名并禁用 hosts 自动同步
WSL2 默认每次启动都会根据 hostname 自动生成并覆盖 /etc/hosts,导致桥接模式下自定义的解析记录被重置。可以通过 /etc/wsl.conf 禁用该行为并自定义主机名。
进入 WSL2,编辑 /etc/wsl.conf:
sudo vim /etc/wsl.conf添加以下内容(hostname 仅支持字母、数字和横杠):
[network]
hostname = HyQAQ-WSL
generateHosts = false
generateResolvConf = falsehostname:自定义主机名,替换为你想要的名称generateHosts:false表示禁用 WSL 自动同步/覆盖/etc/hosts,之后可以手动维护/etc/hosts中的解析记录generateResolvConf:false表示禁用 WSL 自动生成/etc/resolv.conf,配合第四步手工维护 DNS
保存后在 PowerShell 中执行 wsl --shutdown,重新进入 WSL2 后执行 hostname 验证新主机名已生效。
第七步:配置 Windows 宿主机 OpenSSH
桥接模式下,WSL2 与宿主机处于同一网段,可通过 OpenSSH 从外部直接 SSH 登录 Windows 宿主机。
在 PowerShell(管理员)中安装 OpenSSH Server:
Add-WindowsCapability -Online -Name OpenSSH.Server~~~~0.0.1.0启动服务并设为开机自启:
Start-Service sshd
Set-Service -Name sshd -StartupType Automatic验证服务状态与防火墙规则(安装时通常已自动放行 22 端口):
Get-Service sshd
Get-NetFirewallRule -Name *OpenSSH*测试从局域网内其他机器 SSH 登录宿主机:
ssh 用户名@192.168.86.21配置默认 shell 为 PowerShell
Windows OpenSSH 默认使用的 shell 是 cmd.exe,SSH 登录后直接是命令行窗口。可以通过注册表将默认 shell 改为 PowerShell。
New-ItemProperty -Path "HKLM:\SOFTWARE\OpenSSH" -Name DefaultShell -Value "C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe" -PropertyType String -Force重启 sshd 服务后生效:
Restart-Service sshd第八步:WSL2 开机自启动
方式一:任务计划程序(推荐)
以管理员身份打开”任务计划程序”,创建基本任务:
- 触发器:计算机启动时(或”登录时”)
- 操作:启动程序
wsl.exe,参数-d Debian -u root - 勾选”使用最高权限运行”
或使用命令行直接创建:
schtasks /Create /TN "WSL2_Startup" /TR "wsl.exe -d Debian -u root" /SC ONSTART /RU SYSTEM /RL HIGHEST方式二:启动文件夹快捷方式
按 Win + R 输入 shell:startup 打开启动文件夹,创建一个指向 wsl.exe 的快捷方式,目标设为:
wsl.exe -d Debian -u root验证测试
完成上述所有步骤后,进行双向测试:
- WSL2 内 ping 宿主机:
ping 192.168.86.21- Windows PowerShell ping WSL2:
ping 192.168.86.22- IPv6 测试(需在 WSL2 内测试):
ping ipv6.baidu.com如果全部通畅,恭喜你,你的 WSL2 现在已经是一台完美的局域网独立服务器了!
结尾
至此,WSL2 已成功配置为桥接模式并获得了静态 IP 与 IPv6 地址。相比默认的 NAT 模式,桥接模式下的 WSL2 不再需要繁琐的端口映射,能够以独立主机的身份直接对外提供服务,非常适合作为局域网内的开发或部署环境。
分享文章
生成精美分享图或复制链接,与更多人分享本文。
继续阅读
最后更新于 ,距今已过 85 天
部分内容可能已过时