djbdns/tinydns是否支持长TXT记录

Kev*_*Kev 3 domain-name-system djbdns tinydns

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 拒绝正确提供这些记录。例如,当使用查询我的域名密钥记录时,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
Run Code Online (Sandbox Code Playgroud)

这是一个 DKIMTXT记录,如下所示:

"v=DKIM1; k=rsa; p=" "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA7UNgSlnndT9JY0soSjxLhFFnvAeVN8b6Y3oKctAunNltMjvXfTD37doER8a9xwEOIXkGPgxJ5UPb/KndvHiIo+j8AScoIZCW1glFWp4AUoKlQkKP7o7vwFnWypU+DmcJAtyuhZ9X5yzag37cVRGYD4icd02yAETLbIpv1mnMUFkTnkdmtSa5gL2cLUueUOValoENwkWTcZR" "+kraTEU/VDPIrRgNBu6OJmQdk0sv4qdkwVVvxvquT4C/SimQDoDaQwlFCp2sBryXyaNSRCaAhRxPaKUpKsPmubW0SJF2nQZ3DprJQcaRQLd9Qgxz+V+XaseaXXWPy+6rtB6BlPFk5FwIDAQAB"
Run Code Online (Sandbox Code Playgroud)

原始 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
Run Code Online (Sandbox Code Playgroud)

TXT当涉及到长记录时,djbdns 会失败吗?

Håk*_*ist 5

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

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

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

您的TXT价值:

"v=DKIM1; k=rsa; p=" "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA7UNgSlnndT9JY0soSjxLhFFnvAeVN8b6Y3oKctAunNltMjvXfTD37doER8a9xwEOIXkGPgxJ5UPb/KndvHiIo+j8AScoIZCW1glFWp4AUoKlQkKP7o7vwFnWypU+DmcJAtyuhZ9X5yzag37cVRGYD4icd02yAETLbIpv1mnMUFkTnkdmtSa5gL2cLUueUOValoENwkWTcZR" "+kraTEU/VDPIrRgNBu6OJmQdk0sv4qdkwVVvxvquT4C/SimQDoDaQwlFCp2sBryXyaNSRCaAhRxPaKUpKsPmubW0SJF2nQZ3DprJQcaRQLd9Qgxz+V+XaseaXXWPy+6rtB6BlPFk5FwIDAQAB"
Run Code Online (Sandbox Code Playgroud)

方法:

  • 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  
Run Code Online (Sandbox Code Playgroud)

这也意味着上面的字符串可以在不同的位置进行分割,而不会改变 DKIM 中的含义。


Tinydns 和 TXT

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

1)

'fqdn:s:ttl:timestamp:lo 
Run Code Online (Sandbox Code Playgroud)

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

2)

:fqdn:n:rdata:ttl:timestamp:lo
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

另一个选项,即通用记录支持(上面的 2),只要您为其提供适当的rdata ,就肯定会起作用。

问题是,那里引用的rdata是一个非常低级的表示,你绝对不能只是在其中放置一些纯文本并期望它能够工作。
也就是说,如果您沿着在tinydns中输入通用记录数据的路线,记录的主文件格式表示(您通常使用的友好纯文本记录数据,例如建议的记录数据)将不会真正帮助您)但您宁愿查找该数据如何转换为 DNS 有线格式(DNS 协议中使用的实际二进制格式)并将其写入(根据需要转义有问题的字节)到 rdata 字段

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


djbdns/tinydns 是失败的原因吗?

造成这种情况的原因并不是因为它专门处理TXT记录。

然而,该软件的正式版本自 2001 年(版本 1.05)以来就没有任何更新。
有一些补丁和分支可以解决各种缺陷(DNS 协议以及我们的需求和期望在这 15 年中不断发展),但我认为切换到更好维护和最新的 DNS 服务器实施会更有意义。