外部访问 Windows WSL 交互式 Shell 全流程
1. 前提说明
- 目标环境:Windows 服务器,运行 WSL2(默认使用 NAT 网络,WSL 有独立虚拟 IP)。
- 需求:从外部计算机远程 SSH 访问 WSL Shell。
- 关键点:
- WSL2 的 IP 通常是内网 NAT 地址,不直接暴露。
- 需通过宿主机做端口转发并开放防火墙端口。
- 配置 WSL 内 SSH 服务并允许登录。
2. WSL 内配置 SSH 服务
openssh 服务
sudo apt update
sudo apt install openssh-server
sudo service ssh start
检查 SSH 服务状态
sudo service ssh status
创建用户
useradd -m <username> # 创建用户并创建home目录
passwd <username> # 给新用户设置密码
如果需要root远程,需要配置sshd_config
编辑配置
sudo nano /etc/ssh/sshd_config
修改或添加以下行:
PermitRootLogin yes
PasswordAuthentication yes
设置 root 密码
sudo passwd root
重启 SSH 服务:
sudo service ssh restart
3. Windows 宿主机端口转发
获取 WSL IP 地址
wsl
操作
ip addr | grep eth0
# inet 172.18.100.193/20
window
操作
- 绑定到宿主机 2222 端口 为例
- WSL_IP 对应上面获取的 ip
netsh interface portproxy add v4tov4 listenport=2222 connectaddress=<WSL_IP> connectport=22
宿主机放行防火墙端口
New-NetFirewallRule -DisplayName "Allow WSL SSH" -Direction Inbound -LocalPort 2222 -Protocol TCP -Action Allow
之后便可以远程到目标主机上的 WSL
ssh <wsl用户名>@<宿主机IP> -p 2222
4. 常见故障排查
端口无法访问
宿主机确认端口监听:
netstat -ano | findstr 2222
netsh interface portproxy show all
确认 WSL SSH 服务正常运行:
sudo service ssh status
ping 不通宿主机
Windows 默认禁用 ICMP 请求,ping 不通不代表 TCP 端口不可用。
直接用端口测试命令确认连通性:
Linux/macOS:
nc -zv <宿主机IP> 2222
Windows PowerShell:
Test-NetConnection -ComputerName <宿主机IP> -Port 2222
WSL IP 每次重启可能变化,每次重启 WSL 需要重新执行端口转发命令。