Теоретическую основу кэширования DNS в Linux мы разбирали в первой части, где говорили про работу процесса разрешения имен — от вызова getaddrinfo() до получения IP-адреса. Вторая часть была посвящена различным уровням кэшей самой системы, приложений и языков программирования, контейнеров, прокси - а также их мониторингу и сбросу. Теперь самое время перейти к практике.

Если вы когда-либо запускали подряд команды ping, curl, dig и получали разные IP-адреса, вы не одиноки. Поведение DNS в Linux — не просто вызов getaddrinfo(). Это взаимодействие множества слоёв: от glibc и NSS до NetworkManager, systemd-resolved, dnsmasq и облачных конфигураций. В этой части разберем практические аспекты DNS:

  • почему одинаковые запросы дают разные IP

  • как реально контролируется разрешение имен: что вызывает кого и зачем

  • как проводить диагностику: strace, resolvectl, tcpdump

Утилиты и их пути к DNS

В Linux-системах преобразование доменных имён в IP-адреса — фундаментальный процесс, но не все утилиты делают это одинаково. Под капотом скрываются конкурирующие механизмы: классический стек glibc/NSS (с его правилами из /etc/nsswitch.conf, локальным файлом /etc/hosts и кеширующими сервисами, такими как systemd-resolved), прямые DNS-запросы (игнорирующие системные настройки) и альтернативные библиотеки (например, c-ares). Эти различия часто становятся источником неочевидных расхождений в работе инструментов, особенно при диагностике сетевых проблем.

Типичный пример — разница в выводе getent hosts и dig для одного домена:

```bash
$ getent hosts google.com
142.250.179.206 google.com
$ dig +short google.com
142.250.179.238
```

Здесь getent опирается на кеш systemd-resolved (через NSS), а dig обходит системные механизмы, запрашивая DNS-сервер напрямую. 

Чтобы систематизировать эти нюансы, ниже представлена сводка по поведению популярных утилит.

Утилита

Что вызывает

Использует NSS

Обходит glibc

Особенности

ping

getaddrinfo()

да (через nsswitch.conf)

нет

Полностью зависит от libc. Не работает, если NSS сломан.

curl

getaddrinfo() или c-ares

да (если без c-ares)

да (если с c-ares)

Проверить: curl --version | grep c-ares. Без c-ares — зависит от NSS.

wget

getaddrinfo()

да

нет

Аналогичен ping, но можно форсировать IPv4/IPv6 (-4/-6).

dig

Прямой DNS-запрос (UDP/TCP)

нет

да

Всегда обходит glibc/NSS, то есть не использует /etc/hosts.

nslookup

Прямой DNS-запрос

нет

да

Исторически считается устаревшим. Аналогично dig обходит glibc/NSS.

getent hosts

gethostbyname() (NSS)

да

нет

Читает источники, заданные в nsswitch.conf

Python

gethostbyname() (libc)

getaddrinfo() (libc)

Прямой запрос (если pycares)

да (стандартные функции)

нет (pycares)

нет (стандартные функции)

да (pycares)

Стандартные функции (gethostbyname, getaddrinfo) зависят от NSS/libc.

Pycares всегда обходит системные настройки.

Поведение обратного DNS (getnameinfo) аналогично прямым функциям.

host

Прямой DNS-запрос

нет

да

Аналог nslookup с лаконичным выводом. Читает /etc/resolv.conf, игнорирует /etc/hosts

resolvectl

D-Bus → systemd-resolved

нет

да

Показывает настройки systemd-resolved, управляет кешем (например, flush-caches).

Не делает DNS-запросы — взаимодействует с демоном через D-Bus

Таким образом можно разбить утилиты на "системные" и "прямые":

  • Зависимые от NSS: ping, wget, getent, curl (без c-ares) — отражают системное состояние (кеш, /etc/hosts, настройки nsswitch.conf).

  • Обходящие NSS: dig, nslookup, curl (с c-ares) — игнорируют локальные правила, обращаясь напрямую к DNS.

Практические советы:

  • Если ping и curl выдают разные IP, причина обычно в кеше NSS или настройках /etc/hosts. 

  • При работе с curl/wget учитывайте их зависимость от libc: расхождения могут указывать на проблемы в NSS (например, некорректный nsswitch.conf).

  • Для проверки системного разрешения (включая /etc/hosts) используйте getent, host или ping.

  • Для валидации работы DNS-сервера применяйте dig/nslookup — они не смотрят в локальные файлы.

Итог: понимание внутренних механизмов разрешения имён критично при отладке сетевых проблем. Всегда сверяйтесь с таблицей выше, чтобы выбрать правильный инструмент: проверка локальных настроек требует NSS-зависимых утилит, а диагностика DNS — "прямых" запросов в обход системы.

Кто на самом деле управляет resolv.conf?

Когда-то давным-давно в далекой Галактике DNS настраивался простым редактированием /etc/resolv.conf:

```bash
nameserver 8.8.8.8
nameserver 1.1.1.1
search example.com
```

Сейчас же файл с содержанием nameserver 127.0.0.53 и предупреждением “DO NOT EDIT” может шокировать. Причина такого изменения в эволюции DNS-инфраструктуры:

Раньше: приложения → resolv.conf → DNS-сервер

Сейчас: приложения → локальный DNS-прокси → upstream серверы

В современных дистрибутивах /etc/resolv.conf – это чаще всего не ручная настройка, а автоматически генерируемый конфиг, создаваемый и поддерживаемый системными компонентами: systemd-resolved, NetworkManager, resolvconf или их аналогами вроде openresolv. Эта автоматизация приносит гибкость (разные DNS для разных сетей, DNSSEC, LLMNR/mDNS), но с другой стороны и некоторые потенциальные проблемы:

  • Настройки могут слетать после перезагрузки сети или обновления пакетов.

  • Конфликты при подключении VPN, которые пытаются переписать DNS.

  • Сложности с использованием локальных доменов или специфичных DNS-серверов.

  • Затрудненная отладка: куда на самом деле идут запросы?

Так кто же главный? systemd-resolved? NetworkManager? Как вернуть себе контроль?

Давайте разбираться в этом лабиринте: какие инструменты претендуют на управление /etc/resolv.conf, как они взаимодействуют и какие рычаги управления у нас есть, чтобы заставить DNS работать так, как нам нужно.

dhclient

Это стандартный DHCP-клиент в Linux-системах, входящий в пакет ISC DHCP. Его основная задача автоматически получать настройки сети (IP-адрес, сетевую маску, шлюз, DNS-сервера) у DHCP-сервера и применять их локально.

По умолчанию DHCP-клиент (программа /sbin/dhclient) не изменяет /etc/resolv.conf напрямую. Вместо этого вызывается вспомогательный скрипт /sbin/dhclient-script, который получает параметры (в том числе DNS-серверы) от DHCP-сервера.

Внутри dhclient-script есть функция make_resolv_conf(), которая формирует содержимое файла /etc/resolv.conf и записывает новые настройки DNS.

Кроме того используются так называемые хуки (скрипты), которые лежат в каталогах /etc/dhcp/dhclient-exit-hooks.d/ или /etc/dhcp/dhclient-enter-hooks.d/. Они позволяют изменить логику формирования или перезаписи /etc/resolv.conf, переопределяя функции или добавляя свои параметры.

Диагностика:

```bash
# Проверить конфигурацию DHCP-клиента
cat /etc/dhcp/dhclient.conf
# Запустить dhclient в debug-режиме 
dhclient -v -d <интерфейс>  # выведет подробный лог, включая обработку DNS).  
# Проверить lease-файл DHCP**  
cat /var/lib/dhcp/dhclient.leases # там хранятся полученные параметры, включая DNS-серверы
```

resolvconf

Это устаревший, но иногда встречающийся служебный инструмент для централизованного управления содержимым файла /etc/resolv.conf в UNIX-подобных системах. Он сохраняет и обновляет /etc/resolv.conf, собирая настройки DNS с различных источников: DHCP-клиентов, VPN-клиентов, сетевых интерфейсов, NetworkManager, позволяет нескольким программам и сервисам вносить свои DNS-серверы, динамически формируя итоговый конфиг для системы. Работает как демон или в виде набора скриптов-хуков, которые вызываются при изменении сетевой конфигурации, принимает входящие DNS-настройки через программу или скриптовые вызовы, обновляет кэш и генерирует конечный /etc/resolv.conf.

В resolvconf используются шаблоны для формирования итогового файла DNS:

- /etc/resolvconf/resolv.conf.d/head — вставляется в начало результата.

- /etc/resolvconf/resolv.conf.d/base — база доменов и серверов.

- /etc/resolvconf/resolv.conf.d/tail — добавляется в конец.

resolvconf может использоваться другими службами (например, NetworkManager, dhclient, openvpn) для централизованного обновления DNS-конфига.

В современных дистрибутивах часто заменяется или отключается в пользу systemd-resolved или других решений, но поддерживается для обратной совместимости.

Диагностика:

```bash
# Вывод актуальной информации
resolvconf -l
# Обновить /etc/resolv.conf
resolvconf -u
```

systemd-resolved

Это локальный кэширующий dns-сервер (systemd-networkd)

Процесс systemd-resolved слушает 127.0.0.53:53, и nameserver в resolv.conf указывает на 127.0.0.53 соответственно.

Файл /etc/resolv.conf обычно является symlink на /run/systemd/resolve/stub-resolv.conf

В свою очередь /run/systemd/resolve/stub-resolv.conf — содержит 127.0.0.53, а прямой список upstream DNS можно найти в файле /run/systemd/resolve/resolv.conf.

Диагностика:

```bash
# Основная информация о состоянии
resolvectl status
# Статистика запросов
resolvectl statistics
# Информация по конкретному интерфейсу
resolvectl status eth0
```

dnsmasq

Это простой DHCP/DNS сервер, который работает зачастую как локальный кэш на 127.0.0.1:53.

Обычно dnsmasq не пишет в resolv.conf самостоятельно, а читает upstream из resolv.conf, использует директиву --server= при запуске, или сервера прописаны в конфигурационном файле /etc/dnsmasq.conf.

Диагностика:

```bash
# Перезагрузка конфигурации
sudo kill -USR1 $(pidof dnsmasq)
# Проверка параметров запуска
ps aux | grep dnsmasq
```

NetworkManager

Это инструмент для автоматической настройки сети в большинстве современных десктопных и серверных дистрибутивах Linux. Был разработан компанией Red Hat в 2004 году для упрощения современных сетевых задач. Взаимодействие с ним настолько “упрощает” работу с сетью, что очень многие системные администраторы отключают его сразу.

Обычно NetworkManager получает настройки от DHCP (через внутренний DHCP-плагин или внешний dhclient), принимая DNS-серверы из DHCP-ответа (опция option domain-name-servers), и передает их в системную службу управления DNS. 

Поведение при обработке DHCP DNS можно контролировать через параметр ipv4.ignore-auto-dns:

  • ipv4.ignore-auto-dns=no (по умолчанию) - NM использует DNS-серверы, полученные от DHCP

  • ipv4.ignore-auto-dns=yes - игнорировать DNS от DHCP и использовать только статически заданные серверы

Сам  NetworkManager не обрабатывает DNS-запросы и не слушает порт 53, а в зависимости от настроек запускает dnsmasq (который слушает 127.0.0.1:53) или взаимодействует с systemd-resolved (обычно слушает 127.0.0.53:53).

Что запускается - зависит от параметра dns в /etc/NetworkManager/NetworkManager.conf:

dns=systemd-resolved — используется только systemd-resolved.

dns=dnsmasq — запускается dnsmasq через NetworkManager.

dns=none — NetworkManager не берет на себя функции управления резолвингом DNS

dns=default — NetworkManager сам решает, что делать.

При взаимодействии с systemd-resolved NetworkManager выступает в роли менеджера конфигурации, передавая параметры DNS через D-Bus API systemd-resolved, но не участвуя в обработке DNS-запросов напрямую. 

Тогда у нас будет наблюдаться следующая картина:

```bash
resolvectl status       # отображает текущие DNS-серверы, которые systemd-resolved получил от NetworkManager
nmcli dev show | grep DNS # показывает DNS-серверы, которые NetworkManager передал в systemd-resolved
```

При работе с dnsmasq NetworkManager запускает свой экземпляр dnsmasq.

В таком случае основные настройки, такие как список апстрим серверов, dnsmasq будет брать из сгенерированного ‘/run/NetworkManager/dnsmasq.conf’, а также в дополнительных файлах из каталога ‘/etc/NetworkManager/dnsmasq.d/. Управление /etc/resolv.conf при этом зависит от опции rc-manager. NM самостоятельно перезаписывает /etc/resolv.conf (rc-manager=file), указывая в нем nameserver 127.0.0.1, или создает symlink (значение по умолчанию, rc-manager=symlink) на свой служебный файл /run/NetworkManager/resolv.conf, чтобы все приложения обращались к dnsmasq.

При настройке по умолчанию ​​NetworkManager обычно решает, что выбрать следующим способом:

Если systemd-resolved активен (systemctl is-active systemd-resolved), NM будет использовать dns=systemd-resolved.

Если systemd-resolved не активен, и в сборке NM содержит dnsmasq, то он запускает собственный экземпляр dnsmasq (аналог dns=dnsmasq).

Нет ни systemd-resolved, ни dnsmasq - NM сам пишет resolv.conf с DNS от DHCP/static.

Диагностика:

```bash
# Информация о DNS по интерфейсам
nmcli dev show
# Проверка конфигурации NetworkManager
cat /etc/NetworkManager/NetworkManager.conf
```

unbound

Это удостоверяющий рекурсивный и кеширующий DNS сервер.

Процесс unbound по умолчанию слушает порт 53 на локальном интерфейсе 127.0.0.1:53. Настройки меняются в конфигурационном файле /etc/unbound/unbound.conf.

Диагностика:

```bash
sudo unbound-control status       # Проверка состояния
sudo unbound-control stats_noreset # Статистика запросов
journalctl -u unbound -f          # Логи в реальном времени
```

BIND

Berkeley Internet Name Domain — это полноценный DNS-сервер.

BIND был первым ПО, реализовавшим стандарт DNS (RFC 1034/1035), и до сих пор остается самым распространенным DNS-сервером в интернете. Также часто используется в корпоративных сетях.

Его системный процесс named по умолчанию слушает порт 53 на всех интерфейсах (0.0.0.0:53). Поведение может быть настроено в конфигурационном файле /etc/named.conf. Конфигурации зон обычно хранятся в /var/named. 

Диагностика:

```bash
sudo rndc status              # Проверка работы
sudo named-checkconf   # Проверка синтаксиса конфига
sudo rndc querylog on    # Включение логгирования (по умолчанию выключено)
tail -f /var/log/named/queries.log  # Просмотр запросов в реальном времени
journalctl -u named -f    # Системные логи (если используется systemd)
```

cloud-init

Это стандартный инструмент инициализации облачных инстансов (AWS, Azure, GCP, OpenStack и др.). Выполняет начальную настройку сети на этапе первичной загрузки виртуальной машины, включая установку DNS-серверов (полученных через метаданные облачного провайдера или из конфигурации), модификацию /etc/resolv.conf, интеграцию с другими сервисами (systemd-resolved, NetworkManager). После инициализации он обычно передает управление DNS другим сервисам (например, NetworkManager).

Диагностика:

```bash
# Проверить, активен ли cloud-init
sudo systemctl status cloud-init
# Просмотреть логи инициализации
sudo cat /var/log/cloud-init.log | grep "DNS"
# ключевые параметры в /etc/cloud/cloud.cfg:
manage_resolv_conf: true  # Разрешает cloud-init менять resolv.conf
resolv_conf:
  nameservers: ["8.8.1.1"]  # Статические DNS (если не получены от облака)
  search_domains: ["example.com"]
```

netplan

Это стандартный инструмент конфигурации сети в дистрибутивах Ubuntu (начиная с 17.10). Работает как абстрактный слой между YAML-конфигами и низкоуровневыми бэкендами (systemd-networkd или NetworkManager).

В зависимости от опции network.renderer (networkd/NetworkManager):

Netplan генерирует конфиг для systemd-networkd, который передает DNS-настройки в systemd-resolved, который в свою очередь создает:

  • /run/systemd/resolve/stub-resolv.conf → содержит nameserver 127.0.0.53 (символическая ссылка для /etc/resolv.conf)

  • /run/systemd/resolve/resolv.conf → реальные апстрим-серверы (только для чтения)

или

Netplan генерирует конфиг в /run/NetworkManager/conf.d/netplan.conf, и NetworkManager применяет настройки:

  • dns=systemd-resolved - создает /run/NetworkManager/resolv.conf → ссылка на stub-resolv.conf

  • dns=dnsmasq - указывает в /etc/resolv.conf → nameserver 127.0.0.1

Диагностика:

```bash
# Проверить актуальный бэкенд
sudo netplan info
grep "renderer" /etc/netplan/*.yaml
```

Независимый арбитр: трассировка как инструмент истины

Когда статический анализ конфигураций (resolv.conf, resolvectl, NetworkManager) и состояния сервисов не дают однозначной картины или их данные противоречат реальному поведению, на помощь приходит трассировка. Она показывает работу системы в динамике, минуя слои абстракции и потенциальные несоответствия конфигураций. 

Это последний арбитр для проверки гипотез, кто фактически обрабатывает DNS-запрос. Используется для обнаружения скрытых проблем, таких как игнорирование записей resolv.conf, некорректный выбор upstream, аудита и документирования, куда реально уходят запросы в сложном окружении.

Для трассировки используем два мощных инструмента:

  • strace - показывает взаимодействие приложения с ядром.

  • tcpdump - показывает реальный сетевой трафик.

1. Системные вызовы с strace.  Смотрим, что пытается сделать приложение.

bash
```
# Отслеживание сетевой активности приложения:
strace -f -e trace=network curl -s http://example.com > /dev/null

# Поиск обращения к конфигурации DNS:
strace -e openat,read,open myapp 2>&1 | grep -i resolv.conf
```

Ключевые моменты для анализа:

  • socket(AF_INET, SOCK_DGRAM, ...) – создание UDP-сокета (основной протокол DNS).

  • connect() или sendto() на порт 53 – попытка отправки DNS-запроса на конкретный адрес:порт.

  • Чтение /etc/resolv.conf (openat, read) – приложение использует классический механизм, полагаясь на этот файл. Серверы из него могут быть использованы (но не факт, см. tcpdump!).

  • Отсутствие чтения /etc/resolv.conf – сильный индикатор того, что приложение использует альтернативный механизм разрешения имен (например, напрямую через API systemd-resolved), объясняя работу с nameserver 127.0.0.53 без явного чтения файла.

2. Сетевой трафик с tcpdump. Куда запросы идут на самом деле?

bash
```
# Общий мониторинг DNS (UDP/TCP порт 53):
sudo tcpdump -ni any port 53
# Мониторинг конкретного интерфейса:
sudo tcpdump -ni tun0 port 53
# Для чистоты эксперимента: одна консоль - tcpdump, другая - `dig example.com`
```

Интерпретация:

  • Запросы к публичным DNS (8.8.8.8:53, 1.1.1.1:53): приложение или прокси обращается напрямую к внешним серверам.

  • Важно: если в /etc/resolv.conf указан 127.0.0.53 (или др. локальный адрес), но запросы идут напрямую наружу – это проблема (приложение/прокси игнорирует настройки).

  • Запросы только к 127.0.0.53:53 – классический признак работы через systemd-resolved.

  • Запросы к 127.0.0.1:53 (или др. localhost) – указывает на другой локальный DNS-прокси (dnsmasq, unbound и т.д.).

  • Отсутствие запросов при повторных обращениях – скорее всего, сработал кэш (локальный в приложении, в systemd-resolved или другом прокси).

  • Запросы к неожиданным адресам – возможно влияние VPN (если виден его DNS) или вредоносного ПО.

3. Анализ upstream-серверов. Куда смотрит локальный прокси?

Если у вас работает локальный прокси (systemd-resolved, dnsmasq), важно проверить, на какие фактические серверы он отправляет запросы.

bash
```
# Фильтрация локального трафика между приложением и прокси:
sudo tcpdump -n port 53 and not \(host 127.0.0.53 or host 127.0.0.1\)
```

Что это дает:

Показывает только запросы, которые прокси отправляет внешним (upstream) DNS-серверам.

Позволяет проверить, использует ли прокси заданные серверы.

Критически важно для обнаружения утечек DNS, особенно при использовании VPN: если вы видите запросы к серверам вашего провайдера или публичным DNS, а не к VPN-серверу, когда туннель активен – это утечка.

В итоге трассировка снимает все слои абстракции и показывает актуальный маршрут DNS-запроса. 

Сравнение результатов strace/tcpdump со статической конфигурацией дает полное понимание, кто и как управляет разрешением имен в вашей системе.

Практика

Теперь, когда мы разобрали основные компоненты и методы диагностики, перейдем к практическому применению. Ниже попытался собрать информацию в краткий пошаговый алгоритм, который поможет определить, какая служба управляет DNS и где искать возможные проблемы с конфигурацией.

Reboot or not reboot? Механизмы чтения resolv.conf и необходимость перезапуска приложений

Как мы уже поняли, файл /etc/resolv.conf является ключевым компонентом системы разрешения DNS в Linux. При этом не только управление им бывает разным, но и способ его обработки различными приложениями и средами выполнения существенно отличается, что приводит к важным последствиям при изменении DNS-конфигурации.

Существует три основных подхода к работе приложений с файлом resolv.conf:

1. Прямое чтение при каждом запросе (glibc, стандартные утилиты)

Используется системный вызов getaddrinfo() с проверкой mtime файла перед каждым чтением. Пример реализации в glibc:

```c
if (stat("/etc/resolv.conf", &statb) == 0 && 
    statb.st_mtime != _res.res_conf_mtime) {
    __res_vinit(&_res, 1); // Перечитывание файла
}
```

Преимущества: Мгновенная реакция на изменения

Недостатки: Дополнительные системные вызовы при каждом DNS-запросе

2. Кэширование при старте (Java, Go <1.21)

Конфигурация загружается один раз при инициализации и хранится в статических переменных. Пример в Go (до версии 1.21):

```go
var dnsConf struct {
    sync.Once
    conf *dnsConfig
}

func initDNS() {
    dnsConf.Do(func() {
        // Чтение происходит только один раз
        dnsConf.conf = dnsReadConfig("/etc/resolv.conf")
    })
}
```

Преимущества: Высокая производительность, отсутствие лишних I/O операций

Недостатки: Необходимость перезапуска приложения при изменении DNS

3. Гибридный подход (браузеры, современные языки)

Первоначальное чтение при запуске с периодической проверкой изменений через:

- inotify (Linux)

- kqueue (BSD)

- D-Bus (системные события)

```javascript
// Пример в Node.js
const fs = require('fs');
const { Resolver } = require('dns');
const resolver = new Resolver();

// Функция для обновления DNS-серверов
function updateDNS() {
  try {
    const data = fs.readFileSync('/etc/resolv.conf', 'utf8');
    const servers = data.split('\n')
      .filter(line => line.startsWith('nameserver'))
      .map(line => line.split(/\s+/)[1]);
    
    resolver.setServers(servers);
    console.log('DNS серверы обновлены:', servers);
  } catch (err) {
    console.error('Ошибка чтения resolv.conf:', err);
  }
}

// Инициализация при запуске
updateDNS();

// Отслеживание изменений 
fs.watch('/etc/resolv.conf', () => {
  console.log('Обнаружено изменение resolv.conf!');
  updateDNS();
});
```

В итоге, необходимость перезапуска приложения при изменении в файле resolv.conf определяется следующими факторами:

А. Уровень интеграции с системой

- Приложения, использующие glibc напрямую (C, Python через ctypes) не требуют перезапуска

- Языки со своим рантаймом (JVM, Go до 1.21) часто кэшируют конфигурацию

Б. Архитектура резолвера

- Статические реализации (традиционные прокси-серверы) требуют рестарта

- Динамические системы (Envoy, современные браузеры) могут обновляться “на лету”

Таким образом, базовый набор практических выводов можно сформулировать следующим образом. 

Без перезапуска работают:

- Стандартные Linux-утилиты (ping, curl, dig)

- Скрипты на Python/Ruby с нативными биндингами

- Приложения с явной поддержкой динамического обновления (Chrome, Firefox)

- Go-программы версии 1.21 и выше (с флагом GODEBUG=netdns=go)

Требуют перезапуска:

- JVM-приложения (из-за статической инициализации и кэширования в InetAddress)

- Go-программы до версии 1.21

- Традиционные прокси-серверы (nginx без директивы resolver)

- Долгоживущие демоны без механизма релоада конфигурации

Заключение

DNS в Linux — это многослойная система, где /etc/resolv.conf лишь верхушка айсберга. Настройки могут диктоваться systemd-resolved, NetworkManager, dhclient, cloud-init и другими компонентами, а поведение утилит — зависеть от кэширования, nsswitch.conf, и даже от того, когда и как именно приложение читает конфигурацию.

Мы увидели, что одинаковые DNS-запросы могут давать разные результаты в зависимости от используемой утилиты, что resolv.conf часто формируется динамически сразу несколькими источниками, а эффективная диагностика требует не только анализа конфигураций, но и наблюдения за реальным поведением — через strace, tcpdump и логи прокси-серверов.

Чтобы эффективно решать DNS-проблемы:

- Однозначно определите, кто и как формирует /etc/resolv.conf в вашей системе.

- Используйте правильные инструменты для нужной цели (“системные” или “прямые”).

- Учитывайте, что не все приложения автоматически замечают изменения DNS — иногда нужен перезапуск.

- При сомнениях — трассировка всегда покажет истинные маршруты запросов.

Понимание этих механизмов не только сэкономит часы отладки, но и позволит проектировать инфраструктуру, где домены резолвятся предсказуемо — в том числе в динамически меняющихся сетях и при сложных правилах маршрутизации.

В следующей части мы погрузимся в то, как устроен DNS в контейнерных средах: Docker, Podman, Kubernetes, и как не потерять контроль над резолвингом в изолированных пространствах имён и виртуальных сетях.

Комментарии (2)


  1. acmnu
    28.08.2025 10:10

    Ой вей! Я понимал что все грустно в модерновых дистрах, но чтоб на столько! Имхо проще с десктопа всю эту кунсткамеру вынести на гейт и там уже подымать корпоративные и не только VPN, ставить кеширующий DNS и т.д.


    На десктопе при этом лучше убрать NM и оставить netplan. Но вот на ноуте так не сделаешь, поскольку подключаться к левым сетям удобнее через NM.


  1. AlexGluck
    28.08.2025 10:10

    Для любителей суси и олдфагов напоминаю что есть ещё nscd, который для локального Кеша лес тоже ставили или стоит из коробки. Было бы неплохо и его в статью добавить.