dnsmasq 缓存无错误,答案为:0,权限为:0

dnsmasq 缓存无错误,答案为:0,权限为:0

dig我使用公共 DNS 提供商 (nextdns.io),它会阻止某些域名。这些被阻止的域名在-ed时会返回如下响应:

; <<>> DiG 9.16.1-Ubuntu <<>> example.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 63541
;; flags: qr rd ra; QUERY: 1, ANSWER: 0, AUTHORITY: 0, ADDITIONAL: 0

;; QUESTION SECTION:
;example.com.               IN      A

;; Query time: 66 msec
;; SERVER: 192.168.1.1#53(192.168.1.1)
;; WHEN: Wed Jul 22 12:03:25 CDT 2020
;; MSG SIZE  rcvd: 33

我在 DD-WRT 路由器上使用 dnsmasq 来处理来自本地网络上设备的所有 DNS 查询。有没有办法配置 dnsmasq 以NOERROR使用 0 ANSWER/缓存这些结果AUTHORITY

查看日志后,我发现我的上游 DNS 提供商持续受到网络上客户端的攻击,该客户端频繁尝试访问一些被阻止的域。

我查看了 dnsmasq 手册页,但我看到的缓存/ttl 标志似乎对这些类型的响应没有影响,因为它们不是负面的(例如NXDOMAIN)可缓存的,而是根本没有答案。我知道我可以通过添加记录(如)来明确处理 dnsmasq 配置中的某些域address=/.example.com/::,但我更愿意在我的 dnsmasq 中添加缓存/ttl,以便在尝试再次从上游查询答案之前将无答案缓存 300 秒左右。

答案1

缓存方面的主要问题是某种形式的损坏响应(我认为NODATA根据建议的意图损坏了)。

DNS 缓存是基于某些 TTL 完成的,对于肯定响应,缓存 TTL 基于 RRSet TTL,对于否定响应,缓存 TTL 基于部分SOA中的记录AUTHORITY(具体来说,使用的 TTL 是MIN(SOA TTL, SOA.MINIMUM))。

无论是否定回答NXDOMAIN还是NODATANOERROR为空),这些回答类型总是在该部分中ANSWER有相关记录。SOAAUTHORITY

当然,如果过滤 DNS 提供商也为过滤域提供有效响应(即正确的NXDOMAINNODATA响应),那就更好了。

解决这个问题并不一定很简单,因为这不是一种应该存在的响应类型,并且不一定有办法捕捉这种情况。

但是,你正在使用dnsmasq,根据dnsmasq 手册有一个设置似乎可以处理这种情况:

--neg-ttl=<time>
来自上游服务器的否定答复通常包含 SOA 记录中的生存时间信息,dnsmasq 会使用该信息进行缓存。如果来自上游服务器的答复省略了此信息,dnsmasq 不会缓存答复。此选项为生存时间(以秒为单位)提供了一个默认值,dnsmasq 即使在没有 SOA 记录的情况下也会使用该默认值来缓存否定答复。

相关内容