如何从局域网内的Linux机器直接SSH连接WSL 2 Ubuntu系统?
看起来你已经迈出了端口转发的第一步,但连接卡住了,咱们一步步排查和解决问题:
1. 先确认WSL内部的SSH服务配置是否正确
首先登录到你的WSL Ubuntu系统里,检查SSH服务的监听地址:
sudo ss -tulpn | grep sshd
你需要看到sshd监听的是0.0.0.0:22(如果改了WSL内部SSH端口,就对应修改后的端口),而不是仅127.0.0.1:22。如果是后者,修改SSH配置文件:
sudo nano /etc/ssh/sshd_config
找到ListenAddress这一行,改成ListenAddress 0.0.0.0,然后重启SSH服务:
sudo systemctl restart sshd
2. 检查防火墙放行情况
(1)Windows主机的防火墙
你需要在Windows防火墙里放行4000端口的入站连接:
- 打开「Windows Defender 防火墙」→「高级设置」→「入站规则」→「新建规则」
- 选择「端口」→ 下一步,勾选「TCP」,填入特定本地端口
4000 - 下一步选择「允许连接」,然后按提示完成规则创建
(2)WSL Ubuntu的防火墙
如果Ubuntu里启用了ufw,需要放行SSH端口(默认22,改了端口就填对应值):
sudo ufw allow ssh # 若你修改了WSL内部SSH端口为自定义值,比如4000,就用: # sudo ufw allow 4000/tcp
3. 确认端口转发配置的有效性
你之前执行的netsh命令里,connectaddress是WSL的IP,但WSL的IP每次重启都会变化,这很可能是问题根源。先确认当前WSL的IP是否还是192.168.101.100:
在WSL里执行:
hostname -I
如果IP已变更,先删除旧规则再添加新规则(在Windows PowerShell中执行):
# 删除旧规则 netsh interface portproxy delete v4tov4 listenport=4000 listenaddress=0.0.0.0 # 添加新规则,把connectaddress换成新的WSL IP,connectport填WSL内部SSH监听端口(默认22) netsh interface portproxy add v4tov4 listenport=4000 listenaddress=0.0.0.0 connectport=22 connectaddress=新的WSL_IP
这里要注意:你之前填的connectport=4000大概率是错误的——WSL默认SSH服务监听22端口,端口转发要指向这个端口,而不是4000!
4. 修正SSH连接命令
你之前用的ssh -p 4000 windowsHost@windowsAdress存在问题:这里的用户名应该是WSL Ubuntu系统里的用户名,而非Windows主机的用户名。正确的命令格式是:
ssh -p 4000 你的WSL用户名@Windows主机的局域网IP
比如你的WSL用户叫ubuntu,Windows主机局域网IP是192.168.1.10,那命令就是:
ssh -p 4000 ubuntu@192.168.1.10
如果还是卡住,可先在Windows主机上测试端口转发是否生效:
Test-NetConnection -ComputerName localhost -Port 4000
如果显示TcpTestSucceeded: True,说明本地端口转发正常;若失败,回头检查前面的步骤是否有遗漏。
备注:内容来源于stack exchange,提问作者roi_saumon




