我正在尝试编写自己的DNS服务器代码,我正在通过DNS上的RFC1035阅读,但我有一些疑问:
1)我希望我的服务器使用CNAME响应特定请求,但没有A记录 - 我可以这样做吗?例如,接收“server1.com”请求,响应“CNAME server2.com”,然后客户端查询另一个DNS服务器以获取“server2.com”的A记录。 我目前将标题设置为:'\ x84 \ x00',这样说这是授权服务器,但是无法进行递归。这是对的吗?
2)我希望我的服务器响应任何其他请求没有记录,这样客户端就会向不同的DNS服务器查询记录。我目前将标题设置为'\ x83 \ x03',以表示NAME ERROR回复代码。这是正确的吗?那我该怎么做呢,在所有其他字段中都是零,或者只是在那里结束数据包?我不想回答“这个名字不存在”,而是“我不知道这个名字,试试别人” - 我该怎么做?
非常感谢:)
答案 0 :(得分:1)
听起来不错 - 事实上,带有 A记录的CNAME 不正确(RFC1034 section 3.6.2:“如果节点上存在CNAME RR,则不应存在其他数据“)。
这是来自权威名称服务器的非常不寻常的行为 - 我建议重新考虑它或至少测试一些现实生活中的解析器以确保他们做你想要的。 RCODE#3(“名称错误”或NXDOMAIN)肯定确认名称不存在。这将导致解析器终止解析并可能缓存名称的不存在,这听起来不像你所追求的那样。如果您希望解析器查询委派给该区域的其他名称服务器之一,我认为SERVFAIL(RCODE#2)是最合适/可能具有所需效果的。
顺便说一句,为了调试DNS数据包的确切格式,与将十六进制代码粘贴到Stack Overflow相比,我强烈建议Wireshark解码其准确性;)
答案 1 :(得分:1)
在CNAME情况下,您的(权威)服务器应该只在的答案部分中返回CNAME,除非它对CNAME指向的域也具有权威性,在这种情况下它还应包括跟随CNAME的结果。
对于第二种情况,您应该返回RCODE 5(“REFUSED”) - 这是权威服务器在被问到未配置域的问题时应该给出的首选错误。
之后,您仍然需要从原始请求发送四个16位计数字段和一个问题副本。在这种情况下,四个计数将是(1,0,0,0) - 一个问题,没有答案,没有ns记录,没有其他记录。