【问题标题】:DNS Response PacketsDNS 响应数据包
【发布时间】:2011-05-07 11:37:59
【问题描述】:

我正在尝试编写自己的 DNS 服务器,我正在阅读 DNS 上的 RFC1035,但我有一些疑问:

1) 我希望我的服务器以 CNAME 响应特定请求,但没有 A 记录 - 我可以这样做吗?例如,接收'server1.com'的请求,响应'CNAME server2.com',然后客户端查询另一个DNS服务器以获取'server2.com'的A记录。 我目前将标头设置为:'\x84\x00' 表示这是权威服务器,但递归是不可能的。是这样吗?

2) 我希望我的服务器不响应任何其他请求的记录,以便客户端随后查询不同的 DNS 服务器以获取记录。我目前已将标头设置为 '\x83\x03' 以发出 NAME ERROR 回复代码。这是正确的吗?那么我该怎么做,在所有其他字段中为零,或者只是在那里结束数据包?我不想回答“这个名字不存在”,而是“我不知道这个名字,试试其他人” - 我该怎么做?

非常感谢:)

【问题讨论】:

    标签: dns


    【解决方案1】:
    1. 听起来是对的——事实上,CNAME with A 记录不正确(RFC1034 section 3.6.2:“如果节点上存在 CNAME RR,则不应存在其他数据”)。 p>

    2. 这将是权威域名服务器非常不寻常的行为 - 我建议重新考虑它或至少使用一些现实生活中的解析器进行测试,以确保它们能满足您的需求。 RCODE #3(“名称错误”或 NXDOMAIN)是对名称不存在的肯定确认。这将导致解析器终止解析并可能缓存不存在的名称,这听起来不像您所追求的。如果您希望解析器查询被委派给该区域的其他名称服务器之一,我猜 SERVFAIL (RCODE #2) 是最合适/最可能产生预期效果的。

    顺便说一句,为了调试你的 DNS 数据包的确切格式,我强烈推荐 Wireshark 与将十六进制代码粘贴到 Stack Overflow 相比,它的解码准确性;)

    【讨论】:

    • 谢谢 Simon - 我询问带有 A 记录的 CNAME 的原因是查看 wireshark 捕获,来自 DNS 服务器的单个响应有多个记录,一个 CNAME,然后是附加的 A 记录。但是如果只返回一个 CNAME 是有效的,那很好。是的,我会尝试 RCODE #2 并查看更多的数据包捕获 :) 谢谢!
    • 其实没有A记录的CNAME好像不行。我可以 NSLOOKUP 并很好地检索 CNAME 记录,但如果我尝试 ping 它仍然没有 A 记录,所以响应“未知主机” - 有什么想法吗?
    • 您是使用nslookup 直接查询权威域名服务器,还是通过递归域名服务器?
    • 直接,也许这就是我做错了:) 所以如果我在 server1.com 上托管我的 custon dns,我将 server1 的 ns 记录设置为我的服务器 ip,所以当外部客户端查询时他们的 dns,它从 server1.com 检索 CNAME,然后在他们的 dns 上解析它?
    • 正确 - 一旦他们的名称服务器检索到 CNAME,它就会对 server2.com 执行新查询,然后将结果与中间 CNAME 一起附加到最终响应中 - 因此客户端会收到一个包含两条记录的数据包.
    【解决方案2】:

    在 CNAME 的情况下,您的(权威)服务器应该只在答案部分返回 CNAME除非它对于 CNAME 指向的域也是权威的,在这种情况下它还应该包括跟随 CNAME 的结果。

    对于第二种情况,您应该返回 RCODE 5 ("REFUSED") - 这是权威服务器在询问有关未配置域的问题时应该给出的首选错误。

    之后,您仍然需要发送四个 16 位计数字段和原始请求中问题的副本。在这种情况下,四个计数将是 (1, 0, 0, 0) - 一个问题,没有答案,没有 ns 记录,没有其他记录。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-11-25
      • 1970-01-01
      • 2016-08-16
      • 2012-08-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-21
      相关资源
      最近更新 更多