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

症状

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

Debug 过程

$ ping z.cn
Temporary 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

并重启服务:

$ sudo systemctl restart systemd-resolved

查看服务状态:

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

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

但是问题依然未解决。

是否是上游 DNS 的问题?

$ nslookup z.cn 1.1.1.1
$ nslookup z.cn 119.29.29.29
$ nslookup z.cn 127.0.0.53

也可以用 dig 命令

$ dig @8.8.8.8 www.google.com

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

connection 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 端口状态

执行

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

连接拒绝。可以对照

$ telnet 8.8.8.8 53
Trying 8.8.8.8...
Connected to 8.8.8.8.
Escape character is '^]'.
^CConnection closed by foreign host

表名

执行

$ sudo lsof -i:53

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

解决方案

sudo vi /etc/systemd/resolved.conf

修改配置:

DNSStubListener=yes

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

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

DNS 查询恢复正常:

ubuntu@uclassol:~$ ping z.cn
PING z.cn (54.222.60.252) 56(84) bytes of data.
64 bytes from 54.222.60.252 (54.222.60.252): icmp_seq=1 ttl=237 time=25.5 ms
^C
--- z.cn ping statistics ---
2 packets transmitted, 1 received, 50% packet loss, time 1001ms
rtt min/avg/max/mdev = 25.586/25.586/25.586/0.000 ms
ubuntu@uclassol:~$ nslookup z.cn 127.0.0.53
Server:         127.0.0.53
Address:        127.0.0.53#53

Non-authoritative answer:
Name:   z.cn
Address: 54.222.60.252