使用网络应用时需要注意一些注意事项,无论是通过 Windows 应用访问 Linux 网络应用还是通过 Linux 应用访问 Windows 网络应用,你可能都需要确定正在使用的虚拟机的 IP 地址,该地址将不同于本地物理计算机的 IP 地址。

从 Windows (localhost) 访问 Linux 网络应用

如果要在 Linux 分发版中构建网络应用(例如,在 NodeJSSQL Server 上运行的应用),可以使用 localhostWindows 应用(如 Microsoft EdgeChrome Internet 浏览器)访问它(就像往常一样)。
image.png

但是,如果运行的是较旧版本的 Windows(版本 18945 或更低版本),则需要获取 Linux 主机 VMIP 地址(或更新到最新的 Windows 版本)。

若要查找为 Linux 分发版提供支持的虚拟机的 IP 地址,请执行以下操作:

  • 在 WSL 分发版(即 Ubuntu)中运行以下命令:ip addr

    1. [root@dev workspace]# ip addr
    2. 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    3. link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    4. inet 127.0.0.1/8 scope host lo
    5. valid_lft forever preferred_lft forever
    6. inet6 ::1/128 scope host
    7. valid_lft forever preferred_lft forever
    8. 2: bond0: <BROADCAST,MULTICAST,MASTER> mtu 1500 qdisc noop state DOWN group default qlen 1000
    9. link/ether 52:ce:ea:4b:ae:2e brd ff:ff:ff:ff:ff:ff
    10. 3: dummy0: <BROADCAST,NOARP> mtu 1500 qdisc noop state DOWN group default qlen 1000
    11. link/ether 5e:9d:22:80:12:bb brd ff:ff:ff:ff:ff:ff
    12. 4: tunl0@NONE: <NOARP> mtu 1480 qdisc noop state DOWN group default qlen 1000
    13. link/ipip 0.0.0.0 brd 0.0.0.0
    14. 5: sit0@NONE: <NOARP> mtu 1480 qdisc noop state DOWN group default qlen 1000
    15. link/sit 0.0.0.0 brd 0.0.0.0
    16. 6: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
    17. link/ether 00:15:5d:62:66:f2 brd ff:ff:ff:ff:ff:ff
    18. inet 172.23.156.146/20 brd 172.23.159.255 scope global eth0
    19. valid_lft forever preferred_lft forever
    20. inet6 fe80::215:5dff:fe62:66f2/64 scope link
    21. valid_lft forever preferred_lft forever
  • 查找并复制 eth0接口的 inet值下的地址。

    1. [root@dev workspace]# ip addr |grep eth0
    2. 6: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
    3. inet 172.23.156.146/20 brd 172.23.159.255 scope global eth0
  • 如果已安装 grep 工具,请通过使用以下命令筛选输出来更轻松地查找此地址:ip addr | grep eth0

    1. [root@dev workspace]# ip addr |grep eth0
    2. 6: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
    3. inet 172.23.156.146/20 brd 172.23.159.255 scope global eth0
  • 使用此 IP 地址连接到 Linux 服务器。

下图显示了一个示例,该示例使用 Microsoft Edge 浏览器连接到 Node.js 服务器。
使用 WSL 访问网络应用程序 - 图2

从 Linux(主机 IP)访问 Windows 网络应用

如果要从 Linux 分发版(即 Ubuntu)访问 Windows 上运行的网络应用(例如,在 NodeJS 或 SQL 服务器上运行的应用),则需要使用主机的 IP 地址。 虽然这不是一种常见方案,但你可以执行以下步骤来使其可行。

  1. 通过在 Linux 分发版中运行以下命令来获取主机的 IP 地址:cat /etc/resolv.conf

    1. [root@dev workspace]# cat /etc/resolv.conf
    2. # This file was automatically generated by WSL. To stop automatic generation of this file, add the following entry to /etc/wsl.conf:
    3. # [network]
    4. # generateResolvConf = false
    5. nameserver 172.23.144.1
    6. [root@dev workspace]#
  2. 复制以下词语后面的 IP 地址:nameserver

    1. [root@dev workspace]# cat /etc/resolv.conf |grep nameserver
    2. nameserver 172.23.144.1
    3. [root@dev workspace]#
  3. 使用复制的 IP 地址连接到任何 Windows 服务器。

下图显示了一个示例,该示例说明如何通过 curl 连接到在 Windows 中运行的 Node.js 服务器。

  1. [root@dev workspace]# curl http://172.23.144.1

image.png
使用 WSL 访问网络应用程序 - 图4

通过远程 IP 地址进行连接

当使用远程 IP 地址连接到应用程序时,它们将被视为来自局域网 (LAN) 的连接。 这意味着你需要确保你的应用程序可以接受 LAN 连接。

例如,你可能需要将应用程序绑定到 0.0.0.0 而非 127.0.0.1。 以使用 FlaskPython 应用为例,可以通过以下命令执行此操作:app.run(host='0.0.0.0')。 进行这些更改时请注意安全性,因为这将允许来自你的 LAN 的连接。

从局域网 (LAN) 访问 WSL 2 分发版

当使用 WSL 1 分发版时,如果计算机设置为可供 LAN 访问,那么在WSL 中运行的应用程序也可供在LAN 中访问。

这不是 WSL 2 中的默认情况。 WSL 2 有一个带有其自己独一无二的 IP 地址的虚拟化以太网适配器。 目前,若要启用此工作流,你需要执行与常规虚拟机相同的步骤。 (我们正在寻找改善此体验的方法。)

下面是一个示例 PowerShell 命令,用于添加侦听主机上的端口 4000 的端口代理并将其连接到端口 4000,并使用 IP 地址 192.168.101.100 连接到 WSL 2 VM

  1. netsh interface portproxy add v4tov4 listenport=4000 listenaddress=0.0.0.0 connectport=4000 connectaddress=192.168.101.100

IPv6 访问

WSL2 分发版目前无法访问纯 IPv6 地址。 我们正在致力于添加此功能。

原文链接

https://docs.microsoft.com/zh-cn/windows/wsl/networking