Вопрос или проблема
Я запускаю виртуальную машину Debian 12 с установленными pihole+unbound (версия v5.18.3) и docker (версия 20.10.24). Когда я нахожусь внутри контейнера docker и выполняю команду “curl gitlab.my.domain”, которая должна разрешаться на мой локальный экземпляр GitLab через pihole, но я получаю следующую ошибку:
curl: (6) Не удалось разрешить хост:
и dig отвечает:
ошибка связи с 10.0.0.3#53: время ожидания истекло
На любом другом хосте в сети, включая саму виртуальную машину, DNS-запросы работают идеально. Все другие контейнеры на разных хостах не имеют этой проблемы. Порт открыт, и pi-hole работает нормально. Даже в resolv.conf внутри контейнера docker есть запись “nameserver 10.0.0.3”. Контейнер имеет подключение к сети хоста, так как он отвечает на стандартную страницу-заглушку. Я на грани отчаяния. Что я пропустил?
Настройки брандмауэра в pihole
были настроены неправильно (Отвечать только на интерфейсе eth0
).
Как была решена проблема:
Настройки > DNS > Настройки интерфейса > Разрешить все источники
Теперь он также разрешается в контейнере docker.
Ответ или решение
Проблема с отсутствием DNS-соединения из контейнера Docker на хост-сеть может вызывать многочисленные затруднения при работе с сетевыми приложениями. Давайте подробно рассмотрим вероятные причины и решения этой проблемы, основываясь на вашем описании.
Описание проблемы
Вы работаете с виртуальной машиной Debian 12, на которой установлены pihole и unbound, а также Docker. При попытке выполнить команду curl gitlab.my.domain
внутри контейнера Docker происходит ошибка разрешения имени хоста (код ошибки 6). Инструмент dig
сообщает о сбое связи с адресом DNS-сервера (10.0.0.3) и возвращает сообщение о таймауте.
Из вашего описания видно, что:
- DNS-запросы от других хостов в сети работают корректно.
- Контейнеры на других хостах не испытывают подобных проблем.
- Вы проверили, что порт открыт и pihole работает нормально.
- Файл
resolv.conf
внутри контейнера содержит корректный адрес DNS-сервера.
Эти улики указывают на проблемы с настройками взаимодействия контейнера с хостом.
Причины проблемы
-
Настройки интерфейса pihole: Выясняется, что в настройках pihole было установлено ограничение на отклик только на интерфейсе
eth0
. Это означает, что pihole может не отвечать на DNS-запросы, поступающие из других интерфейсов, которые Docker использует для связи. -
Изоляция сетевых пространств: Docker использует собственные изолированные сетевые пространства, и, возможно, в настройках сети контейнера не было указано, как связаться с хостовой сетью или hDNS-сервером.
-
Firewall: На уровне хоста или в настройках pihole могут быть агрессивные полосы фильтрации трафика, которые блокируют DNS-запросы из контейнера.
Решение проблемы
Как вы сами отметили в конце описания, проблема была решена изменением настроек pihole:
- Перейдите в интерфейс управления pihole: Settings > DNS > Interface Settings.
- Убедитесь, что опция Permit all origins активирована. Это изменение позволяет pihole отвечать на DNS-запросы с любых интерфейсов, что решает проблемы с доступом из контейнеров Docker.
Дополнительные рекомендации
-
Проверка сетевых настроек Docker: Убедитесь, что мостовая сеть Docker настроена корректно. Используйте команду
docker network ls
для проверки. -
Просмотр логов pihole: Логи pihole могут помочь выявить, не блокируются ли запросы из контейнера. Логи можно проверить с помощью команды
pihole -t
. -
Тестирование соединения: Вы можете попробовать запустить контейнер с параметрами сетевого режима
--network host
, чтобы проверить, будет ли проблема сохраняться. Этот режим позволяет контейнеру использовать сетевой стек хоста напрямую. -
Firewall: Убедитесь, что любые настройки фаервола на хост-машине не ограничивают доступ к DNS-серверу для пакетов из Docker-контейнеров.
Заключение
Настройка DNS в Docker может быть непростой задачей, особенно в сочетании с приложениями, такими как pihole. Правильная конфигурация интерфейсов и исключение изоляции входа могут существенно упростить работу. Надеюсь, данная информация будет вам полезна в дальнейшей настройке вашего окружения.