dnsmasq
我正在运行带有和 的本地服务器unbound
。unbound
正在监听127.0.0.1:5300
服务器上的network.local
。dnsmasq
正在监听0.0.0.0:53
并且有一个配置行说明server=127.0.0.1#5300
。
如果我在服务器上unbound
直接查询,每次都会得到相同的答案(由于缓存,TTL 会发生变化)。这包括权限部分:
# dig @127.0.0.1 -p 5300 tomshardware.com
; <<>> DiG 9.9.5-9+deb8u6-Debian <<>> @127.0.0.1 -p 5300 tomshardware.com
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 60324
;; flags: qr rd ra; QUERY: 1, ANSWER: 3, AUTHORITY: 4, ADDITIONAL: 1
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;tomshardware.com. IN A
;; ANSWER SECTION:
tomshardware.com. 60 IN A 52.25.172.230
tomshardware.com. 60 IN A 54.69.85.242
tomshardware.com. 60 IN A 54.187.95.69
;; AUTHORITY SECTION:
tomshardware.com. 172800 IN NS ns-1533.awsdns-63.org.
tomshardware.com. 172800 IN NS ns-1591.awsdns-06.co.uk.
tomshardware.com. 172800 IN NS ns-185.awsdns-23.com.
tomshardware.com. 172800 IN NS ns-840.awsdns-41.net.
;; Query time: 1 msec
;; SERVER: 127.0.0.1#5300(127.0.0.1)
;; WHEN: Mon Apr 11 14:54:54 CEST 2016
;; MSG SIZE rcvd: 230
而且无论我进行多少次查询,这个答案都是一样的。询问dnsmasq
将得到不同的第一个答案。特别是,它剥离了权限部分。
# dig @127.0.0.1 tomshardware.com
; <<>> DiG 9.9.5-9+deb8u6-Debian <<>> @127.0.0.1 tomshardware.com
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 30492
;; flags: qr rd ra; QUERY: 1, ANSWER: 3, AUTHORITY: 4, ADDITIONAL: 1
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;tomshardware.com. IN A
;; ANSWER SECTION:
tomshardware.com. 2074 IN A 54.69.85.242
tomshardware.com. 2074 IN A 52.25.172.230
tomshardware.com. 2074 IN A 54.187.95.69
;; AUTHORITY SECTION:
tomshardware.com. 125528 IN NS ns-1533.awsdns-63.org.
tomshardware.com. 125528 IN NS ns-1591.awsdns-06.co.uk.
tomshardware.com. 125528 IN NS ns-185.awsdns-23.com.
tomshardware.com. 125528 IN NS ns-840.awsdns-41.net.
;; Query time: 3 msec
;; SERVER: 127.0.0.1#53(127.0.0.1)
;; WHEN: Mon Apr 11 14:56:20 CEST 2016
;; MSG SIZE rcvd: 230
请注意上面的当前权限部分。再次运行完全相同的查询会得到较少的答案。
# dig @127.0.0.1 tomshardware.com
; <<>> DiG 9.9.5-9+deb8u6-Debian <<>> @127.0.0.1 tomshardware.com
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 48837
;; flags: qr rd ra; QUERY: 1, ANSWER: 3, AUTHORITY: 0, ADDITIONAL: 1
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;tomshardware.com. IN A
;; ANSWER SECTION:
tomshardware.com. 2073 IN A 54.187.95.69
tomshardware.com. 2073 IN A 52.25.172.230
tomshardware.com. 2073 IN A 54.69.85.242
;; Query time: 1 msec
;; SERVER: 127.0.0.1#53(127.0.0.1)
;; WHEN: Mon Apr 11 14:56:21 CEST 2016
;; MSG SIZE rcvd: 93
为什么是这样?
似乎是 pr. 客户端。因此,在运行上述操作后(仍然没有得到完整的答案),我仍然可以在桌面上获取权限部分 - 只是第二次不行。
答案1
我一直在寻找这个问题的答案,但没有找到官方解释或文件来解释为什么第一个答复不同。
根据我的测试,Dnsmasq 的第一个答案似乎始终是直接从上游收到的 DNS 回复,并且如果上游 DNS 服务器提供,则可以包含扩展的AUTHORITY SECTION
和:ADDITIONAL SECTION
接下来的回复来自 Dnsmasq 缓存,通常只包含ANSWER SECTION
IP 或 CNAME:
它会持续给出较短的 DNS 答案,直到缓存 TTL 过期。之后,它会显示一个包含扩展部分的回复。
似乎没有办法强制 Dnsmasq 始终使用来自缓存的“更干净”的 DNS 回复进行回答(至少我所知道的)。
然而,现在 Dnsmasq 的新版本中有一个选项可以作为解决方法:
--use-stale-cache
这样,即使缓存已过期,Dnsmasq 也能显示来自缓存的答案。
这仍然会在该域的第一个查询中给出不同的扩展第一个答案,但之后它似乎会返回更短的“更干净”的 DNS 回复,即使缓存 TTL 已过期。