bind9 за nginx обратным прокси DoH

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

Я пытаюсь настроить bind9 в контейнере за nginx обратным прокси.

Основные DNS-запросы работают нормально, но у меня возникают проблемы с DoH…

Прямо сейчас dig +https @BASE_URL gnu.org выдает мне эту ошибку:

;; Соединение с $IP#443($IP) для gnu.org не удалось: ошибка TLS.
;; не удалось достичь серверов

curl $BASE_URL: curl: (1) Получен HTTP/0.9, когда это не разрешено
curl --http0.9 $BASE_URL: тайм-аут.

/etc/nginx/conf.d/bind9.conf

server {
    listen      80;
    listen [::]:80;
    server_name $BASE_URL;

    return 301 https://$host$request_uri;
}

server {
    listen      443 ssl;
    listen [::]:443 ssl;
    server_name $BASE_URL;

    ssl_certificate     /etc/letsencrypt/live/$BASE_URL/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/$BASE_URL/privkey.pem;

    location / {
        proxy_pass http://bind9:80;

        proxy_set_header   Host              $host;
        proxy_set_header   X-Forwarded-For   $proxy_add_x_forwarded_for;
        proxy_set_header   Connection        $http_connection;
        proxy_redirect     off;
    }
}

/etc/bind/named.conf.options

options {
    directory "/var/cache/bind";
    recursion yes;
    allow-recursion { any; };

    listen-on    port 53 { any; };
    listen-on-v6 port 53 { any; };

    listen-on    port 80 tls none http default { any; };
    listen-on-v6 port 80 tls none http default { any; };

    dnssec-validation auto;
};

Dockerfile

FROM docker.io/debian:12-slim
RUN apt-get update                                \
    && apt-get install -y --no-install-recommends \
        bind9                                     \
    && rm -rf /var/lib/apt/lists/*
COPY named.conf.options /etc/bind/
VOLUME /var/cache/bind/
EXPOSE 53/tcp 53/udp
RUN chown -R bind:bind \
        /etc/bind/     \
        /var/cache/bind/
CMD ["/usr/sbin/named", "-f", "-d1", "-u", "bind"]

Есть идеи?
Спасибо.

Если вы видите эту ошибку, возможно, обратный прокси NGINX не настроен на http/2.

Вы можете включить его, просто добавив http2 в директиву listen в блоке server nginx:

    listen      443 ssl http2;
    listen [::]:443 ssl http2;

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

Настройка BIND9 за NGINX Reverse Proxy с поддержкой DoH (DNS over HTTPS)

Ваша задача — настроить BIND9 (DNS-сервер) в контейнере, который будет работать за обратным прокси-сервером NGINX с поддержкой DNS over HTTPS (DoH). Вы столкнулись с проблемами при выполнении запросов, и для их устранения необходимо внимательно проанализировать вашу конфигурацию и внести некоторые изменения.

Проблема

Вы получаете ошибки TLS при попытке выполнить запросы с помощью dig, а также столкнулись с проблемами при использовании curl. Это может быть связано с неправильной настройкой NGINX или BIND9, особенно в отношении поддержки DoH и обработки HTTP/2.

Конфигурация NGINX

Для корректной работы NGINX с DoH, важно убедиться, что он слушает на порту 443 с поддержкой SSL и HTTP/2. Вам необходимо обновить конфигурацию в файле /etc/nginx/conf.d/bind9.conf. Внесите следующие изменения:

server {
    listen      80;
    listen [::]:80;
    server_name $BASE_URL;

    return 301 https://$host$request_uri;
}

server {
    listen      443 ssl http2;  # Добавьте http2
    listen [::]:443 ssl http2;  # Добавьте http2
    server_name $BASE_URL;

    ssl_certificate     /etc/letsencrypt/live/$BASE_URL/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/$BASE_URL/privkey.pem;

    location /dns-query {  # Уточняем путь для DoH
        proxy_pass http://bind9:80;  # Измените на нужную конфигурацию

        proxy_set_header   Host              $host;
        proxy_set_header   X-Forwarded-For   $proxy_add_x_forwarded_for;
        proxy_set_header   Connection        $http_connection;
        proxy_redirect     off;
    }
}

Обратите внимание, что в блоке location указан путь /dns-query, который по умолчанию используется для DoH. Это путь, который будет ожидать BIND9.

Конфигурация BIND9

Также важно убедиться в том, что BIND9 готов принимать запросы по порту 80 для DoH. Проверьте файл конфигурации /etc/bind/named.conf.options:

options {
    directory "/var/cache/bind";
    recursion yes;
    allow-recursion { any; };

    listen-on    port 53 { any; };
    listen-on-v6 port 53 { any; };

    listen-on    port 80 tls none http default { any; };  # Убедитесь, что это корректно
    listen-on-v6 port 80 tls none http default { any; };  # Убедитесь, что это корректно

    dnssec-validation auto;
};

Проверьте соединение

После внесения необходимых изменений перезапустите NGINX и BIND9:

docker restart <имя_контейнера_bind9>
service nginx restart

Затем проверьте конфигурацию с помощью dig и curl:

dig +https @BASE_URL gnu.org
curl -i https://$BASE_URL/dns-query

Убедитесь, что запросы обрабатываются корректно и возвращают ответы без ошибок.

Заключение

Ваше решение требует корректной настройки как NGINX, так и BIND9, чтобы обеспечить бесперебойную работу DNS over HTTPS. Убедитесь, что у вас есть все необходимые сертификаты для SSL, и что они корректно настроены в конфигурации NGINX. После внесения всех исправлений и перезапуска сервисов, должно быть возможно успешно выполнять DNS запросы через DoH.

Если, несмотря на эти настройки, проблемы сохраняются, возможно, стоит проверить логи NGINX и BIND9 для выявления дополнительных сведений.

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

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