djbdns / tinydns 是否支持长 TXT 记录

djbdns / tinydns 是否支持长 TXT 记录

djbdns/tinydns 是否支持大TXT记录,例如在提供长 DKIM 密钥时?

我知道 RFC 4408 第 3.1.3 节和 RFC 1035 第 3.3.14 节:

https://www.rfc-editor.org/rfc/rfc4408#section-3.1.3

https://www.rfc-editor.org/rfc/rfc1035#section-3.3.14

两者都表明TXT可以将记录分成多个字符串,以允许提供长(> 255 个字符)记录。

我在研究过程中也遇到了这个问题:

https://serverfault.com/questions/255580/how-do-i-enter-a-strong-long-dkim-key-into-dns

我尝试了接受的答案中提到的两种方法,带和不带括号。

但是 djbdns 拒绝正确提供这些记录。例如,当我使用以下命令查询我的 domainkey 记录时,nslookup我得到:

mail03._domainkey.zygonia.net   text =

    ""v=DKIM1; k=rsa; p=" "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA7UNgSlnndT9JY0soSjxLhFFnvAeVN8b6Y3oKctAunNltMjvXfTD37doER8a9xwEOIXkGPgxJ5UPb/KndvHiIo+j8AScoIZCW"
    "glFWp4AUoKlQkKP7o7vwFnWypU+DmcJAtyuhZ9X5yzag37cVR"
    "YD4icd02yAETLbIpv1mnMUFkTnkdmtSa5gL2cLUueUOValoENwkWTcZR" "+kraTEU/VDPI"
    "RgNBu6OJmQdk0sv4qdkwVVvxvquT4C/SimQDoDaQwlFCp2sBryXyaNSRCaAhRxPaKUpKsPmubW0SJF2nQZ3DprJQcaRQLd9Qgxz+V+XaseaXXWPy+6"
    "tB6BlPFk5FwIDAQAB""

*** Error: record size incorrect (515 != 419)

*** ns0.example.net can't find mail03._domainkey.zygonia.net: Unspecified error

其 DKIMTXT记录如下:

"v=DKIM1; k=rsa; p=" "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA7UNgSlnndT9JY0soSjxLhFFnvAeVN8b6Y3oKctAunNltMjvXfTD37doER8a9xwEOIXkGPgxJ5UPb/KndvHiIo+j8AScoIZCW1glFWp4AUoKlQkKP7o7vwFnWypU+DmcJAtyuhZ9X5yzag37cVRGYD4icd02yAETLbIpv1mnMUFkTnkdmtSa5gL2cLUueUOValoENwkWTcZR" "+kraTEU/VDPIrRgNBu6OJmQdk0sv4qdkwVVvxvquT4C/SimQDoDaQwlFCp2sBryXyaNSRCaAhRxPaKUpKsPmubW0SJF2nQZ3DprJQcaRQLd9Qgxz+V+XaseaXXWPy+6rtB6BlPFk5FwIDAQAB"

原始 djbdns 数据记录如下所示:

:mail03._domainkey.zygonia.net:16:\642"v=DKIM1;\040k=rsa;\040p="\040"MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA7UNgSlnndT9JY0soSjxLhFFnvAeVN8b6Y3oKctAunNltMjvXfTD37doER8a9xwEOIXkGPgxJ5UPb\057KndvHiIo+j8AScoIZCW1glFWp4AUoKlQkKP7o7vwFnWypU+DmcJAtyuhZ9X5yzag37cVRGYD4icd02yAETLbIpv1mnMUFkTnkdmtSa5gL2cLUueUOValoENwkWTcZR"\040"+kraTEU\057VDPIrRgNBu6OJmQdk0sv4qdkwVVvxvquT4C\057SimQDoDaQwlFCp2sBryXyaNSRCaAhRxPaKUpKsPmubW0SJF2nQZ3DprJQcaRQLd9Qgxz+V+XaseaXXWPy+6rtB6BlPFk5FwIDAQAB":600

当谈到长TXT记录时,djbdns 就没有希望了吗?

答案1

关于 TXT 记录的一些背景知识以及它们如何用于 DKIM

TXT记录是多值的,每​​个值都是一个字符串,最多可包含 255 个字节。

在您的示例中,您首先使用TXT标准主文件格式指定的建议记录,该记录有三个值。
引号表示有三个值,请注意,这些值实际上不是记录数据的一部分,它们仅指定每个值的开始和结束位置。

您的TXT价值:

"v=DKIM1; k=rsa; p=" "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA7UNgSlnndT9JY0soSjxLhFFnvAeVN8b6Y3oKctAunNltMjvXfTD37doER8a9xwEOIXkGPgxJ5UPb/KndvHiIo+j8AScoIZCW1glFWp4AUoKlQkKP7o7vwFnWypU+DmcJAtyuhZ9X5yzag37cVRGYD4icd02yAETLbIpv1mnMUFkTnkdmtSa5gL2cLUueUOValoENwkWTcZR" "+kraTEU/VDPIrRgNBu6OJmQdk0sv4qdkwVVvxvquT4C/SimQDoDaQwlFCp2sBryXyaNSRCaAhRxPaKUpKsPmubW0SJF2nQZ3DprJQcaRQLd9Qgxz+V+XaseaXXWPy+6rtB6BlPFk5FwIDAQAB"

方法:

  • v=DKIM1; k=rsa; p=
  • MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA7UNgSlnndT9JY0soSjxLhFFnvAeVN8b6Y3oKctAunNltMjvXfTD37doER8a9xwEOIXkGPgxJ5UPb/KndvHiIo+j8AScoIZCW1glFWp4AUoKlQkKP7o7vwFnWypU+DmcJAtyuhZ9X5yzag37cVRGYD4icd02yAETLbIpv1mnMUFkTnkdmtSa5gL2cLUueUOValoENwkWTcZR
  • +kraTEU/VDPIrRgNBu6OJmQdk0sv4qdkwVVvxvquT4C/SimQDoDaQwlFCp2sBryXyaNSRCaAhRxPaKUpKsPmubW0SJF2nQZ3DprJQcaRQLd9Qgxz+V+XaseaXXWPy+6rtB6BlPFk5FwIDAQAB

对于 DKIM 而言,拥有多个值实际上没有意义,但由于记录的每个值的TXT长度有限,并且 DKIM 规范认识到这一点,并规定,对于 DKIM 而言,多个值应该简单地连接成一个长字符串这允许使用长密钥。

即,DKIM 客户端会将上述值连接成字符串

v=DKIM1; k=rsa; p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA7UNgSlnndT9JY0soSjxLhFFnvAeVN8b6Y3oKctAunNltMjvXfTD37doER8a9xwEOIXkGPgxJ5UPb/KndvHiIo+j8AScoIZCW1glFWp4AUoKlQkKP7o7vwFnWypU+DmcJAtyuhZ9X5yzag37cVRGYD4icd02yAETLbIpv1mnMUFkTnkdmtSa5gL2cLUueUOValoENwkWTcZR+kraTEU/VDPIrRgNBu6OJmQdk0sv4qdkwVVvxvquT4C/SimQDoDaQwlFCp2sBryXyaNSRCaAhRxPaKUpKsPmubW0SJF2nQZ3DprJQcaRQLd9Qgxz+V+XaseaXXWPy+6rtB6BlPFk5FwIDAQAB  

这也意味着上述字符串可以在不同位置拆分而不会改变 DKIM 中的含义。


Tinydns 和 TXT

Tinydns 有两种方式可以用来表示记录TXT(从https://cr.yp.to/djbdns/tinydns-data.html):

1)

'fqdn:s:ttl:timestamp:lo 

fqdn 的 TXT(“文本”)记录。tinydns-data 为包含字符串 s 的 fqdn 创建 TXT 记录。您可以使用八进制 \nnn 代码在 s 内包含任意字节;例如,\072 是冒号。

2)

:fqdn:n:rdata:ttl:timestamp:lo

fqdn 的通用记录。tinydns-data 为显示 rdata 的 fqdn 创建类型为 n 的记录。n 必须是 1 到 65535 之间的整数;不能是 2 (NS)、5 (CNAME)、6 (SOA)、12 (PTR)、15 (MX) 或 252 (AXFR)。rdata 的正确格式取决于 n。您可以使用八进制 \nnn 代码在 rdata 中包含任意字节。


内置支持(上面的 1)似乎TXT不允许明确指定多个值,但是,虽然手册没有说明这一点,但我发现有迹象表明它会自行拆分长字符串。

即,类似这样的操作应该可以工作(假设自动分割的信息实际上是正确的):

'mail03._domainkey.zygonia.net:v=DKIM1; k=rsa; p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA7UNgSlnndT9JY0soSjxLhFFnvAeVN8b6Y3oKctAunNltMjvXfTD37doER8a9xwEOIXkGPgxJ5UPb/KndvHiIo+j8AScoIZCW1glFWp4AUoKlQkKP7o7vwFnWypU+DmcJAtyuhZ9X5yzag37cVRGYD4icd02yAETLbIpv1mnMUFkTnkdmtSa5gL2cLUueUOValoENwkWTcZR+kraTEU/VDPIrRgNBu6OJmQdk0sv4qdkwVVvxvquT4C/SimQDoDaQwlFCp2sBryXyaNSRCaAhRxPaKUpKsPmubW0SJF2nQZ3DprJQcaRQLd9Qgxz+V+XaseaXXWPy+6rtB6BlPFk5FwIDAQAB:7200

另一个选项,通用记录支持(上面的 2),只要你给它适当的数据

问题是,数据引用有一个非常低级的表示,你绝对不能只是把一些纯文本放在那里并期望它能工作。
也就是说,如果你选择在 tinydns 中输入通用记录数据,那么主文件格式的记录表示(你通常使用的友好纯文本记录数据,例如建议给你的记录数据)对你没有帮助,但你宁愿查找如何将这些数据转换为 DNS 有线格式(DNS 协议中使用的实际二进制格式)并将其写入(必要时转义有问题的字节)数据场地。

即,对于一条TXT记录,您将拥有以其长度为前缀的值字符串(单字节整数,需要以八进制进行转义,如文档中所述)。


djbdns/tinydns 是不是没戏了?

在我看来并不是因为它TXT专门处理记录。

然而,这款软件的官方版本自 2001 年(1.05 版)以来就没有更新过。虽然
有补丁和分支可以解决各种缺陷(DNS 协议以及我们的需求和期望在过去 15 年中不断发展),但我认为切换到维护更好、更新的 DNS 服务器实现更有意义。

相关内容