本文介绍如何在局域网内从另一台 Ubuntu 远程访问 Windows 11 的 WSL2,并解决 WSL2 IP 动态变化导致的端口转发失效问题。
1. 确认 WSL2 的 SSH 服务
在 Win11 中打开 WSL2(Ubuntu),执行:
bash
sudo service ssh status
如果显示:
* sshd is running
说明 SSH 服务已启动。
如果未启动,请执行:
bash
sudo service ssh start
然后检查端口是否监听:
bash
sudo netstat -tlnp | grep ssh
输出示例:
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 6792/sshd
tcp6 0 0 :::22 :::* LISTEN 6792/sshd
表示 SSH 服务在 WSL2 正常运行。
2. 获取 WSL2 的 IP 地址
执行:
bash
ip addr show eth0
输出示例:
inet 172.28.145.147/20 brd 172.28.159.255 scope global eth0
这里 172.28.145.147 即为 WSL2 的当前 IP。
⚠️ 注意:WSL2 IP 每次重启可能变化,不能固定。
3. 测试从 Win11 本机 SSH 到 WSL2
在 Win11 CMD 中执行:
cmd
ssh name@172.28.145.147
如果能登录,说明 WSL2 SSH 正常。
4. 配置 Win11 端口转发,供外部 Ubuntu 访问
由于 WSL2 位于 NAT 内部,外部 Ubuntu 需要访问 Win11 的 LAN IP 并通过端口转发访问 WSL2。
假设 Win11 局域网 IP 为 192.168.0.51,WSL2 IP 为 172.28.145.147。
4.1 添加端口转发
以 管理员权限打开 PowerShell,执行:
powershell
netsh interface portproxy add v4tov4 `
listenport=2222 listenaddress=0.0.0.0 `
connectport=22 connectaddress=172.28.145.147
4.2 开放防火墙端口
powershell
New-NetFirewallRule -DisplayName "WSL2 SSH" -Direction Inbound -Protocol TCP -LocalPort 2222 -Action Allow
4.3 验证端口转发规则
powershell
netsh interface portproxy show all
输出示例:
Listen on ipv4: Connect to ipv4:
Address Port Address Port
--------------- ---------- ------------------ ----------
0.0.0.0 2222 172.28.145.147 22
5. 从 Ubuntu 外部 SSH 访问 WSL2
在 Ubuntu 上执行:
bash
ssh name@192.168.x.xxx -p 2222
成功登录即表示远程访问配置完成。
6. 解决 WSL2 IP 动态变化问题(自动更新端口转发)
6.1 创建自动更新脚本
在 Win11 中创建文件 C:\wsl_portproxy.ps1,内容如下:
powershell
# 获取 WSL2 当前 IP
$wsl_ip = wsl.exe hostname -I
$wsl_ip = $wsl_ip.Trim()
# 删除旧规则
netsh interface portproxy delete v4tov4 listenport=2222 listenaddress=0.0.0.0
# 添加新规则
netsh interface portproxy add v4tov4 listenport=2222 listenaddress=0.0.0.0 connectport=22 connectaddress=$wsl_ip
Write-Host "WSL2 SSH portproxy updated to $wsl_ip"
6.2 允许 PowerShell 脚本执行
以管理员 PowerShell 执行:
powershell
Set-ExecutionPolicy -Scope CurrentUser -ExecutionPolicy RemoteSigned
6.3 创建开机自动任务
在管理员 PowerShell 中执行:
powershell
schtasks /create /sc onlogon /tn "UpdateWSL2Proxy" /tr "powershell.exe -NoProfile -ExecutionPolicy Bypass -File C:\wsl_portproxy.ps1" /RL HIGHEST /F
6.4 验证任务创建成功
powershell
schtasks /query | findstr UpdateWSL2Proxy
7. 最终效果
- 每次 Win11 登录时,自动更新 WSL2 的端口转发。
- 外部 Ubuntu 永远可通过:
bash
ssh name@192.168.x.xxx -p 2222
- 无需手动修改 WSL2 IP 或 portproxy。
8. 拓展(可选)
如果 WSL2 中有其他服务(Flask、TensorBoard、ROS 等),可在 C:\wsl_portproxy.ps1 中添加更多端口转发,例如:
powershell
# Flask 默认 5000
netsh interface portproxy add v4tov4 listenport=5000 listenaddress=0.0.0.0 connectport=5000 connectaddress=$wsl_ip
# TensorBoard 默认 6006
netsh interface portproxy add v4tov4 listenport=6006 listenaddress=0.0.0.0 connectport=6006 connectaddress=$wsl_ip
这样就可以一键访问所有常用服务。