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

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

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

https://tools.ietf.org/html/rfc4408#section-3.1.3

https: / /tools.ietf.org/html/rfc1035#section-3.3.14

В обоих случаях предполагается, что запись 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

Это с записью 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 ?

2
задан 13 April 2017 в 15:14
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;р = [+1243] 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 («текст») для fqdn. tinydns-data создает запись TXT для fqdn, содержащую строку s. Вы можете использовать восьмеричные коды \ nnn для включения произвольных байтов внутри s; за Например, \ 072 - это двоеточие.

2)

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

Общая запись для fqdn. tinydns-data создает запись типа n для fqdn, показывающую rdata. н должен быть целым числом от 1 до 65 535; не должно быть 2 (NS), 5 (CNAME), 6 (SOA), 12 (PTR), 15 (MX) или 252 (AXFR). Правильный формат rdata зависит от п. Вы можете использовать восьмеричные коды \ nnn для включения произвольных байтов внутри rdata.


Не похоже, что встроенная поддержка TXT (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 у вас должны быть строки значений с префиксом их длины (однобайтовое целое число, которое должно быть экранировано восьмеричным, как указано в документации).


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

Afaict не из-за того, что он специально обрабатывает записи TXT .

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

3
ответ дан 3 December 2019 в 10:36

Теги

Похожие вопросы