WSL/Ubuntu连接Trident VPN后DNS被阻断,无法访问任何网络
WSL/Ubuntu连接Trident VPN后DNS被阻断,无法访问任何网络
这种情况我之前帮同事排查过,大概率是Trident这类企业级VPN接管Windows网络配置后,干扰了WSL的DNS解析流程——毕竟WSL默认和Windows共享网络栈,但VPN的规则没适配WSL的特殊情况,咱们一步步来解决:
先确认问题根源
连VPN之后,先在WSL里跑个命令看看DNS配置是不是被覆盖了:
cat /etc/resolv.conf
如果输出里的DNS服务器不是你之前设的8.8.8.8,而是VPN推送的地址,那基本就是VPN强制替换了WSL的DNS配置,导致公共域名解析失败;要是DNS还是8.8.8.8但ping域名不通,那可能是VPN防火墙拦截了WSL到公共DNS的请求。
解决方案一:强制WSL锁定自定义DNS,不受VPN干扰
这是最常用的解决办法,核心是让WSL的DNS解析完全独立于Windows的VPN配置:
- 编辑
/etc/systemd/resolved.conf,把配置改成这样(重点关注最后一行):
把[Resolve] DNS=8.8.8.8 8.8.4.4 FallbackDNS= Domains= #LLMNR=no #MulticastDNS=no #DNSSEC=no #DNSOverTLS=no #Cache=no-negative DNSStubListener=noDNSStubListener设为no,就能阻止systemd-resolved创建干扰DNS的Stub监听。 - 重启resolved服务:
sudo systemctl restart systemd-resolved - 修复
resolv.conf的软链接(WSL经常会自动覆盖这个文件):sudo mv /etc/resolv.conf /etc/resolv.conf.bak sudo ln -s /run/systemd/resolve/resolv.conf /etc/resolv.conf - 彻底关闭WSL(别只关终端),在Windows PowerShell里运行:
重新打开WSL并连接VPN,再试试pingwsl --shutdowngithub.com,应该就能正常解析了。
解决方案二:适配VPN的DNS规则(如果VPN禁止公共DNS)
要是公司的VPN防火墙严格禁止访问公共DNS(比如8.8.8.8),那只能用VPN分配的DNS:
- 在Windows PowerShell里连接VPN后,运行
ipconfig /all,找到Trident VPN适配器的「DNS服务器」地址并记下来。 - 在WSL里编辑
/etc/resolv.conf,把DNS改成刚才记录的VPN地址,比如:nameserver 10.xxx.xxx.xxx nameserver 10.xxx.xxx.xxy - 同样执行
wsl --shutdown重启WSL,再测试访问。
解决方案三:排查路由/防火墙拦截
要是上面两种方法都不行,先测试IP连通性:
ping 140.82.112.3 # github的公共IP之一
如果能ping通,那还是DNS的问题;如果ping不通,说明VPN的路由规则阻止了WSL的流量,这时候需要在Windows端检查Trident VPN的设置,看看是不是允许WSL的子网(一般是172.16.x.x或192.168.x.x段)访问外部网络,或者有没有防火墙规则把WSL的流量当成「未授权」给拦截了。
为啥Windows本身没问题?因为企业级VPN客户端会专门适配Windows的网络栈,自动更新DNS和路由规则,但WSL的网络是基于Windows的虚拟化子网,VPN厂商可能没做适配,就导致WSL的流量被误拦截了。
备注:内容来源于stack exchange,提问作者aakash adhikari
相关产品推荐
相关产品推荐

