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
还是NODATA
(NOERROR
为空),这些回答类型总是在该部分中ANSWER
有相关记录。SOA
AUTHORITY
当然,如果过滤 DNS 提供商也为过滤域提供有效响应(即正确的NXDOMAIN
或NODATA
响应),那就更好了。
解决这个问题并不一定很简单,因为这不是一种应该存在的响应类型,并且不一定有办法捕捉这种情况。
但是,你正在使用dnsmasq
,根据dnsmasq 手册有一个设置似乎可以处理这种情况:
--neg-ttl=<time>
来自上游服务器的否定答复通常包含 SOA 记录中的生存时间信息,dnsmasq 会使用该信息进行缓存。如果来自上游服务器的答复省略了此信息,dnsmasq 不会缓存答复。此选项为生存时间(以秒为单位)提供了一个默认值,dnsmasq 即使在没有 SOA 记录的情况下也会使用该默认值来缓存否定答复。