Windows重定向端口转发请求到WSL2

WSL2网络与Windows隔离,在WSL内访问Windows内容需要直接指定IP,而从Windows访问WSL则可以通过本地回环地址(WSL2中自动配置Windows IP地址
但是如果WSL2中启动服务,由局域网中的别的设备访问,则需要重定向端口请求

如图,例如Windows在局域网中的地址是192.168.1.5,在WSL的虚拟网络中的地址是172.19.32.1,而WSL的地址是172.19.32.64

wsl172.19.32.xLAN192.168.1.xWindows172.19.32.1192.168.1.5WSL172.19.32.64Mobile192.168.1.10

很容易可以发现,这里有一个很重要的问题:如果 Mobile 直接访问192.168.1.5:80,响应他的是 Windows 的 80 端口,而非 WSL 的端口,因为 Mobile 和 WSL 在两个独立的网络中,因此不能直接访问

因此需要使用 Windows 做一个转发,当 Windows 收到访问 80 端口的请求,将其转发到127.0.0.1:80。由于WSL已经有了对于本地回环的映射,因此可以访问到WSL的服务

使用管理员权限运行下面的指令,即可设定一条转发规则
该规则重启后仍然生效,如果需要删除则需要将 add 改成 delete

netsh interface portproxy add v4tov4 listenport=80 connectaddress=127.0.0.1 connectport=80 listenaddress=* protocol=tcp

netsh interface portproxy delete v4tov4 listenport=80 protocol=tcp

可能存在的问题

经过个人测试,貌似开启后会导致 WSL2 的映射失效,无法通过127.0.0.1localhost访问WSL
猜测是该重定向指令会影响 LxssManager 服务的正常启动,WSL2 正确启动后再开启该重定向则不会出现问题
(如果不想重启,可以先删除重定向映射,再重启 LxssManager 服务)