wsl 2 设置静态 DNS 服务地址及 Linux 和 Windows 主机网络互相访问设置

编程基础 WSL2  收藏
0 / 1748

在升级到 wsl 2 后发现一些网络问题和之前的 wsl 不一样了,主要是 DNS 解析和 wsl 和 Windows 网络互访问题,这里介绍如何处理。

DNS 解析

wsl 2 使用的 DNS 解析服务器设置在文件:/etc/resolv.conf 内设置,这是一个 link 文件,真正的文件路径是:/run/resolvconf/resolv.conf,这个文件是每次 wsl 启动时自动生成的,内容如下:

# This file was automatically generated by WSL. To stop automatic generation of this file, add the following entry to /etc/wsl.conf:
# [network]
# generateResolvConf = false
nameserver 172.24.144.1

nameserver 后面的就是指定的 DNS 服务器地址。我发现有时候分配的服务器地址是无效的,如:127.0.0.53,使用 ping 来测试发现提示无法解析地址。需要设置一个固定的 DNS 地址,方法如下:

  • 新建文件:/etc/wsl.conf,内容如下:
    [network]
    generateResolvConf = false
    

以上配置好就不会自动创建 /run/resolvconf/resolv.conf 文件了。

退出 wsl,关机然后重新启动:

exit
wsl --shutdown
wsl

删除 link 文件:/etc/resolv.conf:

rm /etc/resolv.conf

然后新建 /etc/resolv.conf 文件,内容如下,可自定义 nameserver 地址:

nameserver 114.114.114.114

再次退出 wsl,关机然后重新启动:

exit
wsl --shutdown
wsl

查看 /etc/resolv.conf 文件是否是之前自定义的地址:

cat /etc/resolv.conf

测试网络服务:

ping niekun.net

参考链接:https://github.com/microsoft/WSL/issues/5256#issuecomment-666545999

网络访问配置

以前使用 wsl 时 Linux 子系统和 Windows 主机的网络好像是直接互通的,比如我在 Windows 下建立了一个 http 网页 http://127.0.0.1:6000,可以在 Linux 子系统下直接访问地址 http://127.0.0.1:6000,同理对于 Windows 主机访问 Linux 子系统的服务也是可以使用 localhost 直接访问的。

在升级到 wsl 2 后发现这一特性没有了,无法直接通过 localhost 地址来互通,查询官方说明关于wsl 2 访问网络服务 的方法可以实现访问,但是每次关机后 wsl 和 Windows 本地地址会发生变化不方便使用。

可以设置静态 IP 来固定地址。Windows 终端下执行下面命令:

在 wsl 下增加 IP 地址:192.168.50.16,名称为:eth0:1:(以 Ubuntu 系统为例)

wsl -d Ubuntu-20.04 -u root ip addr add 192.168.50.16/24 broadcast 192.168.50.255 dev eth0 label eth0:1

在 Windows 10 下增加一个 IP 地址:(此命令需要管理员权限执行)

netsh interface ip add address "vEthernet (WSL)" 192.168.50.88 255.255.255.0

执行后,在 wsl 下通过 IP:192.168.50.88 访问 Windows 服务。在 Windows 下通过 IP:192.168.50.16 访问 wsl 服务。

完成后再终端使用 ipconfig 查看设置:

Ethernet adapter vEthernet (WSL):

   Connection-specific DNS Suffix  . :
   Link-local IPv6 Address . . . . . : fe60::b525:6b90:8fb0:f513%58
   IPv4 Address. . . . . . . . . . . : 172.23.64.1
   Subnet Mask . . . . . . . . . . . : 255.255.240.0
   IPv4 Address. . . . . . . . . . . : 192.168.50.88
   Subnet Mask . . . . . . . . . . . : 255.255.255.0
   Default Gateway . . . . . . . . . :

以上两个命令可以写在一个 powershell 脚本文件内,脚本内设置管理员权限执行,由于需要管理员权限所以无法通过建立 shortcut 放到开机自启动文件夹来自动启动址

wsl_ip.ps1 脚本内容如下,会自动请求管理员权限:

if (