Вопрос или проблема
У меня есть маршрутизатор, на котором работают несколько экземпляров dnsmasq
, по одному для каждой сети.
Экземпляры dnsmasq
настроены на делегирование к вышестоящему серверу:
server=192.168.0.1
Каждый из них обслуживает одну сеть, в этом примере 192.168.22.1.
Они также настроены на делегирование друг другу:
server=/guest.example.com/192.168.44.1
server=/iot.example.com/192.168.66.1
server=/subdomain.example.com/192.168.178.1
server=/guest.subdomain.example.com/192.168.179.1
Мой клиент использует systemd-resolved, который создает этот /etc/resolv.conf
из DHCP:
nameserver 192.168.22.1
search example.com
Когда я использую dig
, я могу без проблем разрешать все (мою сеть, мои другие сети, внешние домены).
Когда я использую nslookup
, я могу разрешать мою сеть и внешние домены так же, как использую dig
. Попытка разрешить другие сети работает немного иначе:
$ nslookup host2.subdomain.example.com
Server: 192.168.22.1
Address: 192.168.22.1#53
Name: host2.subdomain.example.com
Address: 192.168.178.11
;; communications error to 192.168.22.1#53: timed out
;; communications error to 192.168.22.1#53: timed out
;; communications error to 192.168.22.1#53: timed out
;; no servers could be reached
Та же проблема существует при использовании любой другой программы.
Пингую хост в моей сети:
$ ping -c1 host1.example.com
PING host1.example.com (192.168.22.23) 56(84) bytes of data.
64 bytes from host1.example.com (192.168.22.23): icmp_seq=1 ttl=64 time=0.031 ms
--- host1.example.com ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 0.031/0.031/0.031/0.000 ms
Пингую хост в другой сети (заняло 1м47с):
$ ping -c1 host2.subdomain.example.com
PING host2.subdomain.example.com (192.168.178.11) 56(84) bytes of data.
64 bytes from 192.168.178.11: icmp_seq=1 ttl=63 time=0.186 ms
--- host2.subdomain.example.com ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 0.186/0.186/0.186/0.000 ms
Пинг хоста в другой сети иногда еще хуже (заняло 2м0с):
$ ping -c1 host2.subdomain.example.com
ping: host2.subdomain.example.com: Temporary failure in name resolution
Журналы на маршрутизаторе показывают множество запросов для хоста и перенаправления, как это:
router dnsmasq[38907]: query[AAAA] host2.subdomain.example.com from 192.168.22.1
router dnsmasq[38907]: forwarded host2.subdomain.example.com to 192.168.178.1
Все эти проблемы с таймаутами происходят только в других сетях, никогда в моей собственной сети, никогда для вышестоящих запросов к DNS-серверу провайдера.
Я не знаю, что может быть причиной этих задержек / таймаутов.
Ответ или решение
Причины тайм-аутов делегирования DNS в dnsmasq могут быть многообразными, и важно тщательно проанализировать вашу конфигурацию и сеть для выявления конкретных проблем. В данной ситуации вы описали ряд аспектов, которые могут указывать на различные проблемы. Давайте разберем их подробнее.
1. Конфигурация dnsmasq
Вы используете несколько экземпляров dnsmasq для разных сетей, что подразумевает использование делегирования запросов на другие экземпляры. Это требует тщательной настройки, чтобы избежать тайм-аутов. Проверьте настройки каждого экземпляра dnsmasq, чтобы убедиться, что они правильно настроены на обработку запросов от других сетей.
Рекомендации:
- Убедитесь, что IP-адреса других экземпляров dnsmasq указаны правильно в конфигурации. Например,
server=/subdomain.example.com/192.168.178.1
должен указывать на корректный IP адрес другого экземпляра. - Проверьте отсутствие конфликтов в адресах. Если у вас несколько сетей, используйте уникальные диапазоны IP.
2. Проблемы с маршрутизацией
Судя по тому, что ping
на хосты в других сетях иногда заканчивается таймаутом (например, Temporary failure in name resolution
), это может указывать на проблемы с маршрутизацией между вашими сетями. Если пакеты не доходят до нужного экземпляра dnsmasq, это может приводить к тому, что запросы не обрабатываются вовремя.
Рекомендации:
- Проверьте маршруты на роутере и убедитесь, что все сети доступны между собой. Убедитесь в наличии маршрутных записей.
- Проверьте настройки вашего файрвола. Возможно, существуют правила, блокирующие ICMP или другие протоколы между сетями.
3. Логи dnsmasq
Логи dnsmasq показывают, что запросы действительно перенаправляются, что указывает на то, что dnsmasq получает эти запросы и пытается их обработать. Если запросы к другим сетям по каким-то причинам не обрабатываются или происходят сбои, то это может свидетельствовать о проблемах во взаимодействии с другими экземплярами.
Рекомендации:
- Увеличьте уровень логирования dnsmasq, чтобы получить больше информации о том, что происходит с запросами. Это может помочь вам определить, почему запрос к
192.168.178.1
терпит неудачу. - Проверьте логи на самом экземпляре, к которому перенаправляется запрос. Возможно, там есть дополнительная информация о причинах сбоев.
4. Проверка сети
Если сеть между вашим роутером и другими экземплярами dnsmasq ненадежна, это может затруднить обработку запросов.
Рекомендации:
- Используйте инструменты для мониторинга сети, такие как
traceroute
, чтобы определить, где происходит потеря пакетов или задержка (latency). - Проверьте общее состояние сети, чтобы убедиться, что нет поврежденных кабелей, неправильных конфигураций или аппаратных проблем.
5. Взаимодействие с systemd-resolved
Поскольку ваш клиент использует systemd-resolved
, это может добавить дополнительный уровень сложности.
Рекомендации:
- Проверьте, как
systemd-resolved
обрабатывает запросы. Возможно, имеет смысл временно отключить его иерархию, чтобы использовать стандартную конфигурацию DNS. - Убедитесь, что
systemd-resolved
корректно обновляет информацию, если происходит изменение маршрутов или адресов.
Заключение
Решение проблемы тайм-аутов делегирования DNS может потребовать многогранного подхода. Отслеживание путей и запросов, углубленный анализ логов и тщательная проверка маршрутизации помогут в диагностике и устранении проблемы. Не стесняйтесь использовать свои сетевые инструменты и возможности диагностики для более глубокого анализа, и при необходимости обновите систему до последней версии для исправления возможных ошибок.