WSL的网络配置

参考的官方文档:使用WSL访问网络应用程序

按下Win键搜索WSL Settings,可以发现其中的网络模式有:

  • Nat: 默认的网络地址转换模式,WSL IP地址与Windows主机地址相互隔离
  • Mirrored: 镜像模式。开启后WSL和Windows共享网络配置,包括IP地址、系统代理(梯子)
  • VirtioProxy:

我的目标是使用移动设备(手机)通过IP+端口访问WSL上开启的网络服务。但是在Mirrored模式下没有成功。

  • 如何开启镜像模式(Mirrored):资源管理器中搜%UserProfile%,在该文件夹下创建.wslconfig,添加如下内容:

    1
    2
    [wsl2]
    networkingMode=mirrored

下面先考虑Windows与WSL在Mirrored模式下的通信。

镜像模式下Windows与WSL 进行http 通信

Windows作为服务端

  • 在当前文件加下建立简单的网页:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    <!DOCTYPE html>
    <html>
    <head>
    <title>WSL 镜像模式测试</title>
    <meta name="viewport" content="width=device-width, initial-scale=1">
    </head>
    <body>
    <h1>🎉 成功从手机访问 WSL!</h1>
    <p>这证明镜像模式工作正常</p>
    <p>WSL IP: <span id="ip"></span></p>
    <p>访问时间: <span id="time"></span></p>
    <script>
    document.getElementById('ip').textContent = location.hostname;
    document.getElementById('time').textContent = new Date().toLocaleString();
    </script>
    </body>
    </html>
  • 在当前目录下运行下面的python程序:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17

    import http.server
    import socketserver

    PORT = 8080

    class Handler(http.server.SimpleHTTPRequestHandler):
    def log_message(self, format, *args):
    print(f"{self.client_address[0]} - {format % args}")

    with socketserver.TCPServer(("", PORT), Handler) as httpd:
    print(f"🚀 服务器运行在端口 {PORT}")
    print("🌐 尝试通过以下地址访问:")
    print(" http://localhost:8080")
    print(" http://127.0.0.1:8080")
    print(" http://192.168.43.4:8080")
    httpd.serve_forever()

其中192.168.43.4应替换为Windows的IP地址(可通过ipconfig /all查看),WSL 开启了镜像模式,则它也是WSL的IP地址,那么我们能否在WSL中通过访问该IP地址来访问Windows上开启的服务呢?

在WSL中尝试通过curl来依次访问python代码中列出的地址,发现最后一个访问失败,不能通过IP地址访问Windows上服务。

WSL做服务器

同样,让WSL运行上面python程序,在Windows上通过curl命令或浏览器访问上述地址,发现也是只有最后一个访问失败。


NAT模式下Windows与WSL进行通信

阅读官方的使用WSL访问网络应用程序教程可知,NAT模式下WSL地址与Windows主机地址隔离,可通过如下方式获取WSL的IP地址:

  • Windows:

    1. wsl.exe --distribution <DistroName> hostname -i
      但是我运行该命令得到的是127.0.1.1,WSL中运行cat /etc/hosts可得到解释,结果中有127.0.1.1 LAPTOP-EUO3BP5M.localdomain LAPTOP-EUO3BP5M
    2. wsl hostname -I可以得到WSL的IP地址:172.20.84.77
  • WSL:

    1. ip route show | grep -i default | awk '{ print $3}'
    2. ifconfig

Windows作为服务器

WSL可通过http://<Windows-IP>:port访问Windows上的服务

WSL作为服务端

Windows访问

Windows可通过http://localhost:8080http://172.20.84.77:8080访问WSL上的服务

移动设备访问

在WSL的NAT模式下,如果手机想访问WSL上的网络服务,需要使用 Netsh 接口 portproxy 这个 Windows 命令添加一个端口代理:让手机访问Windows的端口,转发到WSL的服务

1
netsh interface portproxy add v4tov4 listenport=<yourPortToForward> listenaddress=0.0.0.0 connectport=<yourPortToConnectToInWSL> connectaddress=(wsl hostname -I)

在我的例子中就是:

1
netsh interface portproxy add v4tov4 listenport=8080 listenaddress=0.0.0.0 connectport=8080 connectaddress=172.20.84.77

之后可能需要添加防火墙规则:Win+R输入control panel->系统和安全->防火墙->高级设置->入站规则->新建端口规则

defender-fule