我目前尝试在我的 Windows 系统和其上运行的 WSL2 实例之间创建 SSH 隧道。我的目标是在 Windows 上运行一个 Burp 代理,我可以从 Windows 本身以及 WSL 内部访问它。
理想情况下,此隧道应在 Windows 启动时建立,以便随时使用。此外,两个系统上的端口应相同,以便包含代理的明确值的脚本在两个环境中都能工作。
为此,我在 WSL 实例中启动了一个 sshd,并从我的 Windows 创建了一个远程隧道:
Start-Process ssh -ArgumentList "-i C:\Users\frank.ssh\id_ed25519 [email protected] -R8080:127.0.0.1:8080"
现在,理论上,我可以通过连接到 Windows 和 WSL 上的 127.0.0.1:8080 来访问 Burp 代理。
测试时,我遇到了无法解释的行为。如果启动隧道时 Burp Proxy 已在运行,则一切都会按预期运行。如果先创建隧道,则代理无法启动,因为端口已被使用。
玩了一会儿后,我注意到我的本地 Windows(通过 wslhost)将始终尝试在用于远程端的同一端口上创建本地侦听器。如果此操作失败(例如因为已经有一个侦听器),则不会出现任何不良情况。
在第一次尝试中,Burp Proxy 在建立隧道之前已经创建了监听器:
LocalAddress : 127.0.0.1
LocalPort : 8080
RemoteAddress : 0.0.0.0
RemotePort : 0
State : Listen
Process : BurpSuitePro
但是,当我再次尝试不运行 Burp Proxy 时,wslhost 打开了一个监听器:
LocalAddress : 127.0.0.1
LocalPort : 8080
RemoteAddress : 0.0.0.0
RemotePort : 0
State : Listen
Process : wslhost
在这两种情况下,Linux 端都是相同的,并且符合预期:
→ sudo netstat -tulpn
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 127.0.0.1:8080 0.0.0.0:* LISTEN 1003/sshd: frank@pt
tcp 0 0 127.0.0.53:53 0.0.0.0:* LISTEN 254/systemd-resolve
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 359/sshd: /usr/sbin
tcp6 0 0 ::1:8080 :::* LISTEN 1003/sshd: frank@pt
tcp6 0 0 :::22 :::* LISTEN 359/sshd: /usr/sbin
udp 0 0 127.0.0.53:53 0.0.0.0:* 254/systemd-resolve
为了查看 wslhost 是否使用本地端或远程端的端口值,我尝试使用不同的端口号:
-R5555:127.0.0.1:7777
这里linux端在5555上开启监听(预期)
→ sudo netstat -tulpn
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 127.0.0.1:5555 0.0.0.0:* LISTEN 1438/sshd: frank@pt
tcp 0 0 127.0.0.53:53 0.0.0.0:* LISTEN 254/systemd-resolve
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 359/sshd: /usr/sbin
tcp6 0 0 ::1:5555 :::* LISTEN 1438/sshd: frank@pt
tcp6 0 0 :::22 :::* LISTEN 359/sshd: /usr/sbin
udp 0 0 127.0.0.53:53 0.0.0.0:* 254/systemd-resolve
但是windows端如果5555端口可用的话也会打开wslhost监听(意外):
LocalAddress : 127.0.0.1
LocalPort : 5555
RemoteAddress : 0.0.0.0
RemotePort : 0
State : Listen
Process : wslhost
有没有办法阻止 wslhost 为远程端口创建本地侦听器?虽然启动 Burp Proxy 后手动创建隧道是一种解决方法,但我想在启动时自动建立隧道。
为什么首先要创建它?
我的环境:
Microsoft Windows [Version 10.0.19044.1766]
NAME STATE VERSION
* Ubuntu Running 2
Kernel version: 5.10.102.1-microsoft-standard-WSL2
PRETTY_NAME="Ubuntu 22.04 LTS"