Всегда занимает 4 секунды для разрешения DNS, но только в соседних контейнерах (PiHole)

Вопрос или проблема

Я сталкиваюсь с необычной проблемой, которую не могу отладить. Я запускаю PiHole на свежей установке Pi OS, используя Docker Compose с официальным YAML. Большинство имен быстро разрешаются по сети. Наши телефоны работают нормально, и мой Pi (хост) разрешает за миллисекунды. Однако внутри контейнеров разрешение DNS постоянно занимает 4 секунды.

Я прикрепил файлы resolv.conf и tcpdump, показывающий команду dig с временными метками. Похоже, что исходный DNS отвечает быстро, но что-то (?) задерживает ответ на 4 секунды, прежде чем dig сможет его отобразить. Эта задержка постоянна в нескольких контейнерах.

Если я dig \@9.9.9.9 или создаю контейнер с --dns 9.9.9.9, то все разрешается без проблем.

Я не думаю, что это проблема производительности, поскольку развернуто только пустое HomeAssistant (супервизированный) и PiHole. Я хочу понять это поведение, прежде чем рассматривать альтернативные развертывания, чтобы узнать больше. Спасибо!

services:
  pihole:
    container_name: pihole
    image: pihole/pihole:latest
    ports:
      - "53:53/tcp"
      - "53:53/udp"
      - "80:80/tcp"
    environment:
      TZ: 'America/Chicago'
      WEBPASSWORD: 'xxx'
    volumes:
      - './etc-pihole:/etc/pihole'
      - './etc-dnsmasq.d:/etc/dnsmasq.d'
    restart: unless-stopped

Файл /etc/resolv.conf моего хоста

search mynet
nameserver 192.168.1.200 # это IP моего хоста, объявленный маршрутизатором

В контейнере, кастомный мост, /etc/resolv.conf

nameserver 127.0.0.11
search mynet
options ndots:0

Dig внутри контейнера

# echo "Start time: $(date)"; dig google.co.uk; echo "End time: $(date)";
Start time: Wed Nov 27 00:40:59 UTC 2024

; <<>> DiG 9.18.25 <<>> google.co.uk
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: SERVFAIL, id: 418
;; flags: qr rd; QUERY: 1, ANSWER: 0, AUTHORITY: 0, ADDITIONAL: 0
;; WARNING: recursion requested but not available

;; QUESTION SECTION:
;google.co.uk.          IN  A

;; Query time: 4003 msec
;; SERVER: 127.0.0.11#53(127.0.0.11) (UDP)
;; WHEN: Wed Nov 27 00:41:03 UTC 2024
;; MSG SIZE  rcvd: 30

End time: Wed Nov 27 00:41:03 UTC 2024

tcpdump на хосте:

raspberrypi:~ $ sudo tcpdump -i any port 53
tcpdump: data link type LINUX_SLL2
tcpdump: verbose output suppressed, use -v[v]... for full protocol decode
listening on any, link-type LINUX_SLL2 (Linux cooked v2), snapshot length 262144 bytes
00:40:59.796224 veth0ddea5c P   IP 172.20.0.2.56842 > raspberrypi.domain: 418+ [1au] A? google.co.uk. (53)
00:40:59.796224 br-f55dbe3ca067 In  IP 172.20.0.2.56842 > raspberrypi.domain: 418+ [1au] A? google.co.uk. (53)
00:40:59.796632 docker0 Out IP raspberrypi.53123 > 172.17.0.2.domain: 418+ [1au] A? google.co.uk. (53)
00:40:59.796650 veth9cd97ad Out IP raspberrypi.53123 > 172.17.0.2.domain: 418+ [1au] A? google.co.uk. (53)
00:40:59.797518 veth9cd97ad P   IP 172.17.0.2.60829 > dns9.quad9.net.domain: 389+ [1au] A? google.co.uk. (53)
00:40:59.797518 docker0 In  IP 172.17.0.2.60829 > dns9.quad9.net.domain: 389+ [1au] A? google.co.uk. (53)
00:40:59.797632 wlan0 Out IP raspberrypi.60829 > dns9.quad9.net.domain: 389+ [1au] A? google.co.uk. (53)
00:40:59.803366 wlan0 In  IP dns9.quad9.net.domain > raspberrypi.60829: 389 1/0/1 A 142.250.187.227 (57)
00:40:59.803430 docker0 Out IP dns9.quad9.net.domain > 172.17.0.2.60829: 389 1/0/1 A 142.250.187.227 (57)
00:40:59.803441 veth9cd97ad Out IP dns9.quad9.net.domain > 172.17.0.2.60829: 389 1/0/1 A 142.250.187.227 (57)
00:40:59.803744 veth9cd97ad P   IP 172.17.0.2.domain > raspberrypi.53123: 418 1/0/1 A 142.250.187.227 (57)
00:40:59.803744 docker0 In  IP 172.17.0.2.domain > raspberrypi.53123: 418 1/0/1 A 142.250.187.227 (57)
00:40:59.803933 br-f55dbe3ca067 Out IP raspberrypi.domain > 172.20.0.2.56842: 418 1/0/1 A 142.250.187.227 (57)
00:40:59.803946 veth0ddea5c Out IP raspberrypi.domain > 172.20.0.2.56842: 418 1/0/1 A 142.250.187.227 (57)

Ответ или решение

Проблема, с которой вы столкнулись, связана с задержкой в разрешении DNS в контейнерах с использованием Pi-hole и Docker. Давайте проанализируем детали и возможные причины возникновения задержки в 4 секунды.

Описание проблемы

Вы упомянули, что при использовании сервиса Pi-hole на свежей установке Pi OS через Docker Compose, разрешение DNS в соседних контейнерах занимает около 4 секунд. При этом разрешение имен с внешними DNS-серверами, когда вы указываете IP напрямую (например, --dns 9.9.9.9), выполняется без задержек. Это указывает на то, что сам Pi-hole обрабатывает запросы быстро, но что-то задерживает процесс внутри сетевой среды Docker.

Анализ конфигурации

  1. Файл /etc/resolv.conf:

    • На хосте у вас настроен Pi-hole, который использует IP адрес вашей локальной сети (192.168.1.200).
    • В контейнере используется интерфейс с адресом 127.0.0.11. Это означает, что при запросе DNS используется встроенный DNS-сервер Docker, который может обрабатывать запросы на уровне самой виртуальной сети (overlay network).
  2. Логирование и мониторинг:

    • Результаты команды dig показывают, что запросы завершаются со статусом SERVFAIL, что может указывать на проблемы с рекурсией. Однако Pi-hole на вашем хосте обрабатывает запросы нормально, потому что внешние DNS-серверы вроде Quad9 отвечают быстро.
    • Задержка в 4 секунды на dig может быть связана с таймаутом при отсутствии ответа от DNS-сервера, что и отображается в ваших результатах.

Возможные причины задержки

  1. Проблемы с конфигурацией Docker:

    • Docker использует 127.0.0.11 для DNS, что может конфликтовать с настройками Pi-hole. Убедитесь, что внутренние контейнеры действительно используют Pi-hole как DNS-сервер или настроены на использование внешнего DNS.
  2. Настройки рекурсии:

    • Зафиксированный статус SERVFAIL указывает на то, что Pi-hole не может выполнить рекурсивный запрос. На Pi-hole проверьте настройки, связанные с разрешением DNS и конфигурацией upstream DNS-серверов.
    • Убедитесь, что Pi-hole может пинговать и успешно отправлять запросы к вашим выбранным DNS-серверам.
  3. Сетевые настройки:

    • Перепроверьте настройки сети Docker. Возможно, стоит попробовать изменить сетевую модель на host или bridge и проверить, как это повлияет на разрешение DNS.

Рекомендации по устранению проблемы

  1. Проверка и изменение DNS:

    • Измените конфигурацию контейнера, чтобы использовать IP-адрес Pi-hole (192.168.1.200) в качестве DNS-сервера в файлах конфигурации /etc/resolv.conf внутри контейнеров. Это можно сделать, добавив параметр dns в docker-compose.yml:
      dns:
      - 192.168.1.200
  2. Тестирование расчетов:

    • Выполните тестирование с другими именами и проверьте, будет ли разная скорость ответов для других доменов. Это поможет сузить круг возможных проблем.
  3. Логирование и отладка:

    • Включите более подробное логирование в Pi-hole для отслеживания запросов и попыток разрешения. Это даст дополнительные подсказки по поводу задержек.
  4. Тестирование через команду dig:

    • Пробуйте запускать dig с разными параметрами, чтобы определить, в каком моменте происходит задержка, и какая конфигурация даёт желаемый результат.

Заключение

Обратите внимание на сетевые настройки, конфигурацию DNS и возможность конфликтов между Docker и Pi-hole. Пошаговое тестирование и мониторинг должны помочь вам выявить и устранить проблему с задержкой в разрешении DNS внутри контейнеров.

Оцените материал
Добавить комментарий

Капча загружается...