为什么我的DNS查找在没有EDNS的情况下工作,但没有?

时间:2017-01-05 03:05:34

标签: dns

我正在尝试构建自定义DNS服务器以返回程序化结果。现在,我只是以SPF格式返回它给出的查询的一部分,当我指定我的服务器的确切IP时,它可以正常工作:

$ dig @54.183.223.221 127.0.0.5._ip.test.com._ehlo.foo.com._spf.moat.email. TXT

; <<>> DiG 9.8.3-P1 <<>> @54.183.223.221 127.0.0.5._ip.test.com._ehlo.foo.com._spf.moat.email. TXT
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 62640
;; flags: qr rd; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 0
;; WARNING: recursion requested but not available

;; QUESTION SECTION:
;127.0.0.5._ip.test.com._ehlo.foo.com._spf.moat.email. IN TXT

;; ANSWER SECTION:
foo.com.        600 IN  TXT "v=spf1 include:test.com -all"

;; Query time: 19 msec
;; SERVER: 54.183.223.221#53(54.183.223.221)
;; WHEN: Fri Jan  6 18:05:55 2017
;; MSG SIZE  rcvd: 118

但是,在未指定IP的情况下运行相同的命令并不能找到任何内容。通过查看我的DNS服务器日志,我知道它使用相同的问题点击我的服务器(并且可能以相同的方式响应),但dig似乎没有得到回复:< / p>

$ dig 127.0.0.5._ip.test.com._ehlo.foo.com._spf.moat.email. TXT

; <<>> DiG 9.8.3-P1 <<>> 127.0.0.5._ip.test.com._ehlo.foo.com._spf.moat.email. TXT
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: SERVFAIL, id: 8929
;; flags: qr rd ra; QUERY: 1, ANSWER: 0, AUTHORITY: 0, ADDITIONAL: 0

;; QUESTION SECTION:
;127.0.0.5._ip.test.com._ehlo.foo.com._spf.moat.email. IN TXT

;; Query time: 254 msec
;; SERVER: 10.0.1.1#53(10.0.1.1)
;; WHEN: Fri Jan  6 18:10:00 2017
;; MSG SIZE  rcvd: 70

事实证明,这两个挖掘查询创建了两个略有不同的DNS查询。有了IP,我得到了:

;; opcode: QUERY, status: NOERROR, id: 53947
;; flags: rd; QUERY: 1, ANSWER: 0, AUTHORITY: 0, ADDITIONAL: 0

;; QUESTION SECTION:
;127.0.0.20._ip.test.com._ehlo.foo.com._spf.moat.email. IN   TXT

没有IP,我得到:

;; opcode: QUERY, status: NOERROR, id: 34502
;; flags:; QUERY: 1, ANSWER: 0, AUTHORITY: 0, ADDITIONAL: 1

;; QUESTION SECTION:
;127.0.0.10._ip.test.com._ehlo.foo.com._spf.moat.email. IN   TXT

;; ADDITIONAL SECTION:

;; OPT PSEUDOSECTION:
; EDNS: version 0; flags: do; udp: 4096

这个可能导致问题的额外EDNS部分是什么?当我通过添加+bufsize=4096 +dnssec来模拟针对本地开发服务器的EDNS时,它可以正常工作。什么是开始寻找为什么我对EDNS没有回应的好地方?

3 个答案:

答案 0 :(得分:1)

当你说+tracedig时,你要求它做自己的递归并打印结果。如果不这样做,它只会询问系统配置的递归解析器来完成工作,并打印出来的结果。

上面示例中您要特别注意的行是以;; Received开头的行和以SERVER:开头的行。您可能还想阅读dig的手册页,以了解如何指定要将其查询发送到的服务器。

答案 1 :(得分:1)

我无法自己运行查询,但查看您描述的行为,我想知道这是否是一个dnssec验证问题。未指定dns服务器时使用配置的recursor,它可能是dnssec验证recursor。查看是否为真的一种方法是使用带有dig的+ CD进行查询(这将设置“检查已禁用”标志)。这将允许返回结果,即使它失败了dnssec。不幸的是,SERVFAIL有点过载,这是它的意思之一。

答案 2 :(得分:0)

诀窍在答案部分:

127.0.0.5...

答案不是完整的字符串foo.com,只是cd。一旦我将答案部分改为完整字符串,它就很有效。万岁为红鲱鱼!