记一次 DNS 错误的解决

看到这个标题,老司机们可能会说:这有必要写篇文章?改下 /etc/resolv.conf 不就好了。还真就不行,下面来看看具体情况。

症状

网页上报错:“您的微擎系统链接不可用,可能是因为您的微擎系统版本过低,请升级到微擎最新版本。或者检查网络后重试”,Could not resolve: openapiw7.cc.

Debug 过程

1$ ping z.cn
2Temporary failure in name resolution

这说明在终端也无法进行 DNS 查询。

是否是 resolv.conf 配置出错?

查看 /etc/resolv.conf

# This file is managed by man:systemd-resolved(8). Do not edit

nameserver 127.0.0.53

注意看上面的注释,说是此文件被 systemd-resolved 接管。这时候你直接修改 nameserver 确实有用,但是治标不治本,因为过一段时间此文件又会被重置。

是否是 resolved.conf 配置出错?

按照网上能搜到的办法,修改 /etc/systemd/resolved.conf:

[Resolve]
DNS=119.29.29.29

并重启服务:

1$ sudo systemctl restart systemd-resolved

查看服务状态:

1$ sudo systemctl status systemd-resolved
2...
3Active: active (running)
1$ systemd-resolve --status
2Global
3         DNS Servers: 119.29.29.29
4         ...

可以看到 systemd-resolved 正常运行。

但是问题依然未解决。

是否是上游 DNS 的问题?

1$ nslookup z.cn 1.1.1.1
2$ nslookup z.cn 119.29.29.29
3$ nslookup z.cn 127.0.0.53

也可以用 dig 命令

1$ dig @8.8.8.8 www.google.com

结果前两个均正常,最后一个输出:

1connection timed out; no servers could be reached

这说明上游 DNS 无问题,是本机的解析服务的问题。

是否是 systemd-resolved 服务出错?

我们得看日志。但是 systemd-resolved 默认的输出级别不够,得改到 DEBUG 级别。根据此处的说法,sudo systemctl edit systemd-resolved 增加:

[Service]
Environment=SYSTEMD_LOG_LEVEL=debug

然后重启服务,通过下方命令查看日志:

journalctl -fu systemd-resolved

结果发现没有查询记录。我们执行一下 ping/dig/nslookup 命令,结果还是没有查询记录。

检查 53 端口状态

执行

1$ telnet 127.0.0.53 53
2Trying 127.0.0.53...
3telnet: Unable to connect to remote host: Connection refused

连接拒绝。可以对照

1$ telnet 8.8.8.8 53
2Trying 8.8.8.8...
3Connected to 8.8.8.8.
4Escape character is '^]'.
5^CConnection closed by foreign host

表名

执行

1$ sudo lsof -i:53

发现无监听。这说明 systemd-resolved 服务虽然开着,但并未监听。

解决方案

1sudo vi /etc/systemd/resolved.conf

修改配置:

1DNSStubListener=yes

重启服务后,可以看到 53 端口有监听了:

1COMMAND    PID            USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
2systemd-r 3953 systemd-resolve   12u  IPv4  36660      0t0  UDP localhost:domain 
3systemd-r 3953 systemd-resolve   13u  IPv4  36661      0t0  TCP localhost:domain (LISTEN)

DNS 查询恢复正常:

 1ubuntu@uclassol:~$ ping z.cn
 2PING z.cn (54.222.60.252) 56(84) bytes of data.
 364 bytes from 54.222.60.252 (54.222.60.252): icmp_seq=1 ttl=237 time=25.5 ms
 4^C
 5--- z.cn ping statistics ---
 62 packets transmitted, 1 received, 50% packet loss, time 1001ms
 7rtt min/avg/max/mdev = 25.586/25.586/25.586/0.000 ms
 8ubuntu@uclassol:~$ nslookup z.cn 127.0.0.53
 9Server:         127.0.0.53
10Address:        127.0.0.53#53
11
12Non-authoritative answer:
13Name:   z.cn
14Address: 54.222.60.252