Предотвратите разрешение DNS Tailscale внутри контейнера Podman.

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

Для контекста: я использую (с правами root) контейнеры Podman на своем хосте, который также подключен к VPN Tailscale. DNS хоста настроен через systemd-resolved.

С вчерашнего дня я сталкиваюсь с проблемой, когда мой контейнер с Roundcube (веб-почтовый клиент) крайне медленно подключается к контейнеру почтового сервера: каждое действие (вход в систему, перечень папок, открытие сообщения) занимает не менее 5 секунд. Затем я понял, что каждый /etc/resolv.conf в контейнере будет начинаться с следующих строк, как только контейнер запущен при включенном Tailscale:

search headscale.ts.net
nameserver 100.100.100.100
...

Я предполагаю, что именно поэтому контейнер Roundcube сначала пытается разрешить доменное имя почтового сервера через Tailscale, что занимает некоторое время и затем не удается, прежде чем он наконец-то разрешает домен правильно, используя другие DNS-серверы.

Как только я отключаю Tailscale и перезапускаю контейнер, все работает идеально, и /etc/resolv.conf больше не содержит DNS-сервер Tailscale.

Я не уверен, как решить эту проблему, так что мой(и) вопрос(ы) будет(ут):

  1. Есть ли способ настроить контейнеры так, чтобы пропускать разрешение DNS Tailscale для доменов, не относящихся к Tailscale
  2. Как можно указать контейнеру не использовать DNS-серверы Tailscale, при этом сохраняя его включенным на хосте

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

Теория

Проблема, связанная с резолюцией DNS в контейнерах Podman в условиях активного соединения с VPN-сетью Tailscale, связана с тем, что когда Tailscale активен, он часто вносит изменения в настройку DNS на уровне хоста. Это может привести к тому, что контейнеры начинают использовать DNS-сервера Tailscale (например, 100.100.100.100) для разрешения имен. Такой сценарий может вызвать задержки или даже ошибки при попытке разрешить доменные имена, которые не относятся к Tailscale. Это, в свою очередь, обуславливает проблемы с подключением и производительностью приложений, работающих в контейнерах, как в вашем случае с Roundcube.

Пример

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

К счастью, Podman предоставляет определенные возможности для управления и настройки DNS, что позволяет частично или полностью решить проблему, не отключая Tailscale на хосте.

Применение

Следующие шаги помогут настроить контейнеры таким образом, чтобы они избегали использования Tailscale DNS, или, по крайней мере, минимизировали возможные проблемы:

  1. Настройка пользовательского resolv.conf:
    Вы можете непосредственно управлять тем, как выглядят записи DNS в контейнерах Podman через использование монтирования пользовательского файла resolv.conf. Создайте файл resolv.conf с необходимыми DNS-серверами, например:

    nameserver 8.8.8.8
    nameserver 1.1.1.1

    Затем используйте опцию монтирования в Podman для замены стандартного resolv.conf внутри контейнера:

    podman run --network=host --mount type=bind,source=/path/to/custom/resolv.conf,target=/etc/resolv.conf <image>

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

  2. Отключение DNS Proxy в Tailscale:
    Проверьте настройки Tailscale. Возможность полностью отключить proxy DNS в Tailscale может иметь положительный эффект, особенно если вашему хосту достаточно использовать альтернативные DNS-серверы для решения локальных или внешних имен.

  3. Использование dnsmasq или другого локального DNS резольвера:
    Альтернативно, вы можете настроить локальный экземпляр dnsmasq или другого DNS резольвера на вашем хосте, который будет прерывать запросы DNS перед их отправкой. Это позволит разграничить запросы: локальные запросы идут через DNS Tailscale, а все остальные через стандартные DNS-серверы.

  4. Подключение контейнеров через кастомные сети:
    Рассмотрите возможность создания отдельной сети для контейнеров, что позволит более тонко контролировать сетевые настройки, в том числе заданные DNS-серверы:

    podman network create --dns-server 8.8.8.8 <custom-network>
    podman run --network=<custom-network> <image>

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

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

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