- Domain name resolution (Русский)
- Contents
- Name Service Switch
- Разрешение доменных имён с NSS
- Распознаватель glibc
- Перезапись файла /etc/resolv.conf
- Ограничение времени поиска
- Задержка при разрешении имени с IPv6
- Имена в локальном домене
- Утилиты
- Производительность
- Приватность и безопасность
- DNS в приложениях
- Oblivious DNS
- Сторонние службы DNS
- DNS-серверы
- Авторитативные серверы
- Условное перенаправление
Domain name resolution (Русский)
Доменное имя — символьное представление IP-адреса в системе доменных имён (Domain Name System, DNS). В статье рассмотрена настройка разрешения (resolution) доменных имён.
Contents
Name Service Switch
Name Service Switch (NSS) — функциональность стандартной библиотеки Си ( glibc ), на основе которой выполняется разрешение доменных имён при вызове getaddrinfo(3) . NSS объединяет управление базами данных различных служб, позволяя настраивать порядок поиска в этих базах с помощью файла nsswitch.conf(5) . За разрешение доменных имён отвечает база данных hosts, для которой glibc предлагает следующие службы:
systemd предоставляет три службы NSS для разрешения имён:
- nss-resolve(8) — кэширующий распознаватель-заглушка DNS, подробнее в статье systemd-resolved;
- nss-myhostname(8) — разрешение имён без редактирования /etc/hosts , подробнее в статье Настройка сети#Разрешение имён в локальной сети;
- nss-mymachines(8) — разрешение имён для локальных контейнеров systemd-machined(8) .
Разрешение доменных имён с NSS
Базы данных NSS можно опрашивать утилитой getent(1) . Разрешение доменного имени через NSS выполняется следующим образом:
Распознаватель glibc
Распознаватель glibc считывает файл /etc/resolv.conf при каждом разрешении имени, определяя сервер доменных имён и используемые опции.
В файле resolv.conf(5) перечислены сервера имён и настройки. Сервера используются в порядке перечисления, сверху вниз. Можно указать до трёх серверов. Строки, начинающиеся с символа решётки ( # ), игнорируются.
Перезапись файла /etc/resolv.conf
Сетевые менеджеры иногда перезаписывают файл /etc/resolv.conf . Подробности можно найти в соответствующих статьях:
Помешать программам изменять файл /etc/resolv.conf можно с помощью защиты от записи, атрибутом неизменяемости:
Ограничение времени поиска
Если поиск выполняется слишком медленно (например, при работе pacman или в браузере), попробуйте задать тайм-аут с небольшим значением. По истечении тайм-аута распознаватель выбирает следующий сервер имён из списка. Добавьте следующую строку в /etc/resolv.conf :
Задержка при разрешении имени с IPv6
Из-за неправильной настройки DNS-сервера или межсетевого экрана может возникать пятисекундная задержка при попытке выполнить разрешение имени двумя запросами, A и AAAA [1]. Добавьте следующую опцию в /etc/resolv.conf , чтобы решить проблему:
Имена в локальном домене
Чтобы имена локальных хостов можно было указывать без доменного имени, добавьте следующую строку в файл /etc/resolv.conf (домен замените на необходимый):
Теперь при работе, например, ssh можно сослаться на локальный хост строкой вида mainmachine1 (вместо mainmachine1.example.org ); в то же время другим командам (например, drill) всё ещё может требоваться полное имя домена.
Утилиты
С помощью специализированных DNS-утилит можно отправлять запросы конкретным DNS-серверам и/или запросы к записям DNS/DNSSEC определённого типа. NSS при этом не используется, поскольку в утилитах такого рода обычно имеется собственная реализация протокола DNS.
Например, для сбора DNS-информации можно использовать утилиту drill(1) из пакета ldns . Следующая команда запросит TXT-запись домена у указанного сервера имён:
Если DNS-сервер не указать, то drill будет отправлять запросы одному из указанных в /etc/resolv.conf серверов.
Производительность
В распознавателе glibc отсуствует кэширование ответов. Если кэширование всё же необходимо, то либо используйте systemd-resolved, либо запустите локальный кэширующий DNS-сервер. Во втором случае сервер будет работать как локальный сервер имён — добавьте адреса 127.0.0.1 и ::1 в файл /etc/resolv.conf (или в /etc/resolvconf.conf при работе через openresolv).
Приватность и безопасность
В базовом протоколе DNS шифрование сообщений не предусмотрено. По этой причине ни конфиденциальность запросов, ни целостность/подлинность ответов никак не проверяется и не гарантируются. В итоге ваши запросы могут быть «подслушаны», а ответы — изменены, например, при работе в недоверенной сети или при наличии у вашего интернет-провайдера некоего злого умысла. Помимо перечисленных проблем, существует такое явление как перехват DNS со стороны DNS-сервера.
Если вы всё же рассчитываете на некоторую конфиденциальность, то в первую очередь необходимо выбрать DNS-сервер, которому можно доверять. Сервера имён предоставляются как интернет-провайдерами, так и сторонними компаниями. Также можно запустить собственный рекурсивный сервер имён, но это, само собой, потребует некоторых дополнительных усилий. Если вы используете DHCP-клиент в недоверенной сети, убедитесь, что ваш распознаватель настроен на использование статических серверов, потому что иначе запросы будут отправляться на неизвестный посторонний сервер. Обезопасить соединение с удалённым DNS-сервером можно с помощью шифрования по протоколам DNS over TLS (RFC 7858), DNS over HTTPS (RFC 8484) и DNSCrypt, при условии, что и выбранный upstream-сервер, и ваш распознаватель одновременно поддерживают конкретный протокол. В качестве отдельного решения можно использовать специализированную программу для шифрования соединяний, — например, stunnel. Для проверки подлинности ответов (в самом ли деле они приходят от авторитативного сервера имён) можно использовать DNSSEC (опять же при условии, что он поддерживается и сервером, и вашим распознавателем).
DNS в приложениях
Некоторые клиентские программы, например, крупнейшие веб-браузеры, начали реализовывать DNS over HTTPS [2], [3]. С одной стороны, шифрование сообщений является неоспоримым плюсом; в то же время такие программы часто отправляют запросы «мимо» системного распознавателя [4].
Firefox предоставляет настройки для включения/отключение DNS over HTTPS и выбора сервера имён.
Chromium включает DoH, если сервера имён, используемые системным распознавателем, его поддерживают. Подробнее (в т.ч. о том, как отключить DoH) см. этот пост.
Также разработчики Mozilla предложили отключать DNS в приложениях, если системный распознаватель не может выполнить разрешение имени специального домена use-application-dns.net . В настоящее время эта проверка реализована только в Firefox.
Oblivious DNS
Oblivious DNS — система распознавания DNS-имён, которая призвана решить некоторые проблемы приватности. Подробнее см. статью Cloudflare.
Сторонние службы DNS
Существует целый DNS-служб от независимых производителей; для некоторых из них также разработаны специализированные программы.
С помощью dnsperftest можно замерить производительность наиболее популярных распознавателей для вашего географического расположения. На сайте dnsperf.com приведено глобальное сравнение производительности резличных провайдеров.
DNS-серверы
DNS-серверы делятся на авторитативные и рекурсивные. Если сервер не принадлежит к одному из этих двух типов, то он представляет из себя так называемый распознаватель-заглушку (stub resolver); его назначение — просто перенаправлять запросы к некоему рекурсивному серверу имён. Заглушки обычно используются для DNS-кэширования на хосте или в локальной сети. Обратите внимание, что то же самое можно получить и установив полноценный сервер имён. В данном разделе представлено сравнение доступных DNS-серверов, более подробное сравнение можно найти в статье Comparison of DNS server software.
Название | Пакет | Возможности | resolvconf | Поддерживаемые протоколы | ||||||
---|---|---|---|---|---|---|---|---|---|---|
Авторитативный | Рекурсивный | Кэш | Проверка DNSSEC | DNS | DNSCrypt | DNS over TLS | DNS over HTTPS | |||
BIND | bind | Да | Да | Да | Да | Да | Да | Нет | stunnel#DNS over TLS | Нет |
CoreDNS | corednsAUR или coredns-binAUR | ? | ? | ? | ? | ? | ? | ? | Да | ? |
Deadwood (MaraDNS recursor) | maradnsAUR | Нет | Да | Да | Нет | Нет | Да | Нет | Нет | Нет |
dnscrypt-proxy | dnscrypt-proxy | Нет | Нет | Да | Нет | Нет | Сервер | Распознаватель | Нет | Да |
dnsmasq | dnsmasq | Частично 1 | Нет | Да | Да | Да | Да | Нет | Нет | Нет |
Knot Resolver | knot-resolver | Нет | Да | Да | Да | Нет | Да | Нет | Да | Сервер |
pdnsd | pdnsd | Да | Да | Стойкий | Нет | Да | Да | Нет | Нет | Нет |
PowerDNS Recursor | powerdns-recursor | Нет | Да | Да | Да | Да | Да | Нет | Нет | Нет |
Rescached | rescached-gitAUR | Нет | Нет | Да | Нет | Да | Да | Нет | Нет | Ограниченно 2 |
SmartDNS | smartdns | Нет | Нет | Да | Нет | ? | Да | Нет | Распознаватель | Распознаватель |
Stubby | stubby | Нет | Нет | Нет | Да | Нет | Сервер | Нет | Распознаватель | Нет |
systemd-resolved | systemd | Нет | Нет | Да | Да | Да | Распознаватель и сервер (ограниченно) | Нет | Распознаватель | Нет |
Unbound | unbound | Частично | Да | Да 3 | Да | Да | Да | Сервер | Да | Сервер |
- Из Википедии: dnsmasq имеет ограниченную поддержку авторитативности, предназначенную главным образом для внутренних сетей, а не открытого Интернета.
- Только перенаправление, если сам Rescached получил DoH-запрос [5].
- Unbound может использовать Redis в качестве бэкэнда для стойкого кэширования.
Авторитативные серверы
Название | Пакет | DNSSEC | Географическая балансировка |
---|---|---|---|
gdnsd | gdnsd | Нет | Да |
Knot DNS | knot | Да | Да |
MaraDNS | maradns AUR | Нет | ? |
NSD | nsd | Нет | Нет |
PowerDNS | powerdns | Да | Да |
Условное перенаправление
Существует возможность настроить систему на использование определённого DNS-распознавателя для разрешения некоторых доменных имён. Например, очень удобно при подключении к VPN-сети запросы к ней же разрешать с помощью её собственного DNS, в то время как запросы к остальному интернету будут по прежнему разрешаться стандартным распознавателем. Также это можно использовать в локальных сетях.
Для реализации условного перенаправления понадобится локальный распознаватель, потому что glibc такую функцию не поддерживает.
В динамическом окружении (ноутбуки и в некоторой степени настольные компьютеры) необходимо настроить ваш распознаватель на основе сети(-ей), к которой(-ым) вы подключены. Проще всего это сделать с помощью openresolv, поскольку он поддерживает нескольких абонентов. Некоторые сетевые менеджеры также поддерживают этот механизм, либо через openresolv, либо через настройку распознавателя напрямую. Так, в NetworkManager реализовано условное перенаправление без openresolv.
Источник