新的信息

新的信息

我正在尝试将 dnsmasq 设置为 consul 的本地缓存。虽然这对于普通挖掘来说似乎工作正常,但 dnsmasq 似乎只允许部分区域传输。

我的resolv.conf:

search x.domain.com y.domain.com z.domain.com domain.com
nameserver 127.0.0.1
nameserver 10.0.0.1
nameserver 10.0.0.2
nameserver 10.0.0.3
options timeout: 2 attempts: 3

我的 dnsmasq 设置只是将请求转发.consul到同一台机器上的端口 3000,这是我的 consul dns 端口。否则,我使用 dnsmasq 默认值(将请求转发到 resolv.conf 中的其他 dns)。

server=/consul/127.0.0.1#3000 

这对于正常挖掘来说很有效,并从服务器本地主机返回结果,例如dig consul.service.consul +short将返回:

10.22.1.15
10.22.1.16
10.22.1.17

正如预期的那样。普通 DNS(转发到 BIND DNS 服务器)也可以正常工作,例如dig host.hosts.domain.com +short将返回10.22.1.23

但是,进行区域传输时dig axfr us1.domain.com,dig 会返回大约 700 行,然后挂起,始终在同一位置。如果我包括dig,则会在 700 行之后的底部+retry=0放置一个。;; connection timed out; no servers could be reached

从上游(绑定)DNS服务器进行区域传输时,它会按预期返回所有22k结果。

在打开 dig (-m标志)的内存调试后,它似乎挂在

del 0x7f5c8131e010 size 152 file timer.c line 390 mctx 0x17572d0

当按下 ctrl+c 时,它会吐出一个回溯,我设法追踪到该回溯并进行挖掘,认为请求尚未完成,我认为这是真的:

dighost.c:3831: REQUIRE(sockcount == 0) failed, back trace
#0 0x7f5c802c4227 in ??
#1 0x7f5c802c417a in ??
#2 0x41212d in ??
#3 0x405e0e in ??
#4 0x7f5c7de2f445 in ??
#5 0x405e6e in ??
Aborted (core dumped)

启用额外的 dnsmasq 日志记录后,我可以看到 axfr 的情况:

Oct 04 12:17:41 hostname.hosts.domain.com dnsmasq[16055]: forwarded us1.domain.com to 10.0.0.1
Oct 04 12:17:41 hostname.hosts.domain.com dnsmasq[16055]: reply _kerberos.us1.domain.com is DOMAIN.COM
Oct 04 12:17:41 hostname.hosts.domain.com dnsmasq[16055]: reply consul-acl.prod.us1.domain.com is us4

在上游绑定日志中:

Oct  4 12:20:07 upstreamdns named[17388]: client 10.22.10.20#42228: transfer of 'us1.domain.com/IN': AXFR started
Oct  4 12:20:07 upstreamdns named[17388]: client 10.22.10.20#42228: transfer of 'us1.domain.com/IN': AXFR ended

我怀疑这与最大数据包大小或其他因素有关,但我尝试了不同的设置,从不同的缓存大小到增加 dns 转发和 edns-packet-max。很奇怪,从上游 dns 请求 axfr 工作正常,但通过 dnsmasq 它只返回部分结果,然后导致 dig 挂起。

编辑:我尝试了 1.76 版本,并且编译了最新的官方提交 7cbf497da4100ea0d1c1974b59f9503e15a0cf80,结果相同。

我正在运行 CentOS Linux 版本 7.5.1804(核心)。

新的信息

在对有/无 dnsmasq 的情况进行 tcpdump 后,我可以看到响应被拆分为两个数据包。出于某种原因,dig 在查询 dnsmasq 时从未收到第二个数据包,因此它只是挂起。数据包的大小分别为 2521 字节和 189 字节,如果这对任何人来说都有意义的话。

答案1

根据 Simon Kelly 教授(dnsmasq 创建者)的说法,该问题是由于区域传输超过 65536 字节而引起的,而 dnsmasq 没有实现将传输推送到多个消息的连续方法。

因此,大型区域传输将无法起作用,建议的解决方法是直接与上游权威服务器对话。

相关内容