dig — стандартная утилита диагностики DNS из состава BIND. В отличие от nslookup, она показывает полную структуру ответа: секции, флаги, TTL и авторитетные серверы. Этого достаточно, чтобы отличить проблему на стороне клиента от ошибки в зоне, проверить делегирование и понять, почему имя не открывается.
Установка и первый запрос
В Debian, Ubuntu и Linux Mint утилита входит в пакет bind9-dnsutils; старый dnsutils остался переходным. В Fedora и RHEL пакет называется bind-utils, в Arch — bind.
sudo apt install bind9-dnsutils
sudo dnf install bind-utils
sudo pacman -S bind
dig -v
Простой запрос без параметров возвращает запись A для имени. Ключ +short оставляет только значение, что удобно для скриптов.
dig example.com
dig example.com A
dig example.com AAAA
dig example.com +short
Как читать вывод
Ответ делится на несколько частей. В заголовке указаны код состояния, идентификатор запроса и флаги. Затем идёт секция вопроса, секция ответа, секция авторитетных серверов и дополнительная секция.
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 34871
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1
;; ANSWER SECTION:
example.com. 3600 IN A 203.0.113.10
Код NOERROR означает, что запрос обработан, но не гарантирует наличие записи: при пустой секции ответа имя существует, просто записей такого типа нет. NXDOMAIN говорит, что имени нет вовсе. SERVFAIL — сервер не смог получить ответ, часто из-за проблем с DNSSEC или недоступности авторитетного сервера. REFUSED означает отказ по правилам доступа.
Флаги читаются так: qr — это ответ, rd — клиент просил рекурсию, ra — сервер её поддерживает, aa — ответ авторитетный, tc — ответ обрезан, ad — данные прошли проверку DNSSEC. Если rd есть, а ra нет, перед вами авторитетный сервер, который не обязан отвечать за другие зоны.
В строке ответа четыре поля: имя, TTL в секундах, класс IN, тип и значение. TTL показывает, сколько секунд запись можно держать в кэше.
Основные типы записей
AиAAAA— адреса IPv4 и IPv6.CNAME— псевдоним; цепочка может вести к другому имени.MX— почтовые серверы, перед именем стоит приоритет.TXT— текстовые данные: SPF, DKIM, подтверждения домена.NS— авторитетные серверы зоны.SOA— параметры зоны, включая серийный номер.CAA— какие удостоверяющие центры могут выпускать сертификаты.SRV— приоритет, вес, порт и цель сервиса.
dig example.com MX +short
dig example.com TXT +short
dig _sip._tcp.example.com SRV +short
dig example.com CAA +short
Запрос ANY в современном интернете бесполезен: по RFC 8482 многие серверы отвечают минимальным набором или отказом. Запрашивайте конкретный тип.
TTL и кэширование
TTL — главный источник путаницы при переезде сайта. Пока запись живёт в кэше провайдера или локального резолвера, клиенты видят старый адрес. Перед сменой A-записи уменьшите TTL до 300 секунд и подождите хотя бы прежний период, а после переключения верните нормальное значение.
Ответ из кэша отличается убывающим TTL и отсутствием флага aa. Чтобы увидеть исходное значение, спросите авторитетный сервер напрямую. Ключ +ttlunits печатает время в удобном виде.
dig example.com +ttlunits
dig @ns1.example.net example.com A
dig example.com NS +short
dig @8.8.8.8 example.com A
Отрицательный ответ тоже кэшируется. Время жизни определяется полем minimum в записи SOA и TTL самой SOA. Поэтому после исправления ошибки имя может оставаться недоступным ещё несколько минут или часов.
Делегирование и авторитетные серверы
Команда +trace проходит путь от корневых серверов до нужной зоны и показывает, кто делегирует домен. Это лучший способ найти ошибку в NS-записях родительской зоны.
dig +trace example.com
dig NS example.com +short
dig @a.iana-servers.net example.com A
dig example.com DS +short
Если родительская зона делегирует домен на серверы, которые не отвечают за него, получается «хромая» делегация. Симптом — SERVFAIL или пустой ответ при запросе через рекурсивный резолвер. Проверяйте список NS у регистратора и в самой зоне: они должны совпадать.
DNSSEC и ошибки валидации
Флаг ad появляется, когда проверяющий резолвер подтвердил подписи. Команда delv выполняет проверку самостоятельно и объясняет причину отказа.
dig +dnssec example.com
dig example.com DS +short
delv example.com
dig +cd example.com
Ключ +cd отключает проверку DNSSEC на резолвере. Если с ним ответ приходит, а без него — SERVFAIL, проблема в подписях: истёк срок действия, не совпадает ключ или родитель не опубликовал DS.
Частые проблемы
Имя не открывается, но ping работает. Сравните ответы разных резолверов и проверьте /etc/resolv.conf. В системах с systemd-resolved запросы идут на 127.0.0.53, а реальные серверы видны в resolvectl status.
resolvectl status
dig @127.0.0.53 example.com
cat /etc/resolv.conf
dig +search example.com
Ответ обрезан. Флаг tc означает, что ответ не поместился в UDP-пакет. Повторите запрос по TCP или ограничьте размер буфера.
dig +tcp example.com
dig +bufsize=1232 example.com
dig +ignore example.com
dig +time=2 +tries=1 example.com
Странные имена с точкой. Список search и параметр ndots заставляют резолвер дописывать суффиксы. Для проверки используйте +search, для отключения — полное имя с точкой на конце.
Старый фаервол не пропускает EDNS. Если большие ответы теряются, а маленькие проходят, проверьте +noedns. Это диагностический обход, а не постоянное решение: лучше разрешить EDNS на оборудовании.
Обратные запросы и автоматизация
Обратная запись проверяется ключом -x. Она нужна для почтовых серверов и логов, но не заменяет прямую.
dig -x 203.0.113.10 +short
dig +short A example.com | head -1
dig +short NS example.com | sort
dig +noall +answer example.com A
В скриптах используйте +short и ограничивайте время ожидания. Проверка доступности через DNS не должна висеть минутами: +time=2 +tries=1 ограничивает попытки.
Итог
dig даёт полную картину DNS-ответа: код состояния, флаги, TTL и источник данных. Научитесь читать секции и флаги — и большинство проблем с доменами будете локализовать за минуту. Помните про кэш и отрицательный TTL, проверяйте делегирование через +trace, а для DNSSEC используйте delv и +cd. Этих приёмов хватает, чтобы не гадать, почему сайт открывается не у всех клиентов.