我正在尝试构建自定义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没有回应的好地方?
答案 0 :(得分:1)
当你说+trace
到dig
时,你要求它做自己的递归并打印结果。如果不这样做,它只会询问系统配置的递归解析器来完成工作,并打印出来的结果。
上面示例中您要特别注意的行是以;; Received
开头的行和以SERVER:
开头的行。您可能还想阅读dig
的手册页,以了解如何指定要将其查询发送到的服务器。
答案 1 :(得分:1)
我无法自己运行查询,但查看您描述的行为,我想知道这是否是一个dnssec验证问题。未指定dns服务器时使用配置的recursor,它可能是dnssec验证recursor。查看是否为真的一种方法是使用带有dig的+ CD进行查询(这将设置“检查已禁用”标志)。这将允许返回结果,即使它失败了dnssec。不幸的是,SERVFAIL有点过载,这是它的意思之一。
答案 2 :(得分:0)
诀窍在答案部分:
127.0.0.5...
答案不是完整的字符串foo.com
,只是cd
。一旦我将答案部分改为完整字符串,它就很有效。万岁为红鲱鱼!