如何调试 Squid ERR_DNS_FAIL

如何调试 Squid ERR_DNS_FAIL

我管理着几个在 Ubuntu 20.04LTS 上运行 Squid 4.10 的 Web 代理,这些代理分布在全球多个地方。其中一个代理养成了偶尔无法访问网页的坏习惯。用户会收到一个错误页面,内容如下:

Hmmm... can't reach this page
It looks like the webpage at <URL> might be having issues,
or it may have moved permanently to a new web address.
ERR_TUNNEL_CONNECTION_FAILED

%err_code/%err_detail在相关内容末尾添加logformat建议后此邮件列表帖子,Squid access.log 中失败访问的条目如下所示:

1635169354.239    171 10.72.1.103 NONE/503 0 CONNECT ad.360yield.com:443 - HIER_
NONE/- - ERR_DNS_FAIL/-

Squid 状态为NONE/503,错误代码和详细信息始终为ERR_DNS_FAIL/-。时间戳、客户端 IP 地址和请求的 URL 当然会有所不同。

每次出现问题都会影响单个 FQDN 或极少数 FQDN,通常都来自同一组织(例如 lm.licenses.adobe.com 和 cc-api-data.adobe.io,均来自 Adob​​e)。所有其他访问继续正常工作。一次问题通常持续五到十分钟。在此期间,所有尝试访问该 FQDN 的客户端都会受到影响。在此之前和之后,相同的 FQDN 都可以正常工作。受影响的 FQDN 没有明显的规律性。

有些事件会伴随如下消息:

2021/10/25 15:42:34 kid1| ipcacheParse No Address records in response to 'ad.360yield.com'

/var/log/squid/cache.log大多数情况下,那里没有任何记录。

我怎样才能找出那里出了什么问题?

答案1

通过输入指令将 DNS 查找的日志级别提高到 6

debug_options ALL,1 78,6

into/etc/squid/squid.conf使 Squid 记录/var/log/squid/cache.log失败查询所使用的名称服务器,例如:

2021/10/26 16:16:43.088 kid1| 78,3| dns_internal.cc(1369) idnsRead: idnsRead: FD 17: received 32 bytes from 127.0.0.1:53
2021/10/26 16:16:43.088 kid1| 78,3| dns_internal.cc(1176) idnsGrokReply: idnsGrokReply: QID 0x376f, 0 answers

然后可以在该名称服务器上进一步调查故障。

在我的例子中,这指向dnsmasq在同一台机器上运行的 DNS 代理服务器。启用查询日志记录后dnsmasq发现,配置的四个外部名称服务器中的一个是导致故障的原因。发送到该名称服务器的查询失败,而发送到其他三个名称服务器中的一个的查询成功。因此,解决方案是从配置中删除有故障的外部名称服务器。

相关内容