← Весь справочник

dig

DNS-запросы — A, AAAA, MX, TXT, NS, обратный поиск, трассировка; чем dig отличается от getent hosts

dig спрашивает DNS-сервер напрямую и показывает ответ целиком: записи, их TTL, статус и какой сервер ответил. Им проверяют, что именно отдаёт DNS, без кешей приложений и локальных подмен.

Синтаксис

dig [@сервер] [опции] имя [тип] [+опции]

Тип по умолчанию — A. Сервер по умолчанию берётся из /etc/resolv.conf. Порядок аргументов свободный: dig MX example.com и dig example.com MX равнозначны.

Типы записей

ТипЧто хранит
A / AAAAIPv4 / IPv6-адрес
CNAMEпсевдоним: имя указывает на другое имя
MXпочтовые серверы с приоритетом (меньше число — главнее)
TXTпроизвольный текст: SPF, DKIM, проверки владения доменом
NSDNS-серверы, отвечающие за зону
SOAпараметры зоны: главный сервер, серийный номер, таймеры
PTRимя по IP (обратная зона); запрашивается через -x
SRVсервис: приоритет вес порт хост
CAAкакие центры сертификации могут выпускать сертификаты для домена

Опции с дефисом

ОпцияЧто делает
@серверспросить конкретный DNS-сервер (IP или имя)
-t ТИПтип записи — то же, что тип отдельным словом
-x IPобратный запрос: имя по адресу
-p портпорт DNS-сервера (по умолчанию 53)
-4 / -6ходить к серверу только по IPv4 / IPv6
-f файлпакетный режим: по одному запросу на строку файла

Опции с плюсом

ОпцияЧто делает
+shortтолько значения, без служебного вывода
+noall +answerтолько секция ответа, но с TTL и типом
+noall +answer +authorityответ и секция полномочий
+multilineдлинные записи (SOA, DNSSEC) с пояснениями по строкам
+ttlunitsTTL в человеческом виде: 2m58s
+traceпройти цепочку от корневых серверов до авторитетного
+norecurseне просить сервер искать за нас — спросить только то, что он знает сам
+tcpзапрос по TCP вместо UDP
+time=N / +tries=Nтаймаут ожидания и число попыток
+dnssecзапросить подписи DNSSEC

Как читать полный вывод

;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 2545
;; flags: qr rd ra; QUERY: 1, ANSWER: 2, AUTHORITY: 0, ADDITIONAL: 0

;; ANSWER SECTION:
example.com.		178	IN	A	104.20.23.154

;; Query time: 16 msec
;; SERVER: 192.168.65.7#53(192.168.65.7) (UDP)
ЧастьЧто значит
statusNOERROR — имя есть; NXDOMAIN — такого имени нет; SERVFAIL — сервер не смог ответить (часто сломан DNSSEC или авторитетный сервер); REFUSED — сервер отказался отвечать
flagsqr — это ответ, rd — рекурсия запрошена, ra — доступна, aa — ответ от авторитетного сервера зоны
ANSWER SECTIONзаписи: имя, TTL в секундах (сколько ещё можно кешировать), класс IN, тип, значение
AUTHORITY SECTIONкто отвечает за зону; в отрицательных ответах обычно SOA зоны
SERVERкакой сервер ответил и по какому протоколу

NOERROR с ANSWER: 0 значит «имя существует, но записей этого типа нет».

Примеры

# адрес домена — только значения
dig +short example.com

# ответ с TTL и типом, без остального шума
dig +noall +answer example.com

# почтовые серверы, TXT-записи, серверы зоны
dig +short example.com MX
dig +short example.com TXT
dig +short example.com NS

# спросить конкретный сервер — сравнить ответы разных DNS
dig @1.1.1.1 +short example.com

# спросить авторитетный сервер напрямую: свежие данные, без кешей
dig @$(dig +short NS example.com | head -1) +noall +answer example.com

# обратный запрос: имя по IP
dig +short -x 1.1.1.1

# статус ответа: NOERROR, NXDOMAIN, SERVFAIL
dig nosuch.invalid | grep status

# путь разрешения от корня
dig +trace example.com

# как имя видят программы на этой машине (с учётом /etc/hosts)
getent hosts localhost
getent ahostsv4 example.com

dig и getent hosts

Программы (curl, ssh, браузер) резолвят имена через системную библиотеку. Порядок источников задаёт строка hosts: в /etc/nsswitch.conf, обычно files dns: сначала /etc/hosts, потом DNS-серверы из /etc/resolv.conf. Запись в /etc/hosts побеждает DNS.

dig в /etc/hosts не смотрит — он всегда идёт в DNS. Чтобы проверить, куда реально пойдёт программа, используй getent:

КомандаЧто показывает
getent hosts имяпервый найденный адрес (сначала пробует IPv6)
getent ahosts имявсе адреса так, как их получит программа через getaddrinfo
getent ahostsv4 имятолько IPv4

Есть и более простые утилиты: host имя и nslookup имя — тоже спрашивают DNS, но показывают меньше деталей.

Подводные камни

  • dig не видит /etc/hosts. Имя только из /etc/hosts даст у dig NXDOMAIN, хотя curl по нему прекрасно ходит. И наоборот: dig может показать «правильный» IP, а программа пойдёт на подменённый.
  • +short молчит при ошибке. Пустой вывод бывает и при NXDOMAIN, и при отсутствии записи нужного типа, а код выхода всё равно 0. Причину смотри в полном выводе (status:).
  • getent hosts сначала ищет IPv6. Если в /etc/hosts для имени есть только IPv4, а в DNS есть AAAA, getent hosts покажет IPv6 из DNS. getent ahosts / ahostsv4 показывают то, что получит программа.
  • +short для CNAME печатает и промежуточное имя, и адреса — первая строка может оказаться не IP.
  • Кеш. Рекурсивный сервер отдаёт запись из кеша, пока не истёк TTL. После правки зоны старый ответ может жить ещё TTL секунд — сравни с ответом авторитетного сервера.
  • Имя без точки в конце. В выводе имена полные, с точкой: example.com.. В запросе точку можно не писать.
  • В песочнице внешний DNS может быть недоступен: тогда dig ждёт, пишет timed out и no servers could be reached и завершается с кодом 9.

См. также

curl · ip · ss · ssh