最近WSL2上Ubuntu经常遇到网络错误, 检查了一下发现是DNS解析存在问题,使用IP直连则一切正常

记录一下问题解决方案

问题描述

宿主机使用物理网卡联网,宿主机环境上DNS解析正常

WSL中使用curl提示无法解析域名或超时,检查/etc/resolv.conf发现自动配置的dnsserver指向了宿主机本地IP

临时解决方案

在WSL中操作:

修改/etc/wsl.conf增加配置:

generateResolvConf=false

修改/etc/resolv.conf删除原有自动生成的配置,
新增配置:

nameserver 8.8.8.8

重启WSL

内网域名解析问题 & 自动脚本

临时方案存在问题,WSL更新时有概率丢失配置, 配置的8.8.8.8静态DNS服务器无法处理内网域名和代理域的域名解析

参考GithubGist上的一个自动shell脚本:

#!/bin/bash

sed -i '/nameserver/d' /etc/resolv.conf

/mnt/c/Windows/System32/WindowsPowerShell/v1.0/powershell.exe -Command '(Get-DnsClientServerAddress -AddressFamily IPv4).ServerAddresses | ForEach-Object { "nameserver $_" }' | tr -d '\r'| tee -a /etc/resolv.conf > /dev/null
  • 创建shell脚本 ~/boot.sh
  • 执行权限 chmod +x boot.sh
  • link到PATH ln -s ~/boot.sh /usr/local/bin/boot.sh
  • 修改 etc/wsl.conf 自启动

    [network]
    generateResolvConf=false
    [boot]
    systemd=true
    command=boot.sh