# DNS resolution _Сеть: L4 и выше · LinuxLab Knowledge Base_ **TL;DR:** Резолвинг имени → IP проходит через NSS: сначала `/etc/hosts`, потом DNS через `/etc/resolv.conf`. Порядок задаётся в `/etc/nsswitch.conf`. ## Что такое DNS Domain Name System (RFC 1035) - распределённая иерархическая БД, отображающая человекочитаемые имена в IP-адреса (и обратно). Запрос по UDP/53 (или TCP/53 для больших ответов). ## NSS - Name Service Switch В Linux **сам процесс резолвинга** - это вызов libc-функции `gethostbyname()` / `getaddrinfo()`. Эта функция через NSS-плагины опрашивает источники в порядке заданном в `/etc/nsswitch.conf`: ``` hosts: files dns ``` - **files** - `/etc/hosts` - **dns** - настоящий DNS-сервер - На системах с systemd-resolved - `resolve [!UNAVAIL=return] files dns` - С mDNS - `mdns_minimal [NOTFOUND=return] files dns` Поэтому `ping mysite.local` сначала ищет в `/etc/hosts` - это позволяет локально override'нуть любое имя без DNS. ## /etc/hosts Простейший резолвер, формат `IP name [aliases...]`: ``` 127.0.0.1 localhost ::1 localhost ip6-localhost 192.168.1.5 nas.local nas ``` Часто используется для: - Фиксации имени в dev-окружениях (`api.local` → `127.0.0.1`) - Блокировки доменов через Pi-hole-стиль (`0.0.0.0 ad-tracker.com`) - Hostname-трюков для тестов миграций ## /etc/resolv.conf Список DNS-серверов и их параметры: ``` nameserver 1.1.1.1 nameserver 8.8.8.8 search corp.example.com lab.example.com options timeout:2 attempts:1 ``` - **nameserver** - IP DNS-сервера, опрашиваются по очереди - **search** - суффиксы для **коротких** имён: `ping db1` пробуется как `db1.corp.example.com`, потом `db1.lab.example.com`, потом `db1.` - **options** - таймауты, количество попыток, randomize и т.п. На systemd-системах файл часто симлинк на `/run/systemd/resolve/...` и редактируется через `systemd-resolved` (или `NetworkManager`). ## getent vs dig Две команды резолвинга, **с разной семантикой**: - **`getent hosts name`** - идёт через NSS, **видит `/etc/hosts`** + кеш + DNS. Это путь которым пойдёт реальное приложение. **Это правильный инструмент** для «как мою команду увидит libc». - **`dig name`** - идёт **прямо в DNS-сервер** из `resolv.conf`, минуя `/etc/hosts`. Хорош для дебага DNS-сервера специально. Поэтому `dig mysite.local` может не вернуть ничего, а `getent hosts mysite.local` вернёт `127.0.0.1`. Это не баг - это разные слои. ## Типы записей - **A** - имя → IPv4 - **AAAA** - имя → IPv6 - **CNAME** - алиас одного имени на другое - **MX** - mail exchanger (почтовый сервер) - **TXT** - произвольный текст (SPF, DKIM, домен-верификация) - **NS** - какие nameserver'ы авторитетны для зоны - **PTR** - reverse: IP → имя - **SRV** - service record (host+port для конкретного сервиса) ## Команды ```bash getent hosts example.com ``` Резолвинг через NSS - видит /etc/hosts + кеши + DNS (как реальное приложение) ```bash dig example.com ``` Прямой запрос к DNS-серверу из /etc/resolv.conf, минуя /etc/hosts ```bash dig +short example.com ``` Только результат, без шапки ```bash dig MX gmail.com ``` Запросить определённый тип записи (MX = почтовый сервер) ```bash dig @1.1.1.1 example.com ``` Спросить конкретный nameserver (полезно сравнить разные DNS-серверы) ```bash dig -x 8.8.8.8 ``` Reverse-lookup: IP → имя ```bash resolvectl status ``` На системах с systemd-resolved: текущая DNS-конфигурация и кеш ## См. также - [UDP - User Datagram Protocol](/kb/udp-basics.md) - [DHCP - Dynamic Host Configuration Protocol](/kb/dhcp-protocol.md) - [dig - DNS-разведка с подробностями](/kb/cmd-dig.md) - [SMTP и MTA - доставка email](/kb/smtp-mta.md) - [systemd-resolved - локальный DNS-stub](/kb/systemd-resolved.md)