【问题标题】:Send a CNAME Record as Answer of a CNAME DNS query发送 CNAME 记录作为 CNAME DNS 查询的答案
【发布时间】:2019-10-21 08:14:22
【问题描述】:

我想在我的 node.js dns 服务器中回答 CNAME 查询,并且我想将我的回答部分放在响应的缓冲区中。我已经为答案部分尝试了这个缓冲区,并在 Windows 中使用 dig 模块对其进行了测试并得到了这个答案:

    ;; Got bad packet: bad label type
    53 bytes
    0d c4 85 80 00 01 00 01 00 00 00 00 04 74 65 73          .............tes
    74 03 63 6f 6d 00 00 05 00 01 c0 0c 00 05 00 01          t.com...........
    00 00 00 00 00 0a 73 65 63 6f 6e 64 54 65 73 74          ......secondTest
    03 63 6f 6d 00                                           .com.

我已将此缓冲区作为答案部分发送给客户端:

[170,254,133,128,0,1,0,1,0,0,0,0,4,116,101,115,116,3,99,111,109,0,0,5,0,1,192,12,0,5,0,1,0,0,0,0,0,10,115,101,99,111,110,100,84,101,115,116,3,99,111,109,0]

我不知道这有什么问题?

【问题讨论】:

    标签: node.js dns


    【解决方案1】:

    如果您查看 https://salsa.debian.org/dns-team/bind9/blob/debian/master/lib/dns/name.c 的 dig 源代码,您将看到错误“错误标签类型”为 DNS_R_BADLABELTYPE,并且仅当字节具有值 9110 或介于两者之间的任何值时才会发生6410 和 19210 因为它们都表示编码名称的问题。

    从您的缓冲区中:

    • 0d c4,一个 16 位的 ID,用于识别消息
    • 85 801 0000 1 0 1 1 000 0000 这意味着:
      • 1:消息是响应
      • 0000:标准查询
      • 1:AA,权威解答
      • 0:TC,未截断
      • 1: RD,需要递归
      • 1: RA,递归可用
      • 000:Z,必须为零
      • 0000:RCODE,没有错误
    • 00 01QDCOUNT,问题部分有 1 个条目
    • 00 01ANCOUNT,答案部分有 1 个条目
    • 00 00NSCOUNT,权限部分有 0 个条目
    • 00 00 ARCOUNT,附加部分中有 0 个条目

    现在的问题:

    • 04 4 个字节的标签
    • 74 65 73 74test
    • 03 3 个字节的标签
    • 63 6f 6dcom
    • 00一个0字节的标签,即root
    • 00 05 类型,CNAME
    • 00 01班级,IN

    现在我们进入答案部分:

    • c0 0c 表示指向0c 位置的指针(第一个字节设置了 2 个第一位),即 1310。在那个位置,我们再次找到test.com74 65 73 74 03 63 6f 6d 00
    • 00 05 类型,CNAME
    • 00 01班级,IN
    • 00 00 00 00 TTL,0
    • 00 0aRDLENGTH,后面数据的大小,10字节
    • 对于 CNAME 记录类型,RDLENGTH 值后面的 RDATA 又是一个名称
    • 所以现在要考虑的 10 个字节是 73 65 63 6f 6e 64 54 65 73 74 前 1 或 2 个字节应该是大小或指针,但 7316 是 11510,因此您到达顶部描述的情况并导致错误消息,因为字节以 012 开头,并且 RFC 1035 明确表示:“(保留 10 和 01 组合供将来使用。)

    如果你想要test.com. 0 IN CNAME secondTest.com,这应该会产生以下缓冲区(没有名称压缩): 04 74 65 73 74 03 63 6f 6d 00 00 05 00 01 00 00 00 00 00 10 0a 73 65 63 6f 6e 64 74 65 73 74 03 63 6f 6d 00

    所以实际上您需要将 0,10,115,101,99,111,110,100,84,101,115,116,3,99,111,109,0 替换为 0,16,10,115,101,99,111,110,100,116,101,115,116,3,99,111,109,0

    那是您缺少第一个 16 字节。 (以及稍后的84116 的区别是,如果您想要TtsecondTest 的第一个t 中)

    【讨论】:

    • 谢谢。那行得通。这是我的问题的一个很好的答案。
    猜你喜欢
    • 2020-06-27
    • 2011-10-06
    • 1970-01-01
    • 2016-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-13
    • 1970-01-01
    相关资源
    最近更新 更多