Ubuntu下默认的DNS服务是systemd-resolved,它运行在后台,它的命令行方式是systemd-resolve。
查看当前的DNS服务器,可以用 sudo systemd-resolve –status
或用resolvectl dns命令查询dns服务器,以及用resolvectl query baidu.com来查询域名,这和dig是一样……
用dig baidu.com时,没有响应,但用resolvectl query超时会提示,因此比较有用。
不过在启用VPN时,情况就变得复杂了,有时候systemctl-resolved并不能正确解析域名,用resolvectl query baidu.com出错:
resolve call failed: Lookup failed due to system error: Connection timed out
一种常见的原因是,dns服务器不可达。
要确保sudo systemd-resolve –status后面接口对应的dns服务器可以ping通,就没问题,并且能服务于DNS查询。如果ping不通,则要么删除,要么用ip route配置路由。如果是不能服务于DNS查询,则要删除它。
一、因内网路由不可达
通常用pvpn连上服务器后,会把远端服务器当作网关,这样有可能造成本地原来可达的路由不可达,此时可以通过添加原来路由的方式,比如:
sudo ip route add 10.10.8.0/24 via 10.70.1.1
在pvpn开启之前,内网有专线路由10.70.1.1到10.10.8.X网段,开启后因为走公网而不通,重新添加路由,使得到达dns的路由不走公网默认网关即可。
二、因DNS服务器不起作用
systemd-resolved当前有一个特点,不知道算不算bug,它会尝试查询所有dns服务器,如果对方没响应,会导致DNS查询卡住。
通常我们是用电信运营商提供的DNS,但一般是配置在路由器上,如果您在电脑上配置了这种本地电信运营商直接的DNS,它只服务于境内的查询,如果连上pvpn后,虽然可以ping通这些IP,但它们不会响应非法IP的DNS查询,所以,不要在PC上配置这种DNS服务器,一般可以用1.1.1.1等境外公共DNS服务器,虽然会被墙过滤,但一旦连上PVPN后,就没有这方面的问题。
在Ubuntu上,一般是配置netplan来配置网络,路由和dns,合理配置可以让消弥DNS产生的问题的可能性。
network: version: 2 ethernets: enp0s25: dhcp4: true wifis: wlo1: dhcp4: true access-points: myap: password: mypassword routes: - to: 10.10.8.0/24 via: 192.168.1.1 metric: 30
有多个DNS服务器时如何指定DNS
对于多网卡的设备,每个网卡都可以配置DNS服务器,如果用了DHCP,DNS也会向DHCP服务器请求DNS,当DNS服务器有冲突,需要手工指定认可的DNS,这通常可以这么做: