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 连接到该网络。
5: eth0: <广播、多播、UP、LOWER_UP> mtu 1500 qdisc mq 状态 UP 组默认 qlen 1000 inet 172.27.5.124/20 brd 172.27.15.255 范围全局 eth0
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)
我的困惑来自 WSL-2 的防火墙问题。
我发现的是:
localhost:<port>
netstat interface portproxy
或其他 portforward 工具使用 WSL 实例的 ip 地址提供。防火墙仅通过列出端口就不允许访问 WSL 端口。我必须iphlpsv
在我的防火墙规则中特别选择服务(IP Helper 服务)以允许流量通过 WSL 实例。