Поддерживает ли djbdns / tinydns длинные записи TXT

Поддерживает ли djbdns/tinydns большое TXT записи, например при обслуживании длинных ключей DKIM?

Мне известны RFC 4408 раздел 3.1.3 и RFC 1035 раздел 3.3.14:

https://tools.ietf.org/html/rfc4408

https://tools.ietf.org/html/rfc1035

Которые оба предполагают, что TXT запись может быть разбита на несколько строк символов, чтобы можно было обслуживать длинные (>255 символов) записи.

Я также столкнулся с этим вопросом во время моего исследования:

Как мне ввести сильный (длинный) ключ DKIM в 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

Это с ДКИМ 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 записи?

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 

TXT (`` text '') запись для 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, на который ссылаются, это очень низкоуровневое представление, вы абсолютно не можете просто вставить туда какой-нибудь простой текст и ожидать, что он будет работать.
Т.е., если вы пойдете по пути ввода общих данных записей в tinydns, вам на самом деле не поможет представление записей в формате основного файла (дружественные обычные текстовые записи, с которыми вы обычно работаете, такие как предложенные данные записей). вам), но вам лучше посмотреть, как эти данные преобразуются в проводной формат DNS (фактический двоичный формат, используемый в протоколе DNS), и записать это (экранируя проблемные байты при необходимости) в поле rdata.

Т.е. для TXT записать, что бы у строк значений был префикс с их длинами (одно байтовое целое число, которое должно быть экранировано в восьмеричном виде, как указано в документации).


Является ли djbdns / tinydns безнадежным делом?

Afaict не из-за его обработки TXT записи конкретно.

Однако это часть программного обеспечения, которая в официальном виде не обновлялась с 2001 года (версия 1.05).
Существуют патчи и вилки, которые устраняют различные недостатки (протокол DNS, а также наши требования и ожидания продолжают развиваться в течение этих 15 лет), но я думаю, что было бы более разумным перейти на более качественную и актуальную реализацию DNS-сервера.

Другие вопросы по тегам