Con*_*ell 5 bind internal-dns dnsmasq dns-zone consul
我正在尝试将 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
Run Code Online (Sandbox Code Playgroud)
我的 dnsmasq 设置只是设置为将请求转发.consul到同一台机器上的端口 3000,这是我的领事 dns 端口。否则,我使用 dnsmasq 默认值(将请求转发到 resolv.conf 中的其他 dns)。
server=/consul/127.0.0.1#3000
Run Code Online (Sandbox Code Playgroud)
这适用于普通挖掘并从服务器本地主机返回结果,例如。dig consul.service.consul +short将返回:
10.22.1.15
10.22.1.16
10.22.1.17
Run Code Online (Sandbox Code Playgroud)
正如预期的那样。普通 DNS(转发到 BIND dns 服务器)也可以正常工作,例如。dig host.hosts.domain.com +short将返回10.22.1.23
但是,在进行区域转移时,dig axfr us1.domain.comdig 将返回大约 700 行然后挂起,总是在同一个地方。如果我包括+retry=0dig;; connection timed out; no servers could be reached在 700 行之后的底部放置一个。
当从上游(绑定)dns 服务器进行区域传输时,它会按预期返回所有 22k 结果。
为 dig(-m标志)打开内存调试后,它似乎挂在
del 0x7f5c8131e010 size 152 file timer.c line 390 mctx 0x17572d0
Run Code Online (Sandbox Code Playgroud)
当按下 ctrl+c 时,它会吐出一个回溯,我设法追踪到 dig 认为请求尚未完成,我认为这是真的:
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)
Run Code Online (Sandbox Code Playgroud)
启用额外的 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
Run Code Online (Sandbox Code Playgroud)
在上游绑定日志中:
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
Run Code Online (Sandbox Code Playgroud)
我怀疑这与最大数据包大小有关,但我尝试了从不同缓存大小到增加 dns forwards 和 edns-packet-max 的不同设置。很奇怪,从上游 dns 请求 axfr 工作正常,但通过 dnsmasq 它只返回部分结果,然后导致 dig 挂起。
编辑:我尝试了 1.76 版本,并且还编译了最新的官方提交 7cbf497da4100ea0d1c1974b59f9503e15a0cf80,结果相同。
我正在运行 CentOS Linux 版本 7.5.1804(核心)。
在使用/不使用 dnsmasq 执行 tcpdump 后,我可以看到响应被分成两个数据包。出于某种原因,dig 在查询 dnsmasq 时从未收到第二个数据包,因此它只是挂起。数据包的大小是 2521 字节和 189 字节,如果这对任何人都有意义的话。
根据 Simon Kelly 教授(dnsmasq 创建者)的说法,这个问题是由区域传输超过 65536 字节引起的,并且 dnsmasq 没有实现用于将传输推送到多个消息的延续方法。
因此,大区域传输将不起作用,建议的解决方法是直接与上游权威服务器对话。
| 归档时间: |
|
| 查看次数: |
646 次 |
| 最近记录: |