DNS响应数据包
我试图代码我自己的DNS服务器,我通过在DNS RFC1035阅读,但我有几个疑问:DNS响应数据包
1)我希望我的服务器与CNAME特定响应请求,但没有A记录 - 我可以这样做吗?例如,接收'server1.com'的请求,响应'CNAME server2.com',然后客户端查询另一台DNS服务器以获取'server2.com'的A记录。 我目前已经将标头设置为:'\ x84 \ x00'这样说,这是授权服务器,但递归是不可能的。这是正确的吗?
2)我希望我的服务器响应任何其他请求没有记录,以便客户端然后查询不同的DNS服务器的记录。我目前已经将标题设置为'\ x83 \ x03',以便发出NAME ERROR回复代码的信号。这是正确的吗?那么我应该怎么做呢,在其他所有领域都是零,或者只是在那里结束数据包?我不想用'这个名字不存在'作为回应,而是'我不知道这个名字,尝试别人' - 我该怎么做?
非常感谢:)
听起来是正确的 - 事实上,CNAME 与 A记录不正确(RFC1034 section 3.6.2:“如果一个CNAME RR存在于一个节点,没有其他数据应该存在“)。
这将是一个非常不寻常的行为从权威的名称服务器 - 我会建议重新考虑它,或者至少测试一些真实生活的解析器,以确保他们做你想做的。 RCODE#3(“名称错误”或NXDOMAIN)是肯定确认名称不存在。这会导致解析器终止解析并可能缓存该名称的不存在,这听起来不像你所追求的。如果你想解析器查询委托给该区域的其他名称服务器之一,我猜SERVFAIL(RCODE#2)是最合适的/可能有所需的效果。
顺便说一句,用于调试您的DNS数据包的确切格式我强烈推荐Wireshark其解码精度粘贴十六进制代码到堆栈溢出比较;)
在CNAME情况下,你(权威)服务器只应返回答案部分中的CNAME,除非它对CNAME指向的域也具有权威性,在这种情况下,它还应包含跟随CNAME的结果。
对于第二种情况,您应该返回RCODE 5(“REFUSED”) - 这是权威服务器在问一个未配置域的问题时应该给出的首选错误。
接下来,您仍然需要发送四个16位计数字段和来自原始请求的问题的副本。在这种情况下,四个计数将是(1,0,0,0) - 一个问题,没有答案,没有ns记录,没有额外的记录。
谢谢西蒙 - 我问CNAME与A记录的原因是,看着wireshark捕获,来自DNS服务器的单个响应有多个记录,一个CNAME,然后附加的A记录。但是,如果只返回一个CNAME是有效的,那很好。是的,我会尝试RCODE#2,看看更多的数据包捕获:)谢谢! – Technosites 2010-11-10 16:46:37
实际上,没有A记录的CNAME似乎不起作用。我可以NSLOOKUP和检索CNAME记录罚款,但如果我尝试ping它仍然没有得到一个记录,所以回应'未知主机' - 任何想法? – Technosites 2010-11-10 18:09:24
您是使用'nslookup'直接查询授权的域名服务器,还是通过递归的域名服务器? – SimonJ 2010-11-10 18:20:31