DoT - технический разбор - 2026

Материал из Wiki - Iphoster - the best ever hosting and support. 2005 - 2026
Перейти к:навигация, поиск

Published: 2026-08-19


DoT (DNS over TLS) — протокол шифрования DNS-трафика поверх транспортного уровня безопасности (TLS), стандартизированный в RFC 7858 (май 2016, Standards Track, рабочая группа IETF DPRIVE). DoT решает фундаментальную проблему классического DNS: с момента создания протокола в 1983 году (RFC 1034/1035) все DNS-запросы передаются в открытом виде, что делает их уязвимыми для прослушивания и модификации любым атакующим, имеющим доступ к сетевому каналу. Эта статья представляет собой максимально полный технический разбор DoT: от базового протокола до профилей аутентификации, вопросов производительности, противодействия трафик-анализу, сравнения с альтернативами (DoH, DoQ) и практических рекомендаций операторам DNS-сервисов.

Введение

DNS (Domain Name System) — одна из самых старых и фундаментальных служб интернета. Почти каждый запрос, который делает пользователь — открытие веб-страницы, отправка почты, подключение к мессенджеру — начинается с DNS-разрешения имени. При этом по умолчанию DNS-запросы и ответы передаются без какого-либо шифрования через UDP-пакеты на порту 53. Это означает, что любой наблюдатель на пути следования трафика (провайдер, оператор Wi-Fi, администратор сети, злоумышленник) может:

  • видеть, какие доменные имена запрашивает пользователь (мониторинг и профилирование);
  • подменять DNS-ответы (спуфинг), направляя пользователя на серверы атакующего;
  • блокировать или задерживать отдельные запросы (цензура).

Проблемы приватности DNS подробно разбираются в RFC 7626 (DNS Privacy Considerations). В ответ на эти угрозы IETF организовала рабочую группу DPRIVE (DNS PRIVate Exchange), результатом работы которой стал ряд протоколов, из которых основными являются:

  • DoT (DNS over TLS) — RFC 7858, шифрование поверх TCP+TLS, порт 853;
  • DoDTLS (DNS over DTLS) — RFC 8094, экспериментальный, шифрование поверх DTLS;
  • DoH (DNS over HTTPS) — RFC 8484, шифрование поверх HTTP/2 или HTTP/3, порт 443;
  • DoQ (DNS over QUIC) — RFC 9250, шифрование поверх QUIC v1, порт 853/UDP.

Важно сразу отметить фундаментальное различие между DoT и DNSSEC. DNSSEC (RFC 4033) обеспечивает целостность и аутентичность DNS-данных — он позволяет клиенту проверить, что ответ действительно подписан владельцем зоны, но намеренно не защищает приватность: DNSSEC-запросы и ответы так же видны наблюдателю, как и обычные. DoT, наоборот, решает задачу конфиденциальности — скрывает содержимое запросов от посторонних, но не доказывает подлинность данных. Эти два механизма независимы и дополняют друг друга; в RFC 7858 прямо подчёркивается: «использование одного не уменьшает необходимости и полезности другого».

Область применения DoT — прежде всего сегмент «stub resolver → рекурсивный резолвер», то есть путь от конечного устройства пользователя до рекурсивного DNS-сервера, который разрешает имена. Согласно уставу рабочей группы DPRIVE, применение протокола на сегменте «рекурсивный → авторитативный» формально находится вне скоупа стандарта, хотя ничего не мешает использовать его и там.

Исторический контекст и эволюция

DNS без защиты

Классический DNS (RFC 1034, RFC 1035) был разработан в эпоху, когда интернет считался доверенной средой. Протокол не предусматривал шифрования: сообщения передаются в открытом виде, длина ответа по UDP ограничена 512 байтами (без расширения EDNS0, RFC 6891), а сопоставление запросов и ответов осуществляется по 16-битному идентификатору транзакции (Message ID). Отсутствие криптографии породило целый класс атак: DNS spoofing, DNS cache poisoning (уязвимость Камински, 2008), DNS rebinding, перехват запросов на уровне провайдера.

DNSSEC, появившийся в середине 2000-х, решил задачу целостности, но явно оставил приватность за скобками: подписанные зоны видны любому наблюдателю, а подписывание не скрывает ни QNAME (запрашиваемое имя), ни типы записей. Более того, распространение DNSSEC сделало DNS-ответы существенно больше (NXDOMAIN с NSEC3-цепочками почти всегда превышает 512 байт), что усилило зависимость от TCP-транспорта — и это сыграло важную роль в появлении DoT.

Предшественники и альтернативные попытки

До появления DoT предпринимались и другие попытки шифровать DNS, перечисленные в RFC 7858:

  • DNSCurve — шифрование с использованием криптографии на эллиптических кривых, не получило широкого распространения;
  • DNSCrypt — протокол шифрования DNS-запросов, используемый рядом публичных резолверов, но не стандартизированный в IETF;
  • Confidential DNS — ранняя концепция конфиденциального DNS;
  • IPSECA — применение IPsec для защиты DNS-трафика.

Рабочая группа DPRIVE, помимо TLS, рассматривала также DNS over DTLS (проект стал RFC 8094). Примечательна история отклонения идеи «STARTTLS для DNS»: ранние черновики предлагали выставлять бит «TLS OK» в EDNS(0)-флагах и использовать «dummy-запрос» (имя STARTTLS, тип TXT, класс CH) для согласования TLS. Как поясняется в разделе 7 RFC 7858 (Design Evolution), от этой схемы отказались по трём причинам:

  • бит «TLS OK» делает downgrade-атаки тривиальными и неотличимыми от неисправных middlebox-устройств;
  • dummy-запрос добавляет лишний RTT задержки;
  • неопределённость во взаимодействии с middlebox.

Аналогично был отклонён вариант «DNS over DTLS на порту 53»: сервер, не поддерживающий DTLS, интерпретировал бы DTLS-запрос как обычный DNS-ответ (бит QR=1), что приводит к нежелательным коллизиям. Выделенный well-known порт для TLS позволил избежать и лишней латентности, и неверной интерпретации.

Хронология ключевых стандартов

Документ Название Статус Год
RFC 7858 DNS over TLS Standards Track 2016
RFC 7766 DNS Transport over TCP Standards Track 2016
RFC 7828 edns-tcp-keepalive Standards Track 2016
RFC 7830 EDNS(0) Padding Option Standards Track 2016
RFC 8094 DNS over DTLS Experimental 2017
RFC 8310 Usage Profiles for DoT/DoDTLS Standards Track 2018
RFC 8467 Padding Policies for EDNS(0) Experimental 2018
RFC 8484 DNS over HTTPS (DoH) Proposed Standard 2018
RFC 8932 Recommendations for DNS Privacy BCP 232 2020
RFC 9102 TLS DNSSEC Chain Extension Standards Track 2021
RFC 9250 DNS over QUIC (DoQ) Standards Track 2022

Основной стандарт: RFC 7858

RFC 7858 «Specification for DNS over Transport Layer Security (TLS)» — ядро DoT. Документ определяет, как устанавливать, использовать и закрывать защищённые DNS-сессии, и содержит обязательные требования (MUST/SHOULD) для клиентов и серверов. Рассмотрим его положения максимально подробно.

Установление сессии и порт 853

По умолчанию DNS-сервер, поддерживающий DoT, обязан (MUST) слушать TCP-соединения на порту 853 — если только он не имеет взаимного соглашения с клиентами об использовании другого порта. Аналогичное требование предъявляется к клиенту: он обязан (MUST) устанавливать TCP-соединение на порт 853, если с сервером не согласован иной порт.

Ключевые нормативные положения:

  • использование порта, отличного от 853, требует взаимного соглашения — и клиент, и сервер должны иметь соответствующую конфигурационную опцию; никакого автоматического обнаружения альтернативного порта протоколом не предусмотрено;
  • альтернативный порт MUST NOT быть портом 53, но может принадлежать к диапазону «first-come, first-served» по классификации IANA;
  • первый обмен данными на TCP-соединении MUST быть началом TLS-handshake по процедурам RFC 5246 (TLS 1.2) с учётом рекомендаций BCP 195 (RFC 7525).

Запрет на порт 53 имеет принципиальный характер: он исключает двусмысленность «TLS или не TLS» на одном порту и снижает риск downgrade-атак. Если бы DoT и обычный DNS делили порт 53, атакующий мог бы заставить клиента молча переключиться с зашифрованного на открытый режим.

Запрет cleartext-трафика

RFC 7858 содержит жёсткие требования по недопущению передачи открытых DNS-сообщений по каналам DoT:

  • DNS-клиенты и серверы MUST NOT использовать порт 853 для передачи cleartext DNS-сообщений;
  • клиенты MUST NOT отправлять, а серверы MUST NOT отвечать на незашифрованные DNS-сообщения на любом порту, выделенном под DoT — в том числе после неудавшегося TLS-handshake.

Обоснование: смешение защищённых и незащищённых данных создаёт серьёзные проблемы безопасности, поэтому TCP-соединения на порту, выделенном под DoT, зарезервированы исключительно для зашифрованной связи. Это же правило действует при использовании TCP Fast Open: при переустановке соединения клиент и сервер должны немедленно начинать или возобновлять TLS-handshake, не обмениваясь открытым DNS.

Дополнительная мера против downgrade-атак: клиенты SHOULD запоминать IP-адреса серверов, не поддерживающих DoT (включая таймауты, отказы в соединении и сбои TLS-handshake), и не запрашивать у них DoT в течение разумного периода — например, одного часа на сервер.

TLS-handshake и аутентификация

После установления TCP-соединения клиент переходит к TLS-handshake, следуя лучшим практикам BCP 195 (RFC 7525). RFC 7858 сознательно не предлагает новых механизмов аутентификации — «этот документ не предлагает новых идей аутентификации». То, как клиент аутентифицирует сервер, зависит от выбранного профиля приватности (подробнее — в разделах ниже):

  • при профиле Opportunistic Privacy клиент может вообще не требовать аутентификации сервера;
  • при профиле Out-of-Band Key-Pinned Privacy клиент использует доверенный набор SPKI-отпечатков (SPKI Fingerprint pin set).

Из BCP 195 (RFC 7525), на которое ссылается RFC 7858, вытекают обязательные требования к TLS-конфигурации:

  • MUST NOT: SSLv2, SSLv3; SHOULD NOT: TLS 1.0 и 1.1 (когда доступна более новая версия);
  • MUST поддерживать и предпочитать TLS 1.2 (на сегодняшний день — TLS 1.3, RFC 8446);
  • MUST NOT: NULL-шифры, RC4, шифры силой менее 112 бит, export-level шифры (40/56 бит), static RSA;
  • MUST поддерживать и предпочитать шифры с forward secrecy (DHE/ECDHE): например, TLS_DHE_RSA_WITH_AES_128_GCM_SHA256, TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256, TLS_DHE_RSA_WITH_AES_256_GCM_SHA384, TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384;
  • SHOULD отключать TLS-компрессию (защита от атак класса CRIME);
  • клиенты MUST NOT выполнять fallback ниже защищённых версий при downgrade;
  • renegotiation — только с расширением renegotiation_info (RFC 5746);
  • TLS-реализации MUST поддерживать расширение SNI (Server Name Indication) для протоколов, которым оно полезно; для DoT применение SNI — вопрос локальной политики (SNI передаётся в открытом виде, см. раздел об анализе угроз).

Фреймирование сообщений

Поскольку DoT работает поверх TCP, а классический DNS — потоковый протокол, каждое сообщение должно быть разграничено. RFC 7858 требует (MUST), чтобы все сообщения — запросы и ответы — в установленной TLS-сессии использовали двухоктетное поле длины, описанное в разделе 4.2.2 RFC 1035.

Техническая деталь из RFC 1035: сообщению предшествует двухбайтовое поле длины, которое задаёт длину сообщения без учёта самого поля длины. Поле — беззнаковое 16-битное число в сетевом порядке байт (big-endian). Максимальная длина DNS-сообщения по TCP/TLS — 65535 байт.

Требование эффективности: клиенты и серверы SHOULD передавать поле длины и само сообщение TCP-стекам одним вызовом записи (например, одним системным вызовом write()), чтобы увеличить вероятность попадания всех данных в один TCP-сегмент. Причина — исторические проблемы реализаций: некоторые серверы вели себя некорректно, если первый read() с TCP-уровня не содержал и поле длины, и всё сообщение целиком, вплоть до обрыва сессии. RFC 7766 уточняет: DNS-серверы MUST NOT закрывать соединение только потому, что первый read не содержит всего DNS-сообщения.

Дополнительное требование безопасности: серверы SHOULD сбрасывать idle-таймер только при получении полного DNS-сообщения, а не любого сегмента — защита от slow-read атаки, при которой злоумышленник удерживает соединение в полуоткрытом состоянии, передавая данные по одному байту.

Pipelining и сопоставление ответов

Для минимизации задержек RFC 7858 требует (SHOULD) конвейеризации запросов: клиент не должен ждать ответа на предыдущий запрос перед отправкой следующего. Серверы, особенно рекурсивные, MUST ожидать приёма конвейеризованных запросов, SHOULD обрабатывать их конкурентно (как UDP-запросы) и отвечать на все.

Поскольку ответы могут приходить в порядке, отличном от порядка запросов (out-of-order processing), критически важным становится сопоставление ответов с запросами:

  • клиенты MUST сопоставлять ответы с выдающимися запросами на том же TLS-соединении по Message ID;
  • если ответ содержит Question Section, клиент MUST дополнительно проверять поля QNAME, QCLASS и QTYPE;
  • при повторной отправке запросов клиенты MUST NOT переиспользовать Message ID невыполненного (in-flight) запроса — иначе возможны коллизии при out-of-order обработке на сервере.

В RFC 7766 подчёркивается: stub- и recursive-резолверы MUST уметь обрабатывать ответы, приходящие не в порядке отправки запросов, независимо от используемого транспорта. Некорректное сопоставление ответов может иметь серьёзные последствия для интероперабельности.

Переиспользование соединений и закрытие

Одно из самых важных отличий DoT от классического DNS-over-TCP: успешное согласование TLS означает готовность обеих сторон держать idle-соединения открытыми, независимо от таймаутов и рекомендаций для DNS-over-TCP без TLS. То есть:

  • клиенты и серверы SHOULD NOT немедленно закрывать соединение после каждого ответа;
  • соединения SHOULD переиспользоваться для последующих запросов, пока есть ресурсы;
  • клиенты SHOULD переиспользовать одно TCP-соединение к рекурсивному резолверу (альтернатива — локальный кэширующий резолвер с DoT, держащий системное соединение наружу).

RFC не даёт конкретных рекомендаций по значениям таймаутов для idle-соединений; полезные ориентиры даёт RFC 7828 (edns-tcp-keepalive): EDNS0-опция с code 11, формат «OPTION-CODE (2 октета) | OPTION-LENGTH (2 октета) | TIMEOUT (0 или 2 октета)», таймаут задаётся в единицах 100 мс. Клиенты MUST NOT включать эту опцию в UDP-запросы, но MAY — в TCP; ответ сервера с TIMEOUT=0 означает, что клиенту следует не отправлять больше запросов и инициировать закрытие.

Порядок закрытия соединений:

  • серверы SHOULD при закрытии использовать TLS close_notify — это переносит TCP-состояние TIME-WAIT на клиентов;
  • close_notify обязателен по RFC 5246 §7.2.1: каждая сторона обязана отправить close_notify перед закрытием стороны записи; другая сторона обязана ответить собственным close_notify и немедленно закрыть соединение, отбрасывая отложенные записи; данные, полученные после closure alert, игнорируются — это защита от truncation-атак;
  • клиенты и серверы, держащие idle-соединения открытыми, MUST быть устойчивы к закрытию соединения любой из сторон;
  • серверы MAY закрыть соединение в любой момент (например, при нехватке ресурсов);
  • клиенты MUST обрабатывать резкие закрытия (abrupt closes) и быть готовы переустанавливать соединения и повторять запросы;
  • клиенты SHOULD повторять неотвеченные запросы, если соединение закрылось до получения всех ответов;
  • если сервер обнаружил, что клиент закрыл сессию до отправки всех ответов, он MUST NOT пытаться их отправить (но MAY закэшировать).

Ограничение числа соединений (RFC 7766 §6.2.2): для пары клиент/сервер рекомендуется не более одного соединения для регулярных запросов, одного для zone transfers и одного на каждый протокол поверх TCP. Серверы MAY ограничивать число соединений с одного IP/подсети, но лимиты должны быть существенно мягче клиентских ориентиров (за одним IP может стоять NAT и несколько резолверов).

Профили приватности

RFC 7858 определяет два профиля использования:

1. Opportunistic Privacy Profile (оппортунистическая приватность). Аналогия — opportunistic security в SMTP (RFC 7435): «человек не требует приватности, но желает её, когда это возможно». Клиент может узнать о TLS-резолвере из недоверенного источника (например, DHCP-опции DNS-сервера по RFC 3646), после чего попытаться установить DoT-соединение на 853. С таким обнаруженным сервером клиент может как проверять его подлинность, так и не проверять. Такой выбор максимизирует доступность и производительность, но оставляет клиента уязвимым для on-path атак, снимающих приватность. Итоговая гарантия профиля: «оппортунистическая приватность доступна любому клиенту, но обеспечивает приватность только при отсутствии активных on-path атакующих».

2. Out-of-Band Key-Pinned Privacy Profile (приватность с внеполосным пинингом ключей). Применим там, где между клиентом и сервером уже существует установленное доверие (корпоративный stub-to-recursive, договорные отношения с провайдером DNS-сервиса, публичный резолвер). Клиент получает сильные гарантии приватности, подключаясь только к серверам, которые может аутентифицировать:

  • операторы должны предоставлять пины, специфичные для сервиса: публичные ключи конечного субъекта (end entity) или ключи специализированного частного CA — но не ключи публичного CA общего назначения;
  • клиент аутентифицирует сервер сопоставлением набора SPKI-отпечатков по аналогии с RFC 7469 (HPKP);
  • администраторы SHOULD разворачивать backup pin вместе с primary pin для бесшовной ротации ключей;
  • проверка: после TLS-handshake клиент вычисляет SPKI-отпечатки публичных ключей из валидированной сертификатной цепочки сервера (или из raw public key, если сервер его предоставляет); при точном совпадении хотя бы с одним пином соединение продолжается; в противном случае несовпадение SPKI-проверки MUST трактоваться как невосстановимая ошибка (non-recoverable error);
  • обязательные алгоритмы: отпечаток вычисляется как SHA-256 (RFC 6234) от DER-кодированного ASN.1-представления SPKI X.509-сертификата; представление отпечатка — base64-строка (RFC 4648); дополнительные типы отпечатков MAY поддерживаться.

В Appendix A RFC 7858 приведён практический пример: клиент соединяется на порт 853, сервер присылает цепочку из трёх сертификатов (A, B, C) и подписывает ServerKeyExchange ключом из сертификата A. Клиент последовательно вычисляет SHA-256 от SPKI сертификатов A, B, C и сравнивает с пинами; если ни один SPKI криптографически валидной цепочки не совпал ни с одним пином, клиент закрывает соединение с ошибкой и помечает IP-адрес как нерабочий.

Разница между профилями:

Аспект Opportunistic Out-of-Band Key-Pinned
Источник знания о сервере недоверенный (DHCP и т.п.) доверенная внеполосная конфигурация
Аутентификация сервера опциональна обязательна (SPKI-пины)
Устойчивость к MITM/downgrade нет да (несовпадение пина — невосстановимая ошибка)
Поведение при сбое запоминание сервера ~1 час MAY агрессивный ретрай

Производительность

Раздел 5 RFC 7858 систематизирует затраты DoT по трём категориям: латентность, состояние (память), обработка (CPU).

Латентность:

  • по сравнению с UDP, DNS over TCP добавляет один RTT на установку TCP-соединения;
  • TCP Fast Open (RFC 7413) может устранить этот RTT, если есть информация от предыдущих соединений (данные в SYN);
  • TLS-handshake добавляет ещё два RTT (в терминах TLS 1.2); итого: UDP = +0 RTT, TCP = +1 RTT, TCP+TLS = +3 RTT;
  • клиенты и серверы должны поддерживать keepalive (переиспользование) и out-of-order обработку для амортизации затрат на установку соединения;
  • быстрое возобновление TLS-сессий (RFC 5077) дополнительно снижает задержку установки и избавляет DNS-сервер от хранения per-client состояния (stateless-тикеты);
  • TLS False Start может дать снижение задержки в определённых ситуациях, но его использование небезопасно без строгого соблюдения дополнительных требований (RFC 7918).

Состояние: connection-oriented TCP требует дополнительного состояния на сервере и в ядре, и в приложении; проблема особенно актуальна для серверов с большим числом клиентов; память-оптимизированный TLS добавляет лишь скромное состояние поверх TCP. Меньшие значения таймаутов уменьшают число одновременных соединений; серверы могут упреждающе закрывать соединения при превышении лимитов ресурсов.

Обработка: алгоритмы TLS-шифрования дают незначительно более высокое использование CPU; серверы могут отказывать новым DoT-клиентам при превышении лимитов обработки.

Число соединений: для минимизации состояния серверов и времени установки клиенты SHOULD минимизировать создание новых TCP-соединений. Использование локального агрегатора DNS-запросов (особого типа форвардера) позволяет держать одно активное DoT-соединение от клиентского компьютера к серверу.

Анализ угроз

RFC 7858 честно очерчивает границы своей защитной модели. Цель DoT — только защита от подслушивания DNS-сообщений (приватность), а не решение всех проблем безопасности DNS. Перечень остаточных рисков:

  1. Атаки на сам TLS — person-in-the-middle и protocol downgrade: общие атаки на TLS. Клиенты и серверы MUST следовать рекомендациям BCP 195. Отслеживание клиентами серверов, известных поддержкой TLS, позволяет обнаруживать downgrade-атаки. Для серверов без истории соединений и видимой поддержки TLS клиент в зависимости от профиля может: (а) попробовать другой сервер, (б) продолжить без TLS, (в) отказаться пересылать запрос.
  2. Middlebox-устройства (RFC 3234) вмешиваются в обычное DNS-разрешение; использование выделенного порта DoT должно избегать такого вмешательства. Клиенты при неудаче TLS могут либо откатиться на незашифрованный DNS, либо подождать и повторить позже (зависит от профиля).
  3. Модификация cleartext-взаимодействий: любые DNS-взаимодействия в открытом виде могут быть изменены MITM-атакующим; поэтому клиенты MAY отбрасывать закэшированную информацию о возможностях сервера, рекламируемую в открытом виде.
  4. Трафик-анализ / side-channel: RFC 7858 не специфицирует средств против известных утечек трафик-анализа. Даже с зашифрованными сообщениями хорошо расположенный наблюдатель может извлечь детали из анализа таймингов и размеров сообщений. Рекомендация — padding (EDNS(0) Padding Option, RFC 7830), однако простые схемы паддинга сами по себе могут быть недостаточны.

Что остаётся видимым наблюдателю на канале DoT: сам факт TCP-соединения на порт 853, IP-адреса клиента и сервера, тайминги, объёмы и длины TLS-записей (база для трафик-анализа), а также открытые поля handshake — в первую очередь SNI, который в TLS 1.2 передаётся в открытом виде в ClientHello. Имена доменов внутри DNS-запросов скрыты.

Профили использования: RFC 8310

RFC 8310 (март 2018, Standards Track) «Usage Profiles for DNS over TLS and DNS over DTLS» уточняет и развивает модель RFC 7858, вводя строгую типологию профилей, механизмы аутентификации и требования к серверам.

Authentication Domain Name (ADN)

ADN — доменное имя, используемое для аутентификации privacy-enabling DNS-сервера. Это DNS-ID, конструируемый клиентом как reference identifier по RFC 6125 для TLS-аутентификации сервера.

Суть проблемы, которую решает ADN: у клиента есть bootstrap-проблема — stub-резолвер обычно знает только IP-адрес DNS-сервера, а для PKIX-аутентификации нужно имя. ADN связывает стабильный, узнаваемый идентификатор с провайдером DNS-услуг. Клиент конструирует ровно один reference identifier — сам ADN — и проверяет его в subjectAltName сертификата. Правила проверки:

  • клиент MUST проверить полный путь сертификации по RFC 5280;
  • сравнение ADN — по правилам RFC 6125 §6;
  • клиент MUST смотреть только на subjectAltName (DNS-ID) и MUST NOT проверять поле Subject.

Источники получения ADN (раздел 7 RFC 8310) — четыре способа:

  1. Full Direct Configuration: ADN и IP получены out-of-band (конфигурационный файл или API клиента).
  2. Direct Configuration of ADN Only: задан только ADN; IP клиент узнаёт через meta-query A/AAAA к недоверенному сетевому резолверу (например, полученному от DHCP по RFC 3646) в режиме Opportunistic Privacy. Атака на meta-query возможна; DNSSEC-валидация может её обнаружить. Клиент MAY кэшировать полученные IP.
  3. Dynamic Discovery: стандартного способа на момент написания RFC не было; при Strict Privacy источник динамического обнаружения MUST считаться безопасным и доверенным; для Opportunistic это требование не действует.
  4. DHCP: стандартный DHCP даёт только IP (RFC 2132 §3.8), но не ADN; RFC не специфицирует DHCP-расширение, но оговаривает, что будущее расширение должно учитывать RFC 7227 §8 и RFC 3315 §23. Для Strict Privacy требуется безопасная связь с DHCP-сервером.

Strict и Opportunistic профили

RFC 8310 формализует два профиля:

Strict Privacy Profile:

  • шифрование и успешная аутентификация обязательны;
  • при недоступности — жёсткий отказ (hard failure): «клиент MUST прервать соединения с сервером, когда ни один механизм проверки не успешен»;
  • «клиент MUST NOT начинать отправку DNS-запросов, пока хотя бы один privacy-enabling сервер не станет доступен»;
  • клиент MUST NOT в процессе резолвинга конкретного запроса откатываться из Strict в Opportunistic (это обесценило бы защиту);
  • клиент MUST использовать либо один из источников ADN из раздела 7, либо SPKI pin set по RFC 7858;
  • при bootstrap через captive portal разрешены техники типа dnssec-trigger, но система MUST оповестить пользователя, что DNS не приватный.

Opportunistic Privacy Profile:

  • шифрование/аутентификация «по возможности» (Opportunistic Security, RFC 7435);
  • каскад исходов: A+E (аутентифицированное+зашифрованное) → E (просто зашифрованное) → cleartext;
  • клиент SHOULD пытаться получить лучший вариант, MAY согласиться на промежуточный и может откатиться на cleartext ради получения ответа (например, если латентность важнее митигации);
  • клиент, знающий аутентификационную информацию о сервере, SHOULD пытаться аутентифицировать сервер — это позволяет детектировать (не предотвращать) активные атаки: при сбое аутентификации «с точки зрения безопасности следует считать, что идёт активная атака», поэтому алгоритм выбора nameserver может избегать неаутентифицировавшийся сервер при наличии альтернатив;
  • клиент, реализующий Opportunistic, SHOULD также реализовать Strict;
  • клиент с DoT/DoDTLS SHOULD NOT быть по умолчанию настроен на только-cleartext.

Таблица защиты от атак (таблица 1 из раздела 5):

Профиль Соединение Пассивный атакующий Активный атакующий
Strict A+E защита (P) защита (P)
Opportunistic A+E защита (P) защита (P)
Opportunistic E защита (P) нет защиты (N), детекция (D)
Opportunistic cleartext нет защиты (N), детекция (D) нет защиты (N), детекция (D)

Шесть механизмов аутентификации

RFC 8310 (таблица 2, раздел 6.3) перечисляет шесть способов установить подлинность сервера:

  1. SPKI pin set + IP (out-of-band, статически) — проверка сравнением SPKI из handshake с пинами; совместимо с raw public keys (RFC 7250); минимальная утечка (SNI не используется при соединении по IP).
  2. ADN + IP (out-of-band, статически) — PKIX-проверка по сертификату.
  3. ADN only — IP динамически через meta-query к network-provided серверу (A/AAAA); утечка meta-query, митигируется DNSSEC-валидацией.
  4. DHCP — оба параметра (ADN+IP) динамически; требует нестандартного DHCP-опциона; для Strict требует доверенного DHCP.
  5. DANE — TLSA через прямые DNS meta-queries; запись MUST быть валидирована DNSSEC по RFC 6698; требует DNSSEC-валидирующий stub.
  6. TLS DNSSEC Chain Extension — цепочку (TLSA + CNAME + external records) передаёт сам сервер в handshake (RFC 9102); меньше латентность, не нужен network-provided DNS-сервер при статическом ADN+IP.

При комбинировании ADN и SPKI pin set клиент SHOULD требовать совпадения обоих механизмов; пины обрабатываются по правилам RFC 7469 §2.6; общий результат аутентификации успешен только при успехе обоих механизмов.

DANE и TLSA

Механизм DANE (DNS-based Authentication of Named Entities) якорит доверие через DNSSEC. TLSA-записи для DoT живут в домене, полученном префиксом перед ADN:

  • _853._tcp.[ADN] — для TLS;
  • _853._udp.[ADN] — для DTLS.

Поддерживаются все DANE-опции RFC 6698, включая PKIX-TA(0), PKIX-EE(1), DANE-EE(3); комбинация DANE-EE(3) + selector SPKI(1) + raw public keys (RFC 7250) — режим, где период действия определяется только свойствами TLSA RRset. Операционные аспекты TLSA TTL и сроков подписи — RFC 7671 §13.

Важные ограничения:

  • DANE требует DNSSEC-валидирующего стуба — без него механизм недоступен (на момент написания RFC такие стубы были редки);
  • в неподписанной зоне или при отсутствии TLSA цепочка DNSSEC не может быть построена; клиент Strict-профиля должен прервать соединение;
  • при работе TLS DNSSEC Chain Extension: если цепочка не валидируется — клиент MUST игнорировать её и использовать другие credentials (например, PKIX), иначе — abort;
  • DNSSEC-валидация способна детектировать атаку на meta-query, что может привести к отсутствию DNS-услуги в обоих профилях.

Требования к серверам и (D)TLS-профиль

Privacy-enabling DNS server (раздел 2 и 4 RFC 8310) обязан:

  • MUST реализовывать DNS over TLS (RFC 7858);
  • MAY реализовывать DNS over DTLS (RFC 8094);
  • SHOULD предлагать хотя бы один credential (PKIX-сертификат для ADN или DNSSEC-валидируемую TLSA-запись);
  • реализовывать (D)TLS-профиль раздела 9.

(D)TLS Protocol Profile (раздел 9):

  • MUST следовать RFC 7525 (BCP 195), кроме версии TLS;
  • MUST реализовывать только (D)TLS 1.2 или новее (TLS 1.3/DTLS 1.3 — опционально);
  • MUST NOT предлагать/использовать TLS-компрессию (атаки CRIME);
  • MUST: session resumption без серверного состояния (RFC 5077) — обновление RFC 7858;
  • MUST: raw public keys (RFC 7250) — уменьшают ServerHello; клиент MUST объявлять поддержку raw public keys только при предварительно сконфигурированном SPKI pin set;
  • SHOULD: TLS False Start (RFC 7918) и Cached Information Extension (RFC 7924) — пропуск повторной передачи сертификата.

Вопрос ALPN: при деплое DoT и DoH на одном IP требуется использование ALPN-значения «dot» (зарегистрировано в реестре TLS ALPN) — рекомендация RFC 8932 §5.1.3.1.

Fallback-поведение клиентов

Strict Privacy:

  • сбой аутентификации/шифрования = жёсткий отказ;
  • никакого отката на cleartext;
  • запрет деградации внутри запроса;
  • при временной недоступности (captive portal) — bootstrap по техникам dnssec-trigger с обязательным алертом пользователю.

Opportunistic Privacy:

  • каскад: A+E → E → cleartext;
  • Appendix A (не-нормативный): клиент, реализующий и TLS, и DTLS, должен пробовать аутентифицироваться через оба протокола до отказа/отката; Opportunistic-клиент должен перепробовать все доступные серверы (возможно, параллельно), чтобы получить A+E-соединение, прежде чем откатываться;
  • клиенты обязаны отслеживать и кэшировать, какие серверы поддерживают DoT/DoDTLS и какие ранее аутентифицировались.

Дополнительные требования раздела 11: клиенты SHOULD поддерживать механизмы DANE и SHOULD предоставлять опцию конфигурации, ограничивающую аутентификацию только ими (без fallback на чистую PKIX). Контрмеры трафик-анализу: клиенты и серверы SHOULD реализовать EDNS(0) padding (RFC 7830, политики — RFC 8467); клиенты SHOULD реализовать privacy election через edns-client-subnet (RFC 7871) — при отсутствии опции с SOURCE PREFIX-LENGTH=0 сервер может утечь адрес клиента апстрим-серверам.

DNS поверх TCP: RFC 7766

RFC 7766 (март 2016, Standards Track) заменяет RFC 5966 и обновляет RFC 1035 и RFC 1123. Он критически важен для DoT, поскольку последний целиком опирается на TCP-транспорт.

TCP становится обязательным

RFC 1123 §6.1.3.2 гласил, что резолверы и рекурсивные серверы MUST поддерживать UDP и SHOULD поддерживать TCP; многие реализаторы трактовали TCP как опциональную возможность. RFC 7766 ужесточает требования:

  • все general-purpose DNS-реализации MUST поддерживать и UDP, и TCP;
  • авторитативные серверы MUST поддерживать TCP — чтобы не ограничивать размер ответов одним UDP-пакетом;
  • рекурсивные серверы и форвардеры MUST поддерживать TCP;
  • stub-резолверы (библиотеки ОС) MUST поддерживать TCP.

Требование «UDP first» ослаблено: stub- и recursive-резолверы MAY выбирать TCP или UDP по локальным операционным причинам; TCP MAY использоваться до любых UDP-запросов; при наличии открытого TCP-соединения его SHOULD переиспользовать. Ответ MUST отправляться по тому же транспорту, что и запрос, а для TCP — MUST на том же самом соединении.

Терминология

  • Persistent connection — соединение, не закрываемое ни сервером, ни клиентом после первого ответа;
  • Connection Reuse — множество запросов/ответов по одному соединению;
  • Idle DNS-over-TCP session — клиент считает сессию idle при отсутствии ожидающих отправки и неотвеченных запросов; сервер — когда ответил на все полученные запросы;
  • Pipelining — отправка нескольких запросов без ожидания ответов;
  • Out-of-Order Processing — конкурентная обработка запросов и отправка ответов по мере готовности.

Требования к таймаутам и закрытию

  • idle-таймауты: рекомендованный серверный application-level idle-период по умолчанию — порядка секунд; MAY быть дольше при достатке ресурсов; минимум «несколько секунд» нужен для поддержки последовательности SOA+AXFR на одном соединении; при перегрузке/атаке серверы MAY использовать нулевой таймаут;
  • slow-read attack: сервер SHOULD сбрасывать idle-таймер только при получении полного DNS-сообщения;
  • клиенты MUST минимизировать idle-время сессий; SHOULD закрывать idle-соединение, если таймаут не согласован сигналингом (edns-tcp-keepalive);
  • серверы MUST NOT закрывать соединение из-за неполного первого read.

EDNS0 и размеры сообщений

Без EDNS0 лимит UDP-ответа — 512 байт; при TC=1 выполняется retry по TCP. EDNS0 (RFC 6891) позволяет UDP-ответы до объявленного клиентом buffer size, но пакеты больше path MTU фрагментируются, а фрагментация ненадёжна: файрволы блокируют фрагменты, устройства отказываются обрабатывать DNS с EDNS0-опциями (RFC 5625). MTU в ядре интернета — около 1500 байт, и DNSSEC-подписанные ответы регулярно её превышают. Вывод RFC 7766: единственный стандартизированный UDP-механизм решения проблемы размера признан неадекватным, поэтому TCP — легитимный транспорт.

TFO и предупреждение для DoT

TCP Fast Open (RFC 7413) переносит данные в SYN, экономя до 1 RTT; защита от спуфинга — server-supplied cookie; при anycast-деплойменте все узлы за одним IP должны использовать один ключ для генерации cookie. Для DoT TFO опасен тем, что данные запроса могут попасть в SYN в открытом виде: реализатор обязан обеспечить, чтобы в SYN попадал только TLS ClientHello (зашифрованный), а не DNS-запрос.

Padding и трафик-анализ: RFC 8467

RFC 8467 (октябрь 2018, Experimental) определяет политики дополнения сообщений для EDNS(0). Базовый механизм — EDNS(0) Padding option (RFC 7830, code 12, минимальный размер 4 октета). Padding осмыслен только на зашифрованном транспорте (DoT/DoDTLS/DoQ/DoH).

Общие правила

  • padding MUST быть последней EDNS(0)-опцией перед отправкой;
  • размер сообщения, подаваемый в алгоритм, MUST вычисляться без двухоктетного length-поля TCP (иначе наблюдаемый размер выдаёт транспорт и подсказывает исходную длину);
  • на дешёвых линках и батарейных устройствах следует взвешивать выигрыш в конфиденциальности против трафика.

Рекомендуемая стратегия: Block-Length Padding

Стратегия основана на эмпирическом исследовании Дэниела Гиллмора (NDSS 2017, «Empirical DNS Padding Policy»):

  • клиенты SHOULD дополнять запросы до ближайшего кратного 128 октетам;
  • сервер, получивший запрос с Padding-опцией, MUST дополнить ответ (по RFC 7830 §4) и SHOULD — до кратного 468 октетам.

Число 468 выбрано так, чтобы 3 блока (1404 байта) помещались в типичный MTU; блоки, кратные большим долям MTU, могут вызвать фрагментацию. Даже пустая Padding-опция добавляет 4 октета. «Очень большие блоки» (почти как Maximal): 288 байт для запроса (максимум one-question query по TCP без EDNS0-опций) и EDNS0 buffer size сервера для ответов. Недостаток: при известном публичном размере блока наблюдатель предсказывает диапазон и выводит минимальную длину исходного сообщения.

Прочие стратегии

Стратегия Суть Вердикт
Maximal-Length всё до максимума протокола максимальная скрытность размера, но расточительно; почти всегда > MTU → фрагментация; NOT RECOMMENDED
Random-Length случайное число октетов по распределению наблюдаемых длин атакующий выводит исходную длину; NOT RECOMMENDED
Random-Block-Length случайный выбор блока из нескольких больше разнообразия размеров; дороже в реализации; требует исследований
No Padding без дополнения MUST NOT (если только не осталось < 4 октетов)
Fixed-Length константный паддинг легко вычисляется из одного незашифрованного сообщения; MUST NOT, кроме тестов

Ограничения padding

Padding не скрывает: факт того, что трафик — DNS; timing-каналы; число пар запрос/ответ. Контрмеры (cover traffic, джиттер задержек) — вне скоупа RFC. Усилия клиента могут быть сведены на нет сервером с неэффективной политикой ответов — клиенту имеет смысл выбирать сервер с сопоставимой политикой.

TLS 1.3 и DoT

TLS 1.3 (RFC 8446, август 2018) радикально изменил картину для всех протоколов поверх TLS, включая DoT.

Что меняет TLS 1.3

  • handshake сокращается с ~2 RTT (TLS 1.2) до 1 RTT; всё после ServerHello шифруется (EncryptedExtensions, Certificate, CertificateVerify, Finished);
  • cipher suites: только AEAD; MUST: TLS_AES_128_GCM_SHA256; SHOULD: TLS_AES_256_GCM_SHA384 и TLS_CHACHA20_POLY1305_SHA256;
  • key exchange: MUST secp256r1, SHOULD X25519;
  • session resumption: RFC 5077 (session tickets) и session IDs заменены на PSK (pre-shared keys) + NewSessionTicket; клиент, предлагающий PSK, SHOULD также прислать key_share, чтобы сервер мог отказаться от resumption; PSK можно комбинировать с (EC)DHE для forward secrecy; PSK-only теряет PFS для прикладных данных;
  • record padding (раздел 5.4): любая TLS-запись может быть дополнена нулевыми октетами; Application Data может иметь пустой content (генерация cover traffic); Handshake и Alert с пустым content запрещены; лимит полного TLSInnerPlaintext — 2^14+1 октетов (или record_size_limit, RFC 8449); политика padding вынесена из TLS: прикладной протокол со своим padding предпочтителен — прямая отсылка к DNS (EDNS0 Padding).

Почему 0-RTT неприменим в DoT

0-RTT (early data) — режим, при котором клиент отправляет данные на первом флайте, зашифровав их ключами early data. RFC 8446 прямо предупреждает, что свойства 0-RTT слабее обычных:

  1. 0-RTT не обеспечивает forward secrecy (шифруется только под PSK);
  2. нет гарантий невоспроизводимости (non-replay) между соединениями.

Для DoT это принципиально по нескольким причинам:

  • DNS-запрос формально идемпотентен, но не является «replay-safe» в смысле приватности: реплей запроса заставляет рекурсор выполнить исходящие запросы к авторитативным серверам, и наблюдатель может по таймингу/трафику резолвера выяснить, какое имя запрашивалось (это прямо разбирается в RFC 9250 §7.1);
  • риск cache-timing oracle (RFC 8446 §E.5): реплей в другой кэш-узел + замер задержки отдельным соединением определяет, адресуется ли тот же ресурс;
  • переупорядочивание сообщений и перегрузка rate-limiter'ов;
  • RFC 8446 §E.5: «приложения MUST NOT использовать 0-RTT без профиля, определяющего его использование» — для DoT такого профиля нет; RFC 7858 не специфицирует 0-RTT вовсе.

Серверы, поддерживающие 0-RTT, обязаны реализовать анти-replay механизмы (раздел 8 RFC 8446): single-use tickets (БД билетов с удалением при использовании), ClientHello recording (ключ хранения — валидированные части ClientHello; допустимы Bloom-фильтры с обязательным отклонением при совпадении), freshness checks (реалистичное окно ~10 секунд). Важно: freshness check недостаточен сам по себе — внутри окна возможны миллиарды реплеев.

ECH: скрытие SNI

В TLS 1.3 вне шифрования остаётся SNI в ClientHello — главная утечка целевого домена. Решение — Encrypted Client Hello (ECH), опубликованный как RFC 9849 (март 2026, Standards Track), с бутстрапом через SVCB/HTTPS-записи (SvcParamKey 5 «ech», RFC 9848). Механизм: ClientHello шифруется под публичным ключом client-facing сервера; outer (видимый) и inner (зашифрованный) ClientHello; анонимное множество = домены за одним ECHConfig.

Прямая связь с DNS privacy (в самом RFC 9849):

  • «SNI-шифрование бесполезно без шифрования DNS-запросов в пути» — ECH не скрывает имя сервера от резолвера;
  • зашифрованный DNS (DoT/DoH/DoQ) и ECH дополняют друг друга: DoT/DoH/DoQ скрывают от наблюдателя, какие домены резолвятся; ECH скрывает SNI при TLS-соединениях, включая соединение к самому DoH-резолверу;
  • против downgrade-атак (вырезание ECH из DNS-ответа) — DNSSEC-валидация и SVCB-reliant поведение;
  • круговая зависимость: чтобы получить ECHConfig, нужно резолвить SVCB — этот запрос должен идти по зашифрованному каналу или быть предсконфигурирован.

Сравнение DoT, DoH и DoQ

Полное сравнение трёх основных протоколов зашифрованного DNS:

Аспект DoT (RFC 7858) DoH (RFC 8484) DoQ (RFC 9250)
Транспорт TCP + TLS HTTP/2 (мин. RECOMMENDED) или HTTP/3 QUIC v1 (RFC 9000/9001)
Порт по умолчанию 853/TCP 443/TCP и UDP 853/UDP
Идентификация сервиса порт + TLS-сертификат URI Template (https://.../dns-query) ALPN "doq" + сертификат
Фрейминг 2-октетный length field (RFC 1035 §4.2.2) media type application/dns-message, без length field 2-октетный length field на каждом stream
Message ID обязателен; сопоставление по ID + QNAME/QCLASS/QTYPE ID=0 (HTTP сопоставляет запрос/ответ) ID MUST = 0 (сопоставление по stream)
Модель pipelining на одном TCP-потоке GET (base64url) или POST; мультиплексирование HTTP/2 1 запрос = 1 bidirectional stream; параллельность без HOL-blocking
Кэширование нет HTTP-кэши, CDN, прокси; freshness <= min TTL нет
Padding EDNS0 (RFC 7830/8467) EDNS0 + HTTP/2 padding EDNS0 или QUIC-пакетный padding
Keepalive edns-tcp-keepalive (RFC 7828) HTTP idle edns-tcp-keepalive MUST NOT (QUIC idle timeout)
0-RTT нет (нет профиля; replay-риски) есть в HTTP/2-over-QUIC есть: только OPCODE QUERY и NOTIFY; прочее — очередь, REFUSED + EDE 26 "Too Early" или CONNECTION_CLOSE
HOL-blocking есть (TCP) есть при HTTP/2, нет при HTTP/3 нет
Zone transfer (XFR) возможно (RFC 9103, XoT) не подходит явно поддержан: параллельные IXFR/AXFR
Приватность/смешивание трафик на 853 легко выделяется смешивается с обычным HTTPS на 443 UDP 853 легко выделяется

Ключевые выводы сравнения:

  • DoT — базовый зашифрованный канал stub→recursive с минимальным оверхедом поверх классического DNS; узкие места — TCP HOL-blocking и состояние на сервере;
  • DoH — экосистема браузеров и веба: доступ за файрволами (443), CDN-кэширование, смешение с HTTPS-трафиком против блокировок; минусы — оверхед HTTP, утечки заголовков и cookies;
  • DoQ — минимальная задержка (0-RTT для безопасных транзакций, нет HOL-blocking), устойчивость к потере пакетов, идеален для мобильных клиентов и zone transfers; риски — replay и линкабильность 0-RTT и resumption, регулируемые жёстче, чем в DoT/DoH.

Рекомендации операторам: RFC 8932

RFC 8932 (октябрь 2020, BCP 232) «Recommendations for DNS Privacy Service Operators» адресован операторам рекурсивных резолверов. Три класса действий = три уровня соответствия: минимальное (митигации угроз), умеренное (+ оптимизации), максимальное (+ дополнительные опции).

На канале клиент–сервер

  • сервис должен предоставляться по DoT (RFC 7858/8310) или DoH (RFC 8484); DoDTLS — Experimental; DNSCrypt/IPsec/VPN — вне скоупа; шифрование транспорта не отменяет DNSSEC;
  • сервисы должны давать клиентам возможность аутентифицировать сервер (публичная идентичность, которой будут доверять); для DoT — X.509-сертификаты (RFC 5280) или SPKI pin sets;
  • управление сертификатами — самый сложный аспект для традиционных DNS-операторов: следовать RFC 7525 §6.5 (revocation), автоматизировать генерацию/продление (например, ACME, RFC 8555), мониторить сертификаты (невалидный сертификат ведёт к недоступности сервиса и откату пользователя на cleartext), выбирать короткий запоминающийся ADN (митигация опечаток, ведущих на сервер атакующего);
  • DoT-сервис на обоих портах: 853 и 443; при DoH на том же IP — обязательно ALPN «dot»;
  • оптимизации: OOOR — параллельная обработка конвейерных запросов с ответами не по порядку (RFC 7766); управление TLS-соединениями под RFC 7766 и edns-tcp-keepalive (RFC 7828); опционально DNS Stateful Operations (RFC 8490);
  • DNSSEC: все DNS privacy-сервисы должны выполнять DNSSEC-валидацию и предоставлять клиенту DNSSEC RRs для самостоятельной валидации; шифрование не даёт невалидирующему клиенту доказательств аутентичности данных (доверие — только AD-биту); шифрованный транспорт решает проблему «DNSSEC roadblocks» от middlebox (RFC 8027);
  • доступность: зашифрованные сервисы должны иметь доступность не ниже незашифрованных; особая защита от DoS;
  • паритет сервиса: тот же уровень услуг, что на cleartext-канале (фильтрация или её отсутствие, DNSSEC-валидация и т.п.);
  • мониторинг: шифрование ломает пассивный перехват трафика; нужны альтернативы — экспорт с самого резолвер-софта (например, dnstap), privacy-сознательный мониторинг (Bloom filters);
  • TLS-прокси перед DNS-сервером (nginx/haproxy/stunnel) ограничивает: весь трафик выглядит исходящим от прокси, что ломает ACL, Response Rate Limiting, DNS64 (RFC 6147); риск утечки при незашифрованном плече прокси→цель; альтернатива — DNS-aware прокси (dnsdist) с опциями добавления исходной информации (DNS-XPF).

Данные в покое и на выходе

  • минимизация хранения; при хранении — шифрование, агрегация, псевдонимизация/анонимизация;
  • логи — только на срок, нужный для работы и законодательства; доступ персоналу по принципу минимума;
  • QNAME minimization (RFC 7816) — обязательна: иначе авторитативные серверы видят имена запросов;
  • уважать SOURCE PREFIX-LENGTH=0 в EDNS Client Subnet (RFC 7871 §7.1.2);
  • если ECS слать — кратчайший операционно-целесообразный префикс и allowlisting апстримов;
  • агрессивное использование DNSSEC-валидированного кэша (RFC 8198) + NXDOMAIN-спрашивание (RFC 8020) — меньше запросов к авторитативным; локальная копия корневой зоны (RFC 8806) — не светить запросы к корневым серверам;
  • обфускация апстрим-трафика: апстрим-запросы идут в cleartext; резолвер с маленьким комьюнити рискует раскрыть клиентов — следует примешивать сгенерированный трафик и агрессивный prefetch; малым операторам — форвардить трафик в более крупный резолвер с совместимой privacy-политикой по зашифрованному протоколу (k-anonymity);
  • не делиться идентифицируемыми данными с третьими сторонами; при особых случаях — публиковать условия.

Анонимизация IP-адресов (Appendix B)

Категоризация (по RFC 6235): format-preserving; prefix preservation; replacement; filtering; generalization; enumeration; reordering/shuffling; random substitution; cryptographic permutation. Конкретные методы:

  • Google Analytics non-prefix filtering: обнуление младших 8 бит IPv4 и 80 бит IPv6 — слабая анонимизация (расхождение определения города до 17%);
  • dnswasher (PowerDNS): формат-сохраняющая замена перечислением; таблицы растут без ограничений;
  • prefix-preserving map (TCPdpriv): недетерминированность, неограниченная память;
  • Crypto-PAn: криптографическая prefix-preserving псевдонимизация, детерминирована ключом, существенные CPU-затраты;
  • TSA (Top-hash Subtree-replicated): быстрая, для IPv6 неэффективна по памяти;
  • ipcipher (PowerDNS): AES-128 для IPv6, ipcrypt для IPv4 — автор признал низкую стойкость ipcrypt (уязвим к атаке);
  • Bloom filters (DNSBLOOM): определение Indicators of Compromise из подсетей без хранения запросов отдельных пользователей.

Ключевая атака: любая формат-сохраняющая псевдонимизация уязвима к chosen-plaintext атаке (Brekne & Årnes): если атакующий может добиться захвата пакетов целью, слать ей поддельный трафик с произвольными адресами и получить де-идентифицированный лог — ограниченная энтропия IPv4 делает псевдоним обратимым.

Recursive Operator Privacy Statement (RPS)

Для соответствия BCP оператор SHOULD опубликовать RPS с фиксированным порядком разделов (облегчение сравнения):

  • Policy: заявление, что IP-адреса — персональные данные; какие данные собираются/хранятся/как долго; исключения; связанные организации; корреляция DNS-данных с другой личной информацией; фильтрация результатов по категориям (безопасность сети, обязательные юридические, добровольные юридические, прочие) с указанием происхождения списков;
  • Practice: отклонения от политики; клиентские возможности по каждому разделу (для DoT — ADN и/или SPKI pin sets и политика ротации); апстрим-возможности; контакты поддержки; ссылки на заявления о обработке данных;
  • Enforcement: transparency reports; независимый мониторинг (ECS, QNAME-минимизация, padding, фильтрация, аптайм); опционально сторонний аудит.

Практические примеры

Проверка DoT-сервера

Проверить поддержку DoT публичным резолвером можно утилитой dig из пакета bind9-utils (реализация DoT есть в dig начиная с BIND 9.16):

dig +tls @1.1.1.1 example.com
dig +tls @dns.google example.com

Конфигурация локального резолвера

Пример DoT-форвардинга в unbound (файл unbound.conf):

forward-zone:
    name: "."
    forward-tls-upstream: yes
    forward-addr: 1.1.1.1@853#cloudflare-dns.com
    forward-addr: 8.8.8.8@853#dns.google

Синтаксис «ip@port#ADN» соответствует модели RFC 8310: клиент подключается по IP на порт 853 и проверяет сертификат на имя ADN (аутентификация domain name).

Проверка ALPN и сертификата

Исследовать TLS-параметры DoT-эндпоинта можно средствами openssl:

echo | openssl s_client -connect 1.1.1.1:853 -servername cloudflare-dns.com -alpn dot 2>/dev/null | grep -E "ALPN|subject"

Резюме

DNS over TLS — зрелый, стандартизированный протокол шифрования DNS-трафика на сегменте stub→recursive, основанный на двух краеугольных камнях: RFC 7858 (транспорт, порт 853, фреймирование, профили) и RFC 8310 (строгая типология профилей, ADN, DANE, механизмы аутентификации). Ключевые технические факты, которые стоит запомнить:

  • DoT работает поверх TCP на порту 853; первый обмен — TLS-handshake; cleartext на DoT-портах запрещён безусловно, включая после failed handshake;
  • фреймирование — двухоктетное поле длины (RFC 1035 §4.2.2); максимальное сообщение — 65535 байт;
  • сопоставление ответов — по Message ID и (при наличии Question Section) QNAME/QCLASS/QTYPE; ответы могут приходить out of order;
  • два базовых профиля — Opportunistic (без строгой аутентификации) и Key-Pinned (SPKI-пины, несовпадение — невосстановимая ошибка); RFC 8310 формализует Strict (hard failure при сбое аутентификации) и Opportunistic (каскад A+E → E → cleartext);
  • аутентификация — по ADN в subjectAltName (PKIX, RFC 6125) или через DANE/TLSA (DNSSEC), или через SPKI pin sets; ADN проверяется строго по subjectAltName, поле Subject не проверяется;
  • производительность: +1 RTT на TCP (устраняет TFO), +2 RTT на TLS-handshake (устраняет resumption/PSK и False Start); сервер должен минимизировать состояние и держать idle-соединения;
  • 0-RTT в DoT неприменим из-за replay-рисков (тайминг-оракулы, повторные исходящие запросы резолвера); resumption через PSK (TLS 1.3) — безопасен и рекомендован;
  • трафик-анализ — главный остаточный риск; митигируется EDNS(0) padding (запросы кратно 128, ответы кратно 468 по RFC 8467), но не устраняется полностью (тайминги и число запросов остаются видимыми);
  • DNSSEC и DoT независимы и дополняют друг друга: одно — целостность, другое — конфиденциальность;
  • операторам RFC 8932 предписывает DNSSEC-валидацию, QNAME minimization, EDNS0 padding, управление сертификатами (ACME, мониторинг истечения, короткий ADN), публикацию RPS и осторожность с TLS-прокси;
  • из трёх протоколов зашифрованного DNS DoT — самый простой и минимально накладный; DoH выигрывает в смешивании с HTTPS-трафиком и кэшировании; DoQ — в задержке, мобильных сценариях и zone transfers.

DoT — это не «DNS с шифрованием вообще», а точный протокол с продуманными профилями, ограничениями и осознанными компромиссами. Понимание его внутреннего устройства — необходимое условие для корректного проектирования, деплоймента и аудита современных DNS-инфраструктур.

Ссылки

×
Реклама
ИКС