Перейти к основному содержимому
Вернуться в категорию

Диагностика и решение проблем DNS

Полное руководство по диагностике и решению проблем DNS с помощью dig, nslookup, проверки распространения DNS, очистки кеша и решения распространённых ошибок DNS.

Время чтения: 14 мин Устранение неполадок
dnsdignslookupраспространениекешустранение неполадок

Содержание

Введение

DNS (Domain Name System) — один из фундаментальных компонентов интернет-инфраструктуры. Эта система преобразует доменные имена в IP-адреса, и при её некорректной работе могут быть нарушены многие сервисы: доступ к веб-сайтам, доставка электронной почты и подключения к серверам.

В этом руководстве мы подробно рассмотрим инструменты и методы диагностики и решения проблем DNS.

Основы DNS

Типы DNS-записей

Тип записиОписаниеПример
AСопоставление с IPv4-адресомexample.com → 1.2.3.4
AAAAСопоставление с IPv6-адресомexample.com → 2001:db8::1
CNAMEПсевдоним другого доменаwww → example.com
MXМаршрутизация почтового сервераmail.example.com (приоритет: 10)
TXTТекстовая запись (SPF, DKIM и т.д.)v=spf1 ip4:1.2.3.4 -all
NSОпределение сервера имёнns1.example.com
PTRОбратная DNS-запись4.3.2.1 → example.com
SOAЗапись авторитета зоныTTL, serial, refresh

Процесс разрешения DNS

Пользователь → Локальный DNS-кеш → Рекурсивный резолвер → Корневой NS → TLD NS → Авторитетный NS → IP-адрес

Диагностика DNS с помощью команды dig

dig (Domain Information Groper) — самый мощный инструмент для диагностики проблем DNS.

Базовое использование

hljs bash
# Запрос A-записи
dig example.com A

# Запрос с определённого DNS-сервера
dig @8.8.8.8 example.com A

# Краткий вывод
dig example.com +short

# Запрос всех типов записей
dig example.com ANY

# Запрос MX-записи
dig example.com MX

# Запрос NS-записи
dig example.com NS

# Запрос TXT-записи
dig example.com TXT

Детальные запросы

hljs bash
# Режим трассировки — показывает процесс разрешения пошагово
dig example.com +trace

# SOA-запись — информация о зоне
dig example.com SOA

# Обратный DNS-запрос
dig -x 1.2.3.4

# Запрос по TCP (для больших ответов)
dig example.com +tcp

# Проверка DNSSEC
dig example.com +dnssec

Чтение вывода dig

hljs bash
$ dig example.com A

;; QUESTION SECTION:
;example.com.                   IN      A

;; ANSWER SECTION:
example.com.            300     IN      A       93.184.216.34

;; AUTHORITY SECTION:
example.com.            86400   IN      NS      ns1.example.com.

;; Query time: 23 msec
;; SERVER: 8.8.8.8#53(8.8.8.8)
;; MSG SIZE  rcvd: 56

Ключевые поля:

  • ANSWER SECTION: Ответ на запрос
  • TTL (300): Время хранения записи в кеше (секунды)
  • Query time: Время ответа
  • SERVER: DNS-сервер, предоставивший ответ

Команда nslookup

nslookup — более простой инструмент для DNS-запросов:

hljs bash
# Базовый запрос
nslookup example.com

# Запрос с определённого DNS-сервера
nslookup example.com 8.8.8.8

# Запрос MX-записи
nslookup -type=MX example.com

# Запрос NS-записи
nslookup -type=NS example.com

# Обратный DNS
nslookup 1.2.3.4

Проверка распространения DNS

При внесении изменений в DNS требуется время для распространения новых записей на все DNS-серверы.

Время распространения

Тип записиТипичный TTLВремя распространения
A / AAAA300-3600 сек5 мин - 1 час
MX3600-86400 сек1 - 24 часа
NS86400 сек24 - 48 часов
TXT300-3600 сек5 мин - 1 час

Проверка с разных DNS-серверов

hljs bash
# Google DNS
dig @8.8.8.8 example.com A +short

# Cloudflare DNS
dig @1.1.1.1 example.com A +short

# Quad9 DNS
dig @9.9.9.9 example.com A +short

Онлайн-инструменты проверки распространения:

Чтобы ускорить распространение DNS, уменьшите значение TTL перед внесением изменений (например, 300 секунд). После завершения изменений можно снова увеличить TTL.

Очистка DNS-кеша

Очистка кеша операционной системы

hljs bash
# Linux (systemd-resolved)
sudo systemd-resolve --flush-caches
sudo resolvectl flush-caches

# macOS
sudo dscacheutil -flushcache
sudo killall -HUP mDNSResponder

# Windows
ipconfig /flushdns

Очистка кеша DNS-сервера

hljs bash
# Очистка кеша BIND named
sudo rndc flush

# Для определённой зоны
sudo rndc flushname example.com

# Очистка кеша Unbound
sudo unbound-control flush_zone example.com

DNS-кеш браузера

Для очистки DNS-кеша в Chrome:

chrome://net-internals/#dns → Clear host cache

Распространённые проблемы DNS и решения

1. NXDOMAIN (Домен не найден)

hljs bash
$ dig nonexistent.example.com
;; ->>HEADER<<- opcode: QUERY, status: NXDOMAIN

Причины:

  • Доменное имя написано с ошибкой
  • DNS-запись ещё не создана
  • Срок действия домена истёк

Решение:

hljs bash
# Проверьте WHOIS-информацию домена
whois example.com

# Проверьте серверы имён
dig example.com NS +short

# Запросите с авторитетного NS
dig @ns1.example.com example.com A

2. SERVFAIL

Причины:

  • Сервер имён недоступен
  • Ошибка проверки DNSSEC
  • Повреждённый файл зоны

Решение:

hljs bash
# Проверьте доступность сервера имён
dig @ns1.example.com example.com A

# Проверьте статус DNSSEC
dig example.com +dnssec

# Попробуйте другой резолвер
dig @1.1.1.1 example.com A

3. Возвращается неправильный IP-адрес

Решение:

hljs bash
# Очистите кеш
sudo systemd-resolve --flush-caches

# Запросите напрямую с авторитетного NS
dig @ns1.example.com example.com A +short

# Проверьте путь разрешения с помощью trace
dig example.com +trace

4. Медленное разрешение DNS

Решение:

hljs bash
# Измерьте время ответа DNS
dig example.com | grep "Query time"

# Сравните разные DNS-серверы
for dns in 8.8.8.8 1.1.1.1 9.9.9.9; do
  echo "$dns: $(dig @$dns example.com +short +stats | grep 'Query time')"
done

Для постоянных настроек DNS используйте конфигурацию systemd-resolved или NetworkManager вместо прямого редактирования /etc/resolv.conf.

Скрипт диагностики DNS

hljs bash
#!/bin/bash
DOMAIN="example.com"

echo "=== Диагностика DNS: $DOMAIN ==="

echo -e "\n[1] Серверы имён:"
dig $DOMAIN NS +short

echo -e "\n[2] A-запись:"
dig $DOMAIN A +short

echo -e "\n[3] MX-запись:"
dig $DOMAIN MX +short

echo -e "\n[4] TXT-записи:"
dig $DOMAIN TXT +short

echo -e "\n[5] Проверка распространения:"
for dns in 8.8.8.8 1.1.1.1 9.9.9.9; do
  result=$(dig @$dns $DOMAIN A +short)
  echo "  $dns$result"
done

echo -e "\n=== Проверка завершена ==="

Заключение

Проблемы DNS — одни из самых распространённых в управлении серверами. Эффективно используя инструменты dig и nslookup, вы можете быстро диагностировать проблемы, отслеживать процессы распространения и решать проблемы с кешем. Не забывайте снижать значения TTL перед изменениями DNS и проверять с разных DNS-серверов после изменений.