Безопасный DNS на Rust или почему Hickory DNS — это не просто очередной резолвер

06 фев 2026
5,431
639
49
2 недели

Знаете, какая самая «хрупкая» часть современной сетевой инфраструктуры? DNS. Протокол, придуманный в эпоху, когда интернет был маленьким и уютным, сегодня стал мишенью для атак, отравления кэша и бесконечных уязвимостей переполнения буфера. Мы привыкли полагаться на BIND или Unbound, написанные на C, и регулярно обновлять их после очередной критической дырки в безопасности.

Но что, если переписать всё это на языке, который по определению не дает выстрелить себе в ногу? Именно так появился проект Hickory DNS (ранее известный как Trust-DNS). Это амбициозная попытка создать полностью безопасный, производительный и современный стек DNS на языке Rust.

Hickory DNS

Что такое Hickory DNS и зачем он вам?

Hickory DNS — это не просто одна утилита, а целая экосистема. Разработчики разделили проект на несколько независимых библиотек (crates), что позволяет использовать только то, что нужно именно вам: от низкоуровневого кодирования пакетов до полноценного рекурсивного сервера.

Кому это может быть полезно?

Реклама
  1. Системным программистам, которым нужен надежный DNS-клиент в их приложении.
  2. DevOps-инженерам, ищущим легковесную и безопасную альтернативу тяжеловесным DNS-серверам.
  3. Разработчикам высоконагруженных систем, где важна каждая миллисекунда и безопасность памяти.

Главная фишка здесь — Memory Safety. В моей практике было немало случаев, когда странное поведение сети оказывалось следствием эксплуатации уязвимостей в старых C-библиотеках. Rust практически исключает такие проблемы на этапе компиляции.

Пять причин присмотреться к проекту

1. Безопасность «из коробки»

Разработчики поставили перед собой жесткую цель: никакой паники (panics) в коде и использование только безопасного Rust. Все ошибки обрабатываются явно. Это значит, что ваш DNS-сервер не «упадет» внезапно из-за некорректного пакета, присланного злоумышленником.

2. Современные протоколы (DoH и DoT)

Мир давно уходит от открытого текста в DNS. Hickory DNS поддерживает:

  • DNS-over-TLS (DoT): шифрование запросов для защиты от прослушивания.
  • DNS-over-HTTPS (DoH): позволяет маскировать DNS-трафик под обычный веб-трафик.
  • DNSSEC: полная поддержка проверки подписей, включая автоматическое переподписывание зон при динамических обновлениях.

3. Гибкость выбора криптографии

Интересный архитектурный ход: проект позволяет выбирать между двумя криптографическими провайдерами — ring или aws-lc-rs. Это важно для тех, кто работает в специфических окружениях или имеет строгие требования к сертификации криптомодулей.

4. Модульность как искусство

Вам не нужно тащить в проект весь сервер, если вы просто хотите сделать пару запросов. Библиотека разбита на:

  • hickory-proto: база для работы с протоколом.
  • hickory-client: для отправки запросов и обновлений.
  • hickory-resolver: замена стандартному системному резолверу.
  • hickory-server: конструктор для создания своего DNS-сервера.

5. Поддержка ANAME и других расширений

Помимо стандартных RFC, проект реализует полезные черновики, такие как ANAME (Address-specific DNS aliases), что очень удобно для работы с облачными ресурсами и CDN.

Как это выглядит в коде?

Давайте посмотрим, насколько просто использовать резолвер в своем Rust-проекте. Забудьте о мучениях с getaddrinfo.

use hickory_resolver::Resolver;
use hickory_resolver::config::*;

fn main() {
    // Создаем резолвер с системными настройками (например, из /etc/resolv.conf)
    let resolver = Resolver::from_system_conf().unwrap();

    // Выполняем запрос
    let response = resolver.lookup_ip("google.com.").unwrap();

    // Итерируемся по результатам
    for address in response.iter() {
        println!("Найден IP: {}", address);
    }
}

Кстати, если вам нужно что-то более специфичное, например, запросить записи через Google DNS по TLS, это настраивается буквально парой строк в конфигурации.

Практические кейсы

Создание собственного DNS-прокси

Если вы строите микросервисную архитектуру и вам нужно перехватывать или модифицировать DNS-запросы внутри сети, Hickory DNS Server станет отличным фундаментом. Он легкий, быстро запускается и потребляет минимум ресурсов в сравнении с Java или Go аналогами.

Замена системного резолвера в контейнерах

Часто стандартные резолверы в Alpine или других минималистичных дистрибутивах ведут себя странно с IPv6 или специфическими записями. Использование hickory-resolver внутри вашего приложения гарантирует предсказуемое поведение независимо от того, на какой ОС оно запущено.

Утилита resolve

В проекте есть отличная CLI-утилита, которая может стать вашей основной заменой dig или nslookup. Она показывает подробную информацию о том, через какие сервера прошел запрос и какие протоколы использовались.

Попробовать её можно так:

cargo install --bin resolve hickory-util
resolve www.example.com.

Технический бэкграунд

Проект активно использует just для управления сборкой. Если вы решите контрибьютить, обратите внимание, что тесты здесь очень серьезные. Есть разделение на обычные тесты, тесты со всеми фичами и тесты конкретных крипто-провайдеров. Это внушает доверие к стабильности кода.

Интересно, что проект пережил ребрендинг (раньше он назывался Trust-DNS). Это пошло ему на пользу: структура репозитория стала чище, а документация — понятнее.

Стоит ли переходить?

Hickory DNS — это проект для тех, кто ценит надежность. Если вы пишете на Rust, это фактически стандарт де-факто для работы с DNS. Если же вы системный администратор, то Hickory DNS Server — отличный кандидат для экспериментов в инфраструктуре, где безопасность стоит на первом месте.

Конечно, BIND никуда не денется в ближайшие годы, но будущее за инструментами, которые исключают целые классы ошибок еще на этапе написания кода. Hickory DNS — яркий представитель этого будущего.

Полезные ссылки:

Попробуйте внедрить его в свой следующий пет-проект или небольшую внутреннюю утилиту — уверен, вы оцените чистоту API и стабильность работы.

🍪 Мы используем файлы cookie и сервис аналитики Яндекс.Метрика, чтобы сайт работал лучше. Продолжая пользоваться devtrends.ru, вы соглашаетесь с обработкой данных согласно Политике конфиденциальности.