在现代开发环境中,开发者通常会面临不同操作系统之间的协同工作。例如:
因此,我们需要配置端口转发解决方案,确保从 Mac 等设备可以无缝访问 WSL 上的服务,包括 SSH 和 HTTP 服务。
设备 | IP 地址 | 网络类型 | 访问关系 |
---|---|---|---|
Windows 宿主机 | 192.168.1.6 | 局域网 | 可直连 |
WSL Ubuntu | 172.22.192.1 | NAT 虚拟网络 | 仅宿主机可访问 |
Mac | 192.168.1.44 | 局域网 | 可直连宿主机 |
我们将使用 Windows 的 netsh 工具 来配置端口转发,确保可以从外部设备(如 Mac)访问 WSL 中的 SSH 服务和 HTTP 服务(如 8080 端口)。
首先,配置 WSL 的 SSH 服务访问,使 Mac 可以通过 SSH 连接到 WSL 环境。
# 以管理员身份运行 PowerShell
$wsl_ip = (wsl hostname -I).Trim()
# 配置 SSH 服务端口转发
netsh interface portproxy add v4tov4 `
listenaddress=192.168.1.6 `
listenport=5522 `
connectaddress=$wsl_ip `
connectport=22
这里的配置将 Windows 宿主机的 5522 端口转发到 WSL 上的 22 端口(SSH 服务)。你可以通过 Mac 使用 SSH 连接 Windows 的 5522 端口。
接下来,如果你希望 WSL 上的 8080 端口(通常是 Web 服务的端口)能够从 Mac 访问,则需要在 Windows 宿主机上配置另一个端口转发规则。
# 配置 HTTP 服务端口转发
netsh interface portproxy add v4tov4 `
listenaddress=192.168.1.6 `
listenport=8080 `
connectaddress=$wsl_ip `
connectport=8080
这样,Mac 就能够通过 192.168.1.6:8080 访问 WSL 上运行的 HTTP 服务(如一个 Web 应用)。
为了限制访问权限,我们将防火墙规则配置为只允许来自 Mac 的请求。
# 配置防火墙规则,限制 Mac IP 地址
New-NetFirewallRule -DisplayName "WSL SSH Proxy" `
-Direction Inbound `
-Action Allow `
-Protocol TCP `
-LocalPort 5522 `
-RemoteAddress 192.168.1.44 # 限制只允许 Mac 访问
New-NetFirewallRule -DisplayName "WSL HTTP Proxy" `
-Direction Inbound `
-Action Allow `
-Protocol TCP `
-LocalPort 8080 `
-RemoteAddress 192.168.1.44 # 限制只允许 Mac 访问
总结:通过以上配置,Windows 宿主机将 5522 端口转发到 WSL 的 SSH 服务(22 端口),同时将 8080 端口转发到 WSL 上的 HTTP 服务(8080 端口)。Mac 设备可以直接通过这两个端口访问 WSL 中的相应服务。
为了保证每次启动 Windows 时都能自动设置端口转发规则,可以将这些配置写入 PowerShell 脚本并添加到启动任务中。
将以下 PowerShell 脚本保存为 wsl_ssh_http_proxy.ps1
,路径可以设置为 C:\Scripts\wsl_ssh_http_proxy.ps1
:
$port_ssh = 5522
$port_http = 8080
$wsl_ip = (wsl hostname -I).Trim()
# 清除旧规则
netsh interface portproxy reset
# 配置 SSH 服务端口转发
netsh interface portproxy add v4tov4 `
listenaddress=0.0.0.0 `
listenport=$port_ssh `
connectaddress=$wsl_ip `
connectport=22
# 配置 HTTP 服务端口转发
netsh interface portproxy add v4tov4 `
listenaddress=0.0.0.0 `
listenport=$port_http `
connectaddress=$wsl_ip `
connectport=8080
# 设置防火墙规则
New-NetFirewallRule -DisplayName "WSL SSH Proxy" `
-Direction Inbound `
-Action Allow `
-Protocol TCP `
-LocalPort $port_ssh `
-RemoteAddress 192.168.1.44 # 限制只允许 Mac 访问
New-NetFirewallRule -DisplayName "WSL HTTP Proxy" `
-Direction Inbound `
-Action Allow `
-Protocol TCP `
-LocalPort $port_http `
-RemoteAddress 192.168.1.44 # 限制只允许 Mac 访问
powershell.exe -ExecutionPolicy Bypass -File C:\Scripts\wsl_ssh_http_proxy.ps1
在 WSL 内禁用密码认证,以增强 SSH 服务的安全性。
# 禁用密码认证
sudo sed -i 's/#PasswordAuthentication yes/PasswordAuthentication no/' /etc/ssh/sshd_config
sudo systemctl restart ssh
如果你运行的是 Web 服务,确保只允许信任的 IP 地址访问,或者在 WSL 内进行防火墙配置,限制访问权限。
为了更好地连接 WSL 环境,建议在 Mac 上配置 SSH 客户端,并指定对应的端口和身份验证文件。
# ~/.ssh/config
Host wsl-ssh
HostName 192.168.1.6
Port 5522
User ubuntu_user
IdentityFile ~/.ssh/wsl_key
ServerAliveInterval 60
TCPKeepAlive yes
Compression yes
如果你希望通过 SSH 隧道同时访问 SSH 服务和 HTTP 服务,使用以下命令:
# 创建持久化隧道,转发 SSH 和 HTTP 服务
autossh -M 0 -N -L 2222:localhost:5522 -L 8080:localhost:8080 [email protected]
# 连接时直接使用
ssh -p 2222 localhost
# 连通性测试
mtr -rwzc 10 192.168.1.6
# 端口扫描
nmap -sT -p 5522,8080 192.168.1.6
# 流量监控
tcpdump -i eth0 port 22 -w ssh_traffic.pcap
tcpdump -i eth0 port 8080 -w http_traffic.pcap
#!/bin/bash
ALERT_THRESHOLD=3
FAIL_COUNT=0
while true; do
# 检查 SSH 服务
if ! nc -z -w 3 192.168.1.
6 5522; then
((FAIL_COUNT++))
else
FAIL_COUNT=0
fi
# 检查 HTTP 服务
if ! nc -z -w 3 192.168.1.6 8080; then
((FAIL_COUNT++))
else
FAIL_COUNT=0
fi
if [ $FAIL_COUNT -ge $ALERT_THRESHOLD ]; then
echo "Warning: Service failure detected!"
fi
sleep 60
done
通过这种配置,您可以实现以下目标:
这些技术结合使得跨平台的开发环境更加流畅和安全,非常适用于在混合环境中开发与测试的需求。