Поддерживает ли djbdns / tinydns большой TXT
записи, например при обслуживании длинных ключей DKIM?
Я знаю RFC 4408 раздел 3.1.3 и RFC 1035 раздел 3.3.14:
Оба предполагают, что TXT
запись может быть разделена на несколько строк символов, чтобы разрешить обслуживание длинных (> 255 символов) записей.
Я также столкнулся с этим вопросом во время своего исследования:
Я попытался использовать оба подхода, упомянутые в принятом ответе, с круглыми скобками и без них.
Но 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
Это с DKIM TXT
запись, которая выглядит так:
"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
Является ли djbdns безнадежным делом, когда дело доходит до длинных TXT
записи?
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
запись (от https://cr.yp.to/djbdns/tinydns-data.html):
1)
'fqdn:s:ttl:timestamp:lo
Запись TXT (`` текстовая '') для fqdn. tinydns-data создает запись TXT для fqdn, содержащую строку s. Вы можете использовать восьмеричные коды \ nnn для включения произвольных байтов внутри s; например, \ 072 - это двоеточие.
2)
:fqdn:n:rdata:ttl:timestamp:lo
Общая запись для fqdn. tinydns-data создает запись типа n для fqdn, показывающую rdata. n должно быть целым числом от 1 до 65535; он не должен быть 2 (NS), 5 (CNAME), 6 (SOA), 12 (PTR), 15 (MX) или 252 (AXFR). Правильный формат rdata зависит от n. Вы можете использовать восьмеричные коды \ nnn для включения произвольных байтов в rdata.
Не похоже, что встроенный TXT
support (1 выше) позволяет явно указывать несколько значений, но, хотя в руководстве это не указано, я обнаружил признаки того, что он самостоятельно разбивает длинную строку.
Т.е. должно работать что-то вроде этого (при условии, что информация об автоматическом разбиении действительно верна):
'mail03._domainkey.zygonia.net:v=DKIM1; k=rsa; p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA7UNgSlnndT9JY0soSjxLhFFnvAeVN8b6Y3oKctAunNltMjvXfTD37doER8a9xwEOIXkGPgxJ5UPb/KndvHiIo+j8AScoIZCW1glFWp4AUoKlQkKP7o7vwFnWypU+DmcJAtyuhZ9X5yzag37cVRGYD4icd02yAETLbIpv1mnMUFkTnkdmtSa5gL2cLUueUOValoENwkWTcZR+kraTEU/VDPIrRgNBu6OJmQdk0sv4qdkwVVvxvquT4C/SimQDoDaQwlFCp2sBryXyaNSRCaAhRxPaKUpKsPmubW0SJF2nQZ3DprJQcaRQLd9Qgxz+V+XaseaXXWPy+6rtB6BlPFk5FwIDAQAB:7200
Другой вариант, поддержка общих записей (2 выше), наверняка будет работать, если вы дадите ему соответствующие rdata.
Дело в том, что rdata упоминается, что это очень низкоуровневое представление, вы абсолютно не можете просто вставить туда какой-то простой текст и ожидать, что он сработает.
То есть, если вы пойдете по пути ввода общих данных записи в tinydns, вам действительно не поможет представление записей в формате основного файла (удобные данные записи в виде простого текста, с которыми вы обычно работаете, например данные записи, которые были предложены вам), но вам лучше посмотреть, как эти данные преобразуются в проводной формат DNS (фактический двоичный формат, используемый в протоколе DNS), и записать это (при необходимости избегая проблемных байтов) в rdata поле.
Т.е. для TXT
record у вас будут строки значений с префиксом их длины (однобайтовое целое число, которое необходимо экранировать в восьмеричном, как указано в документации).
Afaict не потому, что он TXT
записи конкретно.
Однако это программное обеспечение, которое в официальном виде не имеет обновлений с 2001 года (версия 1.05).
Существуют патчи и форки, которые устраняют различные недостатки (протокол DNS, а также наши требования и ожидания продолжали развиваться в течение этих 15 лет), но я думаю, что было бы разумнее перейти на более поддерживаемую и обновленную реализацию DNS-сервера.