Не могу выполнить запрос к моему DNS-резолверу bind9?

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

У меня возникла проблема с настройкой, где одна из моих удаленных ВМ не может выполнять запросы к DNS-серверу bind9, который я настроил.

Итак, вот настройка: у меня есть три виртуальные машины, которые обмениваются данными через WireGuard. Мой DNS-сервер bind9 находится на хосте VM3 в docker-сети (192.168.255.0/24) с IP-адресом 192.168.255.53.

VM1: 10.100.20.10 Клиент WireGuard: 10.0.0.20


VM2: 10.100.10.10 Сервер WireGuard: 10.0.0.1

PostUp = iptables -t nat -A POSTROUTING -s 10.0.0.0/24 -o ens3 -j MASQUERADE; iptables -A FORWARD -i wg0 -j ACCEPT; iptables -A FORWARD -o wg0 -j ACCEPT
PostDown = iptables -t nat -D POSTROUTING -s 10.0.0.0/24 -o ens3 -j MASQUERADE; iptables -D FORWARD -i wg0 -j ACCEPT; iptables -D FORWARD -o wg0 -j ACCEPT

VM3: 10.100.30.10 Клиент WireGuard: 10.0.0.30 Сеть Docker: 192.168.255.0/24

PreUp = iptables -N DOCKER-USER || true
PreUp = iptables -I DOCKER-USER -i wg0 -d 192.168.255.0/24 -j ACCEPT
PreUp = iptables -I FORWARD -s 10.0.0.0/24 -d 192.168.255.0/24 -j ACCEPT
PreUp = iptables -I FORWARD -s 10.100.20.0/24 -d 192.168.255.0/24 -j ACCEPT
PreUp = iptables -I FORWARD -s 192.168.255.0/24 -d 10.0.0.0/24 -j ACCEPT
PreUp = iptables -I FORWARD -s 192.168.255.0/24 -d 10.100.20.0/24 -j ACCEPT

Bind9: 192.168.255.53 Контейнер Docker: ubuntu/bind

options {
    directory "/var/cache/bind";
    dnssec-validation no;
    auth-nxdomain no;
    listen-on port 53 { any; };
    listen-on-v6 { none; };
    allow-query { any; };
    recursion yes;
    forwarders {
        8.8.8.8;  # Google Public DNS
        1.1.1.1;  # Cloudflare DNS
    };
};

Таким образом, я могу выполнять запросы с VM3 к bind9, но не могу выполнить запросы к bind9 с VM1. Я вижу трафик запросов на wg0 на VM3, так что туннель работает правильно. Я могу выполнить ping и traceroute с VM1 на bind9, но не могу ничего разрешить, например:

nslookup google.com 192.168.255.53
;; ошибка связи с 192.168.255.53#53: время ожидания истекло
;; ошибка связи с 192.168.255.53#53: время ожидания истекло
;; ошибка связи с 192.168.255.53#53: время ожидания истекло
;; не удалось найти серверов

Потратив на это несколько дней, я почти в отчаянии. Я вижу, что при использовании tcpdump в контейнере bind9 ничего нет, когда я пытаюсь выполнить запрос с VM1. Замечу, что трафик от VM3 есть. Я предполагаю, что это должно быть связано с маршрутизацией через iptables. Но маршруты, которые я настроил на VM3 (часть настройки WireGuard), недостаточны для выполнения запросов к bind9 с VM1. Не хватает ли мне какого-то маршрута, я не могу понять, что я упускаю.

Я скажу так: я предпринял решительную попытку, отключив iptables для docker. И это наконец позволило VM1 выполнять запросы к DNS bind9. В любом случае, это говорит о том, что проблема в маршрутизации через iptables. Теперь я не хочу отключать iptables для docker. Я планирую использовать кластер KinD, и отключение iptables для Docker не кажется хорошей идеей. Я просто не могу понять, в чем дело. Любая помощь приветствуется.

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

Проблема, с которой вы сталкиваетесь, связана с конфигурацией iptables и сетевыми маршрутами между разными виртуальными машинами и Docker-сетью, где находится ваш resolver Bind9. Давайте досконально разберем, почему виртуальная машина VM1 не может выполнять запросы к серверу DNS Bind9, расположенном на VM3.

Теория

При настройке сетей с использованием WireGuard и Docker важно обеспечить правильную маршрутизацию пакетов и конфигурацию межсетевых экранов (firewall), чтобы пакеты могли свободно перемещаться между различными сетями. В вашем случае, проблема связана с iptables и конфигурациями маршрутов, где, вероятнее всего, пакеты от VM1 не попадают в Docker-сеть 192.168.255.0/24 или блокируются сами контейнером Docker.

Ваша текущая конфигурация включает следующие ключевые моменты:

  1. WireGuard Настройка: У вас есть туннель WireGuard между VM1 и VM3 (через VM2 как сервер). Это создает защищенный туннель, по которому пакеты могут передаваться.

  2. Docker Сеть: Ваш Bind9 находится в Docker-сети 192.168.255.0/24 с IP-адресом 192.168.255.53, что требует особой маршрутизации для доступа к контейнерам.

  3. Межсетевые экраны iptables: Вы используете iptables для управления соединениями и маршрутизацией. Особенно интересен приоритет Docker-iptables, которые могут перекрывать маршруты между узлами WireGuard и контейнерами.

Пример

Основываясь на предоставленной информации, проверим конфигурацию iptables и маршрутизации:

  • На VM3 у вас есть правила PREUP для iptables, которые должны разрешать доступ из Docker-контейнера к сети WireGuard. Однако, отсутствие записи о получении пакетов в контейнере указывает на то, что они не достигают Bind9 сервера.
  • Вы упомянули, что отключение iptables Docker решает проблему доступа. Это четкий знак, что политика iptables, устанавливаемая Docker по умолчанию, блокирует пакеты, которые не распознаются как часть Docker traffic policy.

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

Применение

Чтобы решить вашу проблему, выполните следующие шаги:

  1. Анализируйте правила iptables для Docker с помощью:

    iptables -L -n -v

    Найдите все правила, связанные с цепочкой DOCKER-USER и убедитесь, что там нет конфликтов.

  2. Исправьте конфигурацию iptables на VM3:

    • Подумайте о добавлении обратного маршрута для пакетов из Docker-сети в сеть WireGuard, позволяя возвратный трафик.
    • Попробуйте добавить следующее правило в DOCKER-USER:
      iptables -I DOCKER-USER -i wg0 -j ACCEPT
    • Убедитесь, что все цепочки (FORWARD, INPUT, OUTPUT) на VM3 имеют корректные правила для маршрутизации пакетов из сети 192.168.255.0/24 в 10.0.0.0/24 и наоборот.
  3. Проверьте маршруты на всех VMs:

    • Убедитесь, что маршруты настроены правильно для передачи пакетов из сети 10.0.0.0/24 в 192.168.255.0/24 через интерфейс WireGuard.
  4. Проверьте настройки интерфейса в контейнере Bind9:

    • Если возможно, установите точный IP, на который "слушает" Bind9, чтобы исключить случайное прослушивание только локальных интерфейсов.
  5. Мониторинг и журналирование:

    • Используйте tcpdump или wireshark на всех интерфейсах для мониторинга предоставления пакетов от VM1 к VM3.

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

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

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