发送CNAME记录作为CNAME DNS查询的答案

问题描述 投票:0回答:1

我想在我的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个回答
0
投票

[如果您查看https://salsa.debian.org/dns-team/bind9/blob/debian/master/lib/dns/name.c处的dig源代码,您将看到错误“错误的标签类型”为DNS_R_BADLABELTYPE,并且仅当字节的值为91 10或64 10 包含192 10,因为它们都表示编码名称时出现问题。

从您的缓冲区:

  • [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 01 QDCOUNT,问题部分有1个条目
  • [00 01 ANCOUNT,答案部分有1个条目
  • [00 00 NSCOUNT,权限部分为0项
  • [00 00 ARCOUNT,其他部分为0个条目

现在是问题:

  • [04一个4字节的标签
  • 74 65 73 74,即test
  • [03 3字节的标签
  • 63 6f 6d,即com
  • [00一个0字节的标签,即根]
  • [00 05类型,CNAME
  • [00 01类,IN

现在我们进入答案部分:

  • c0 0c表示指向位置0c的指针(第一个字节设置了2个第一位),即13 10。在该位置,我们再次发现test.com74 65 73 74 03 63 6f 6d 00
  • [00 05类型,CNAME
  • [00 01类,IN
  • 00 00 00 00 TTL,0
  • [00 0a RDLENGTH,后续数据的大小,10个字节
  • 对于CNAME记录类型,RDLENGTH值后面的RDATA再次是名称
  • 所以现在要考虑的10个字节是73 65 63 6f 6e 64 54 65 73 74,前1个或2个字节应该是大小或指针,但是73 16是115 10,因此您到达了最上面描述的情况并导致出现错误消息,因为该字节以01 2开头,并且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的区别是,如果您想在T的前t内使用tsecondTest

© www.soinside.com 2019 - 2024. All rights reserved.