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 / AAAA | IPv4 / IPv6-адрес |
CNAME | псевдоним: имя указывает на другое имя |
MX | почтовые серверы с приоритетом (меньше число — главнее) |
TXT | произвольный текст: SPF, DKIM, проверки владения доменом |
NS | DNS-серверы, отвечающие за зону |
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) с пояснениями по строкам |
+ttlunits | TTL в человеческом виде: 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)
| Часть | Что значит |
|---|---|
status | NOERROR — имя есть; NXDOMAIN — такого имени нет; SERVFAIL — сервер не смог ответить (часто сломан DNSSEC или авторитетный сервер); REFUSED — сервер отказался отвечать |
flags | qr — это ответ, 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даст уdigNXDOMAIN, хотя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.