WSL-2:自动转发哪些端口?

vri*_*ael 2 networking portforwarding windows-subsystem-for-linux wsl-2

我一直在修改 WSL-2 一段时间,但并不完全了解主机和 WSL-2 dist 之间的流量是如何路由的。

在某些来源中,似乎 WSL-2 使用的所有端口都会自动对主机可用。例如在Microsoft 的本教程中。同样,我设法托管了一个 Jupyter 实例,它可以通过localhost:8888.

但是,在尝试其他服务时,例如 ssh(也在非标准端口上尝试过),该端口不会通过 localhost 自动变为可用,我必须使用分配给我的 WSL 发行版的 IP 地址(来自wsl hostname -I

为了通过 localhost 提供服务,我发现了这个 portforwarding script,它有效。但我想了解为什么需要它。

为什么某些服务需要端口转发,而不是所有服务?

小智 38

当您运行 WSL-2 时,像虚拟机这样的机器会在您的 Windows 设备上运行。Windows 将创建一个与您的 LAN 相同的本地网络,并将 WLS-2 连接到该网络。

  • 在 WSL2 上,您可以运行ip a | grep eth0,结果如下:

5: eth0: <广播、多播、UP、LOWER_UP> mtu 1500 qdisc mq 状态 UP 组默认 qlen 1000 inet 172.27.5.124/20 brd 172.27.15.255 范围全局 eth0

  • 在 Windows 的终端(或 PowerShell)上运行ipconfig,在结果中查找,如下所示:
Ethernet adapter vEthernet (WSL):

   Connection-specific DNS Suffix  . :
   Link-local IPv6 Address . . . . . : fe80::1532:a8ea:6b34:8df2%73
   IPv4 Address. . . . . . . . . . . : 172.27.0.1
   Subnet Mask . . . . . . . . . . . : 255.255.240.0
   Default Gateway . . . . . . . . . :
Run Code Online (Sandbox Code Playgroud)

WSL-2 和 Windows 设备位于同一网络中,并且 WSL-2 未连接到您的 LAN。

我的解决方案(在 Windows 上使用端口转发)

在 Windows 上使用 Admin 打开终端,然后运行脚本:

netsh interface portproxy set v4tov4 listenport=8888 listenaddress=0.0.0.0 connectport=8888 connectaddress=$(wsl hostname -I)
Run Code Online (Sandbox Code Playgroud)


小智 6

遵循以下步骤帮助我在 Windows 上本地连接到我的端口:

  1. 使用此处的脚本并将端口更改为您需要转发的端口。将此文件保存到路径。
  2. 在 wsl 中,sudo apt install net-tools
  3. 在 powershell(管理员模式)中,type ".\script.ps1" | powershell.exe -c -. 这是运行该文件。右键单击该文件以“使用 powershell 运行”将不起作用。
  4. 要测试它是否有效,请在 powershell 中输入netsh interface portproxy show v4tov4


vri*_*ael 5

我的困惑来自 WSL-2 的防火墙问题。

我发现的是:

  • 可以从主机访问在 WSL-2 中侦听端口的服务,因为 localhost:<port>
  • 无法从主机外部访问 WSL-2 端口
  • WSL-2 端口可以通过netstat interface portproxy或其他 portforward 工具使用 WSL 实例的 ip 地址提供。

防火墙仅通过列出端口就不允许访问 WSL 端口。我必须iphlpsv在我的防火墙规则中特别选择服务(IP Helper 服务)以允许流量通过 WSL 实例。

  • 您能详细说明一下您是如何托管 Jupyter 实例的吗?我正在尝试通过 wsl.exe ssh 到 EC2 实例,我认为本文的阐述会有所帮助。 (2认同)