Как Linux резолвит имя
Вопрос
Что происходит, когда программа в Linux обращается к api.example.com? Где это может сломаться?
Попробуйте сами
Ответьте вслух за 2 минуты, как на собесе. Потом сверьтесь с тезисами: что прозвучало, а что нет.
Показать ответ и разбор
Коротко
Что должно прозвучать в ответе
Программа вызывает `getaddrinfo` из glibc
`/etc/nsswitch.conf` задаёт порядок: обычно `files` (`/etc/hosts`), затем `dns`
`/etc/resolv.conf`: серверы, `search`-домены, `options ndots`, в Ubuntu stub 127.0.0.53 от systemd-resolved
Резолвер идёт рекурсивно от корня к авторитетным серверам, ответы кешируются по TTL
Сломаться может: устаревший кеш и TTL, запись в `/etc/hosts`, `search`/`ndots` в Kubernetes, недоступный DNS-сервер, AAAA без IPv6
Диагностика: `getent hosts`, `dig`, `dig @сервер`, `resolvectl status`
Что могут спросить следом
- Что такое ndots и почему в Kubernetes из-за него лишние запросы?
- Почему после смены IP часть пользователей ещё ходит на старый?
Разбор
Программа вызывает getaddrinfo из glibc. Та смотрит /etc/nsswitch.conf: обычно сначала files, то есть /etc/hosts, потом dns. Для DNS берёт /etc/resolv.conf: список серверов, search-домены и опции. В Ubuntu там 127.0.0.53, это systemd-resolved с кешем, а реальные серверы видны в resolvectl status. Рекурсивный резолвер идёт от корневых серверов к зоне com и к авторитетным серверам домена, ответы кешируются на время TTL на всех уровнях. Ломается в типичных местах: забытая строка в /etc/hosts; старый IP в кешах после смены записи, пока не истечёт TTL; в Kubernetes ndots:5 и длинный search, из-за которых короткое имя сначала пробуется с несколькими суффиксами; приложение просит AAAA и пытается IPv6 без маршрута. Проверяю getent hosts (как видит система), dig (как отвечает DNS) и dig @8.8.8.8 для сравнения.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.