WSL2 为 SSH 远程隧道创建远程端口的本地监听器

WSL2 为 SSH 远程隧道创建远程端口的本地监听器

我目前尝试在我的 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"

相关内容