linux-labs

Вики / Сеть

DNS и разрешение имён

Концепция Ubuntu 24.04 · systemd-resolved СетьDNSТраблшутинг

Как имя превращается в IP — resolv.conf, systemd-resolved, /etc/hosts, dig.

Чтобы обратиться к example.com, система превращает имя в IP. Порядок источников задаёт NSS (/etc/nsswitch.conf): обычно сначала /etc/hosts, затем DNS.

В Ubuntu DNS-резолвингом заведует systemd-resolved, а /etc/resolv.conf — символическая ссылка на его заглушку (127.0.0.53).

getent hosts example.com          # как система РЕАЛЬНО резолвит (учитывает hosts+DNS+NSS)
resolvectl status                 # текущие DNS-серверы и search-домены по интерфейсам
resolvectl query example.com      # запрос через systemd-resolved (как сделает приложение)

Важно: dig/nslookup ходят в DNS напрямую, а приложения резолвят через NSS. Поэтому для «как видит программа» бери getent hosts/resolvectl query, а dig — чтобы проверить сам DNS-сервер.

dig example.com                   # подробный DNS-запрос (пакет dnsutils/bind9-dnsutils)
dig +short example.com            # только ответ (IP) — удобно в скриптах
dig +short example.com AAAA       # IPv6-адрес
dig example.com MX                # записи типа (A, AAAA, MX, TXT, NS, SOA, CNAME…)
dig @8.8.8.8 example.com          # спросить КОНКРЕТНЫЙ сервер (мимо локального)
dig +trace example.com           # пройти делегирование от корня (где ломается)
dig -x 1.2.3.4                    # обратный запрос (PTR)
dig +noall +answer example.com   # только секция ответа
host example.com                  # коротко и просто
host -t MX example.com           # тип записи
nslookup example.com             # классика (интерактивный тоже)

/etc/hosts — локальные переопределения (обычно выше DNS):

127.0.0.1     localhost
192.168.1.10  myserver myserver.local
getent hosts myserver             # проверить, что переопределение видно системе
resolvectl flush-caches           # сбросить кэш systemd-resolved
resolvectl statistics             # хиты/промахи кэша

Пингуется IP, но не имена

DNS не работает. По лесенке: 1. resolvectl status — есть ли DNS-сервер у интерфейса (Current DNS Server). 2. getent hosts example.com — резолвится ли через систему вообще. 3. dig @8.8.8.8 example.com — отвечает ли публичный DNS (если да — проблема в локальном/resolved).

Имя резолвится не в тот IP

  • Запись в /etc/hosts перебивает DNS — проверь его (getent hosts имя).
  • Старый кэш: resolvectl flush-caches.
  • Несколько A-записей/round-robin — это нормально (балансировка).

resolv.conf затирается после ребута

Не правь /etc/resolv.conf напрямую (это симлинк на resolved). Настраивай DNS в netplan (nameservers:) или /etc/systemd/resolved.conf, затем sudo netplan apply / systemctl restart systemd-resolved.

Внутренние имена не резолвятся, внешние — да

Нет search-домена или нужного DNS для внутренней зоны. Проверь resolvectl status (Search Domains) и добавь домен/сервер в netplan.

dig работает, а приложение «не находит» хост

dig ходит в DNS мимо NSS. Проверяй через getent hosts/resolvectl query — причина в /etc/hosts, nsswitch.conf или кэше resolved.

getent hosts NAME                 # как резолвит система (для приложений)
resolvectl status                 # DNS-серверы и search-домены
dig +short NAME ; dig NAME MX     # быстрый ответ / тип записи
dig @8.8.8.8 NAME                 # проверить через публичный DNS
dig +trace NAME                   # где ломается делегирование
resolvectl flush-caches           # сбросить кэш
# локально: /etc/hosts ; постоянно: netplan nameservers