局域网内的其他电脑通过 SSH 连接到你 Windows 11 上的 WSL (Ubuntu),这个需求非常实用。这比默认的本机连接要复杂一些,因为涉及到**端口转发**和**防火墙设置**。
整个过程可以分为三个主要步骤:
- 在 WSL (Ubuntu) 中配置和运行 SSH 服务。
- 在 Windows 中设置端口转发,将外部请求转发到 WSL。
- 在 Windows 防火墙中添加入站规则,允许外部访问。
下面是详细的操作指南。
第1步:在 WSL (Ubuntu) 中配置和运行 SSH
这一步和之前我们讨论的类似,但要确保配置能接受外部连接。
-
安装 OpenSSH Server
如果你的 WSL 中还没有安装 SSH 服务,先安装它。打开 WSL 终端:sudo apt update sudo apt install openssh-server
-
配置 SSH 服务
编辑 SSH 配置文件,确保它允许密码登录并且监听在正确的端口。sudo nano /etc/ssh/sshd_config
在编辑器中,找到并确认(或修改)以下几行:
# 确保监听在所有网络接口上,这是默认值,通常不用改 # ListenAddress 0.0.0.0 # 你可以自定义端口,也可以使用默认的 22 端口。这里以 22 为例。 # 如果你想用其他端口,比如 2222,就写 Port 2222 Port 22 # 为了方便,先允许密码登录 PasswordAuthentication yes # (可选)如果你不想每次都输入 sudo 启动服务,可以修改此项 # UsePrivilegeSeparation no # 设为 no 可能降低安全性,但能避免一些权限问题
按
Ctrl + X
,然后按Y
和Enter
保存并退出。 -
启动 SSH 服务
sudo service ssh start
你可以检查一下状态,确保它正在运行:
sudo service ssh status
如果看到
* sshd is running
或Active: active (running)
就表示成功了。 -
获取 WSL 的 IP 地址
这个 IP 地址后面会用到。在 WSL 终端中运行:ip a | grep "inet .* scope global"
你会看到类似
inet 172.21.123.45/20 ...
这样的输出,记下这个 IP 地址(例如172.21.123.45
)。
第2步:在 Windows 中设置端口转发
这是最关键的一步。WSL2 运行在一个虚拟网络中,局域网内的其他电脑无法直接访问到 WSL 的 IP。我们需要在 Windows 主机上创建一个端口转发规则,将发往 Windows 主机某个端口的流量,转发给 WSL 的 SSH 端口。
-
以管理员身份打开 PowerShell
- 在开始菜单上右键点击,选择 “终端 (管理员)” 或 “Windows PowerShell (管理员)”。
-
执行端口转发命令
我们将使用netsh
命令来创建转发规则。命令的格式是:
netsh interface portproxy add v4tov4 listenport=<Win端口> listenaddress=<WinIP> connectport=<WSL端口> connectaddress=<WSL-IP>
listenport
: 你希望局域网其他电脑访问的 Windows 端口(例如2222
)。listenaddress
: 你的 Windows 主机在局域网中的 IP 地址。你可以在 PowerShell 中用ipconfig
命令找到它(通常是192.168.x.x
)。为了方便,也可以用0.0.0.0
表示监听所有网络接口。connectport
: 你在 WSL 中配置的 SSH 端口(例如22
)。connectaddress
: 你在第1步中获取到的 WSL 的 IP 地址(例如172.21.123.45
)。
示例命令:
假设你的 Windows IP 是192.168.1.100
,WSL IP 是172.21.123.45
,你希望局域网其他电脑通过访问192.168.1.100
的2222
端口来连接 WSL 的22
端口。netsh interface portproxy add v4tov4 listenport=2222 listenaddress=0.0.0.0 connectport=22 connectaddress=172.21.123.45
执行后,如果没有任何错误信息,就表示规则添加成功。
-
查看已有的转发规则 (可选)
netsh interface portproxy show all
重要提示:WSL2 的 IP 地址在重启后可能会改变。如果重启后发现无法连接,你需要重新获取 WSL 的 IP,并更新这条端口转发规则。可以先删除旧规则再添加新规则:
# 删除旧规则
netsh interface portproxy delete v4tov4 listenport=2222 listenaddress=0.0.0.0
# 添加新规则 (用新的 WSL IP)
netsh interface portproxy add v4tov4 listenport=2222 listenaddress=0.0.0.0 connectport=22 connectaddress=<新的WSL-IP>
(有自动化脚本可以解决这个问题,但我们先手动完成流程。)
第3步:在 Windows 防火墙中创建入站规则
现在,端口转发设置好了,但 Windows 防火墙默认会阻止外部设备访问 2222
端口。我们需要为它开一个“口子”。
-
以管理员身份打开 PowerShell (如果已打开则不用重复)
-
执行防火墙规则命令
我们将使用New-NetFirewallRule
命令。DisplayName
: 规则的名字,方便你识别。Direction
:Inbound
(入站)。Action
:Allow
(允许)。Protocol
:TCP
。LocalPort
: 你在端口转发中设置的 Windows 监听端口(例如2222
)。
示例命令:
New-NetFirewallRule -DisplayName "WSL2 SSH Access" -Direction Inbound -Action Allow -Protocol TCP -LocalPort 2222
执行成功后,防火墙规则就添加好了。
大功告成!现在进行测试
现在,从局域网内的另一台电脑上,打开终端或 SSH客户端,执行连接命令:
- SSH 用户名: 你在 WSL (Ubuntu) 中的用户名。
- IP 地址: 你的 Windows 主机在局域网的 IP 地址 (例如
192.168.1.100
)。 - 端口: 你在 Windows 上设置的监听端口 (例如
2222
)。
连接命令示例:
ssh your_wsl_username@192.168.1.100 -p 2222
首次连接时,会提示你确认服务器的指纹,输入 yes
。然后输入你在 WSL 中的用户密码,即可成功登录!
总结流程
- WSL 端:装好
openssh-server
,改好配置,启动服务,记下 IP。 - Windows 端 (管理员 PowerShell):用
netsh
命令创建端口转发,将WindowsIP:外部端口
转发到WSL-IP:SSH端口
。 - Windows 端 (管理员 PowerShell):用
New-NetFirewallRule
命令在防火墙上为外部端口
创建一个 TCP 入站允许规则。 - 其他电脑:使用
ssh <wsl用户名>@<windows主机IP> -p <外部端口>
进行连接。