在过去的 3 个月中,我一直在努力解决家庭服务器上的一个随机问题,DNS 解析会在短时间内(10-60 秒)毫无原因地中断。通过主机名执行 ping 会导致ping: signal.org: Temporary failure in name resolution
,并且任何尝试 DNS 查找的服务几乎立即失败。当这些中断发生时,没有systemd-resolved
或dnsmasq
登录/var/log/syslog
,但其他服务会报告问题。例如:
ddclient[573749]: message repeated 14 times: [ WARNING: cannot connect to checkip.dyndns.org:80 socket: IO::Socket::INET: Bad hostname 'checkip.dyndns.org']
dockerd[1811]: time="2021-04-29T13:50:19.080258289-05:00" level=info msg="No non-localhost DNS nameservers are left in resolv.conf. Using default external servers: [nameserver 8.8.8.8 nameserver 8.8.4.4]"
rsyslogd: DNS error: Can't resolve "<local_domain>" [v8.2001.0]
whoopsie[1816]: [17:38:15] Sent; server replied with: Couldn't resolve host name
当前设置:Ubuntu 20.04.2,Netplan
设置为静态 IP,dnsmasq
是 DNS 服务器,dns-forward-max=1024
已systemd-resolved
禁用并停止。服务器是 Ryzen 3950X,64GB RAM,操作系统安装在 NVMe 驱动器上。服务器运行许多 webapp 类型的服务,但 DNS 请求最嘈杂的很容易matrix-synapse
。
我尝试过的事情:
· 我已经重新启动了该systemd-resolved
服务数百次,禁用了该服务十几次,关闭/打开了存根解析器,并且删除并重新创建了符号链接。
· 我使用 设置了静态 IP netplan
,并使用 /etc/NetworkManager/NetworkManager.conf 进行操作。
· 我安装了pihole
并unbound
通过apt
仅为服务器本身。 (pihole
当前已卸载,unbound
正在运行但没有任何内容使用它来解决。
· 我已安装dnsmasq
并完全禁用systemd-resolved
。
· 我已在服务器上完全禁用 IPv6。
· 我已经在 /etc/security/limits.conf 中设置了* soft nofile 1048576
和,并且显示。* hard nofile 1048576
/proc/sys/fs/file-max
9223372036854775807
我怀疑问题出在 Docker 上,但我不知道如何验证这一点。我目前有 38 个 Docker 容器在运行,当我sudo lsof -i :53
在问题发生时运行时,我会看到:
thomcat@servername:~$ sudo lsof -i :53
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
dockerd 1623 root 217u IPv4 1577888 0t0 UDP localhost:46003->localhost:domain
dockerd 1623 root 226u IPv4 1605902 0t0 UDP localhost:50192->localhost:domain
dockerd 1623 root 227u IPv4 1610070 0t0 UDP localhost:52637->localhost:domain
dockerd 1623 root 228u IPv4 1605907 0t0 UDP localhost:55021->localhost:domain
dockerd 1623 root 229u IPv4 1618981 0t0 UDP localhost:57618->localhost:domain
dockerd 1623 root 230u IPv4 1610081 0t0 UDP localhost:35776->localhost:domain
dockerd 1623 root 231u IPv4 1610086 0t0 UDP localhost:60635->localhost:domain
dockerd 1623 root 232u IPv4 1589998 0t0 UDP localhost:43036->localhost:domain
dockerd 1623 root 234u IPv4 1602056 0t0 UDP localhost:58408->localhost:domain
dockerd 1623 root 235u IPv4 1614011 0t0 UDP localhost:43421->localhost:domain
dockerd 1623 root 236u IPv4 1589999 0t0 UDP localhost:60957->localhost:domain
dockerd 1623 root 237u IPv4 1597695 0t0 UDP localhost:53026->localhost:domain
dockerd 1623 root 242u IPv4 1590000 0t0 UDP localhost:41842->localhost:domain
dockerd 1623 root 244u IPv4 1597696 0t0 UDP localhost:49179->localhost:domain
dockerd 1623 root 246u IPv4 1572736 0t0 UDP localhost:46471->localhost:domain
dockerd 1623 root 266u IPv4 1616008 0t0 UDP localhost:35262->localhost:domain
dockerd 1623 root 267u IPv4 1616009 0t0 UDP localhost:54501->localhost:domain
dockerd 1623 root 268u IPv4 1579887 0t0 UDP localhost:33130->localhost:domain
dockerd 1623 root 269u IPv4 1579888 0t0 UDP localhost:33491->localhost:domain
dockerd 1623 root 270u IPv4 1613280 0t0 UDP localhost:49504->localhost:domain
dockerd 1623 root 273u IPv4 1579890 0t0 UDP localhost:43801->localhost:domain
dockerd 1623 root 278u IPv4 1613283 0t0 UDP localhost:44804->localhost:domain
dockerd 1623 root 279u IPv4 1568692 0t0 UDP localhost:39425->localhost:domain
dockerd 1623 root 293u IPv4 1577890 0t0 UDP localhost:52194->localhost:domain
dockerd 1623 root 296u IPv4 1605903 0t0 UDP localhost:50866->localhost:domain
dockerd 1623 root 319u IPv4 1605904 0t0 UDP localhost:58574->localhost:domain
dockerd 1623 root 341u IPv4 1605910 0t0 UDP localhost:37123->localhost:domain
dockerd 1623 root 342u IPv4 1610067 0t0 UDP localhost:48734->localhost:domain
dockerd 1623 root 343u IPv4 1610069 0t0 UDP localhost:35580->localhost:domain
dockerd 1623 root 344u IPv4 1605905 0t0 UDP localhost:45133->localhost:domain
dockerd 1623 root 345u IPv4 1618982 0t0 UDP localhost:53052->localhost:domain
dockerd 1623 root 346u IPv4 1589996 0t0 UDP localhost:56714->localhost:domain
dockerd 1623 root 347u IPv4 1614009 0t0 UDP localhost:37216->localhost:domain
dockerd 1623 root 348u IPv4 1589997 0t0 UDP localhost:38032->localhost:domain
dockerd 1623 root 349u IPv4 1618984 0t0 UDP localhost:53714->localhost:domain
dockerd 1623 root 350u IPv4 1610084 0t0 UDP localhost:42922->localhost:domain
dockerd 1623 root 351u IPv4 1577893 0t0 UDP localhost:32865->localhost:domain
dockerd 1623 root 352u IPv4 1608975 0t0 UDP localhost:58307->localhost:domain
dockerd 1623 root 353u IPv4 1597699 0t0 UDP localhost:33564->localhost:domain
dockerd 1623 root 354u IPv4 1608977 0t0 UDP localhost:58235->localhost:domain
dockerd 1623 root 355u IPv4 1577896 0t0 UDP localhost:46068->localhost:domain
dockerd 1623 root 356u IPv4 1597702 0t0 UDP localhost:32827->localhost:domain
systemd-r 106795 systemd-resolve 12u IPv4 980615 0t0 UDP localhost:domain
systemd-r 106795 systemd-resolve 13u IPv4 980616 0t0 TCP localhost:domain (LISTEN)
http 165553 _apt 3u IPv4 1611999 0t0 UDP localhost:54478->localhost:domain
更多注意事项:
· 上游 DNS 服务器是运行 pihole 的 Raspberry Pi 3 B+。 我的网络上没有其他任何地方存在这些 DNS 解析问题,因此问题不在于 pihole。
·ssh
当此问题发生时,与服务器的会话不会中断。
·ping
当问题发生时,外部 IP 工作正常。
我一直在绞尽脑汁想弄清楚这个问题。如果有人有任何想法,我很乐意听听。
答案1
您好,欢迎来到论坛!
也许值得考虑一下,您的问题实际上并不是出在 DNS 上,而可能是由于某种原因,您的网络连接不可靠,导致一些数据包丢失。ssh 会话能够继续存在这一事实并没有告诉我们太多信息,因为 ssh 会话使用 TCP,因此即使丢失了许多数据包,它也能正常工作。另一方面,DNS 使用 UDP,因此如果一些 UDP 数据包(传入或传出)丢失,则可能导致 DNS 故障。
像您那样使用 ping 进行测试是个好主意,可能值得多做几次,例如每秒更频繁地 ping 一次,以查看是否有时会出现数据包丢失以及丢失的时间是否与 DNS 问题相关。还值得注意的是,ping 涉及不同的协议 (ICMP),可能发生 UDP 出现问题但 ping 仍然有效的情况。那么可能值得使用 UDP 运行测试,例如可以使用工具来完成iperf3
。
如果您自己控制 DNS 服务器,那么您可以监视它以查看 DNS 请求是否到达,以及查看 DNS 服务器是否发送了答复。
您还可以尝试使用类似tcpdump
或的方法在本地监控传入和传出的网络流量tshark
,以验证 DNS 请求是否已发送,并检查是否可以看到来自 DNS 服务器的回复。
无论如何,这些都是一些想法,我希望其中一些能有用。祝你好运!