应用程序DNS解析缓慢但dig/nslookup正常的问题排查求助
各位好,我遇到一个困扰了好几个月的DNS解析问题,跨系统重启、软件包更新都没解决,实在找不到头绪,来求助大家!
今年年初开始,我访问新域名(有时候连之前访问过的域名)经常会出现10-30秒的延迟,而且这个问题出现在多个程序里:Firefox浏览器、Discord的更新器,还有命令行里的ssh和mosh都中招了。我一直用ssh -vvvv来做测试,因为它会明确显示域名解析的开始和结束节点。
测试现象整理
- 打开从未访问过的域名
http://asdfasdf.com,Firefox会显示空白标签+加载动画,卡10秒以上,我没等加载完成就关闭了标签页 - 执行
ssh -vvvv asdfasdf.com,当输出到debug3: resolve_host: lookup asdfasdf.com:22时就会停滞10秒以上,我只能按Ctrl+C中断测试 - 但用
dig asdfasdf.com测试时,立刻就能返回正确结果(十几个A记录),它查询的是我的本地路由器192.168.1.1——这也是/etc/resolv.conf里配置的唯一DNS服务器 nslookup asdfasdf.com会立刻返回结果,但之后会停顿5秒,输出;; communications error to 192.168.1.1#53: timed out,重复三次后,最后显示;; no servers could be reached- 指定外部DNS服务器测试的话,
dig @4.2.2.1 asdfasdf.com和nslookup asdfasdf.com 4.2.2.1都能立刻返回正确结果,且没有任何错误
后续重复测试的情况
- 再次执行
ssh -vvvv asdfasdf.com,依然会在解析步骤卡15秒,之后才到debug3: ssh_connect_direct: entering(当然这个域名没开ssh服务,最后连接失败) - 第二次用Firefox打开
asdfasdf.com,这次只卡了约5秒就开始加载页面 - 第三次打开Firefox,页面立刻开始加载
- 但
ssh的解析延迟问题依然存在,还是会卡15秒
我尝试过的配置修改
- 修改
/etc/resolv.conf,把默认DNS服务器改成4.2.2.1,虽然dig和nslookup的默认查询服务器变了,但其他问题现象完全没改善 - 修改
/etc/nsswitch.conf里的hosts配置行:
原配置:hosts: mymachines mdns_minimal [NOTFOUND=return] resolve [!UNAVAIL=return] files myhostname dns
修改后:hosts: mymachines resolve [!UNAVAIL=return] files myhostname dns
改完后没看出任何效果 - 之前还试过在
/etc/resolv.conf里加一行来禁用伴随A请求发送的AAAA请求,不过现在记不清具体内容了,当时也没起到作用
UPDATE 1:关于systemd-resolved的测试
一开始执行resolvectl status时,报错Failed to get global data: Unit dbus-org.freedesktop.resolve1.service not found.,查了下是systemd-resolved.service处于禁用且未运行状态。我执行了systemctl enable systemd-resolved.service和systemctl start systemd-resolved.service把它启动起来,之后resolvectl status的输出如下:
Global Protocols: +LLMNR +mDNS -DNSOverTLS DNSSEC=no/unsupported resolv.conf mode: foreign Current DNS Server: 192.168.1.1 DNS Servers 192.168.1.1 Fallback DNS Servers 1.1.1.1#cloudflare-dns.com 9.9.9.9#dns.quad9.net 8.8.8.8#dns.google 2606:4700:4700::1111#cloudflare-dns.com 2620:fe::9#dns.quad9.net 2001:4860:4860::8888#dns.google Link 2 (enp37s0) Current Scopes: none Protocols: -DefaultRoute +LLMNR -mDNS -DNSOverTLS DNSSEC=no/unsupported Link 3 (wlp38s0) Current Scopes: DNS LLMNR/IPv4 LLMNR/IPv6 Protocols: +DefaultRoute +LLMNR -mDNS -DNSOverTLS DNSSEC=no/unsupported Current DNS Server: 192.168.1.1 DNS Servers: 192.168.1.1
但测试resolvectl query asdfasdf.com时,居然超时了120秒,提示asdfasdf.com: resolve call failed: Connection timed out.,而resolvectl query google.com却能立刻返回6个IPv4和4个IPv6结果。更糟的是,启用这个服务后Firefox完全加载不了页面,我只好又停止并禁用了systemd-resolved.service。
UPDATE 2:Wireshark抓包发现的线索
用Wireshark抓包后,我发现了关键问题:ssh发送A记录请求后立刻收到了响应,但发送AAAA记录请求后完全没收到回复,然后就卡住了。进一步排查IPv6的情况,发现除了本地回环地址ping -6 ::1能通,其他外部IPv6地址都ping不通。
目前我打算要么彻底禁用IPv6,要么想办法修复IPv6的问题,后续会继续排查,找到解决方案后会回来更新答案。
备注:内容来源于stack exchange,提问作者Sparr

