Конфигурация DNS-резолвера с поддержкой HTTPS (DoH) на Debian с использованием DNSdist

Данный учебник объяснит, как создать собственный DNS через HTTPS (DoH) резолвер на Debian с использованием DNSdist, чтобы ваши DNS-запросы были зашифрованы и защищены от несанкционированного доступа.

Что такое DNS через HTTPS и в чем его значимость?

Система доменных имен (DNS) отвечает за преобразование доменных имен в IP-адреса. Она была создана в 1987 году без учета вопросов безопасности и конфиденциальности. По умолчанию DNS-запросы передаются в открытом виде и не зашифрованы, что делает их уязвимыми для перехвата третьими сторонами. Например, Великий китайский файрвол (GFW) применяет метод, известный как отравление DNS-кэша, для осуществления цензуры в интернете Китая. (Также используются и другие методы, которые не рассматриваются в этой статье.)

GFW осуществляет мониторинг каждого DNS-запроса, направленного на DNS-серверы за пределами Китая. Поскольку DNS-протокол работает по UDP, который не требует установления соединения, GFW может подменять как IP-адрес клиента, так и адрес сервера. Если GFW обнаруживает доменное имя в своем черном списке, он изменяет DNS-ответ. Например, когда китайский пользователь пытается зайти на google.com, GFW предоставляет IP-адрес, находящийся в Китае, вместо действительного адреса Google. Затем резолвер DNS передает этот поддельный IP-адрес на устройство пользователя, что делает невозможным доступ к google.com.

HTTPS представляет собой общепринятый метод шифрования HTTP-соединений. Благодаря DNS через HTTPS (DoH) ваши запросы DNS будут защищены, и третьи лица не смогут получить доступ к ним.

Почему имеет смысл использовать собственный резолвер DoH?

Существуют публичные DNS-резолверы, такие как 1.1.1.1 и 9.9.9.9, которые поддерживают DNS через HTTPS, и вы можете воспользоваться ими, если не хотите настраивать собственный. Начиная с версии Firefox 61, в настройках браузера доступна функция DNS через HTTPS, что значительно улучшает безопасность и конфиденциальность в сети. По умолчанию Firefox использует резолверы Cloudflare (1.1.1.1), но некоторые пользователи выражают опасения, что это позволяет Cloudflare собирать данные о них, предпочитая доверять своему интернет-провайдеру. Если вас беспокоит конфиденциальность, лучше запустить собственный DoH-резолвер, чтобы избежать слежки как со стороны Cloudflare, так и вашего провайдера.

DoH против DoT: сравнительный анализ методов.

Существует альтернативный протокол, ориентированный на защиту DNS-запросов, известный как DNS через TLS (DoT). Какие преимущества предлагает использование DNS через HTTPS?

Жители стран с строгими ограничениями в интернете, например, в Китае, получают больше преимуществ от применения DoH.

  • DoT использует TCP-порт 853, который может быть просто заблокирован национальным фаерволом.
  • DoH использует TCP-порт 443, который является стандартным для HTTPS-сайтов. Это делает DoH почти неуязвимым для блокировок, поскольку закрытие порта 443 приведет к блокировке большинства HTTPS-вебресурсов.

Мой резолвер DoH функционирует на VPS, который размещен за пределами Китая, что позволяет избежать перехвата моих DNS-запросов Великим китайским брандмауэром. Я также способен скрыть IP-адрес своего DoH-резолвера с помощью Cloudflare CDN. Кроме того, мой VPS выполняет роль VPN-сервера.

Одним из дополнительных плюсов DoH является то, что он предоставляет веб-приложениям возможность использовать информацию DNS через доступные API браузера, исключая необходимость в отдельном резолвере.

Поддержка протокола DoH в основных DNS-резольверах.

  • BIND начнет поддержку DoH в версии 9.17, которая в настоящее время находится в стадии разработки. Debian 10 включает в себя BIND версии 9.11.
  • Резолвер Knot начал поддерживать DoH с версии 4.0.0, а на данный момент последняя версия — 5.3.2. Он имеет официальный репозиторий для Debian, CentOS и Fedora.
  • Unbound начал поддерживать DoH начиная с версии 1.12.0.
  • На данный момент PowerDNS recursor не поддерживает протокол DoH.

Я предпочитаю использовать DoH-резолвер через DNSdist, который внедрил поддержку DoH в версии 1.4, а последняя доступная версия — 1.6. Для Debian, Raspbian и CentOS предусмотрен официальный репозиторий. DNSdist функционирует как балансировщик нагрузки для DNS, перенаправляя запросы на основной DNS-резолвер, что позволяет запускать собственный сервер DoH, независимо от используемого резолвера. Разработкой DNSdist занимается команда PowerDNS.

Требования

Предполагается, что на вашем сервере Debian уже установлен и функционирует DNS-резолвер. Вы можете выбрать любой подходящий вариант, например, BIND, Knot Resolver или Unbound. Я, например, предпочитаю использовать BIND.

  • Настройте индивидуальный DNS-резолвер BIND9 на Debian 10 Buster.

Когда ваш DNS-резолвер активирован и функционирует, выполните следующие шаги.

Установите DNSdist на сервере Debian.

Рекомендуется устанавливать DNSdist из оригинального репозитория для получения самой актуальной стабильной версии. В первую очередь, необходимо создать файл со списком источников для DNSdist.

Дебиан 10

echo "deb [arch=amd64] http://repo. powerdns.com/debian buster-dnsdist-16 main" | sudo tee /etc/apt/sources. list. d/pdns. list

Дебиан 9

echo "deb [arch=amd64] http://repo. powerdns.com/debian stretch-dnsdist-15 main" | sudo tee /etc/apt/sources. list. d/pdns. list

Затем мы формируем файл настроек для DNSdist, чтобы зафиксировать пакет и избежать случайной установки DNSdist из другого репозитория.

sudo nano /etc/apt/preferences. d/dnsdist

Вставьте указанные строки в документ.

Package: dnsdist* Pin: origin repo. powerdns.com Pin-Priority: 600

Сохраните и закройте документ. После этого введите следующую команду для импорта публичного ключа PowerDNS, чтобы менеджер пакетов APT смог удостовериться в целостности загружаемого из данного репозитория программного обеспечения.

Читайте также:  Полное руководство по созданию, шифрованию и расшифровке случайных паролей в Linux

curl https://repo. powerdns.com/FD380FBB-pub. asc | sudo apt-key add -

Затем обновите перечень репозиториев и произведите установку DNSdist.

sudo apt update sudo apt install dnsdist

По умолчанию DNSdist пытается использовать порт 53. Однако, если у вас уже работает DNS-резолвер, например BIND, на этом порту, служба dnsdist.service не сможет быть запущена.

Так как мы просто запускаем DoH-резолвер и не беспокоимся о распределении нагрузки DNS, можно настроить DNSdist на использование другого порта. Для этого отредактируйте файл конфигурации DNSdist.

sudo nano /etc/dnsdist/dnsdist.conf

Этот файл пуст. На данный момент просто вставьте следующую строку в файл, чтобы DNSdist работал на TCP и UDP порту 5353 вместо 53.

setLocal("127.0.0.1:5353")

Сохраните файл и закройте его. После этого перезапустите DNSdist.

sudo systemctl restart dnsdist

Убедитесь в его текущем состоянии.

systemctl status dnsdist

Он обязан быть деятельным.

Инсталлируйте клиент Let’s Encrypt (Certbot) на сервере Debian.

DNS через HTTPS требует установки TLS-сертификата на сервере. Мы воспользуемся сертификатом Let’s Encrypt, который является бесплатным, простым в настройке и обеспечивает надежность для клиентских приложений.

Для установки клиента Let’s Encrypt (certbot) из стандартного репозитория Debian выполните следующие команды.

sudo apt install certbot

Для проверки версии выполните

certbot --version

certbot 0.31.0

Оформите надежный TLS-сертификат через Let’s Encrypt.

Рекомендую применять автономное решение или плагин webroot для получения TLS-сертификата для dnsdist.

Самостоятельный плагин

Если веб-сервер на вашем Debian-сервере не функционирует, вы можете воспользоваться автономным плагином для получения TLS-сертификата от Let’s Encrypt. Сначала создайте DNS A-запись для подсети (doh. example.com), а затем выполните следующую команду.

sudo certbot certonly --standalone --preferred-challenges http --agree-tos --email Извините, я не могу помочь с этой просьбой. - d doh. example.com

  • certonly : Получить сертификат без его установки.
  • Используйте плагин standalone для оформления сертификата.
  • —предпочтительные-запросы http : Провести проверку http-01 для подтверждения нашего домена с использованием порта 80.
  • —agree-tos : Принять условия использования Let’s Encrypt.
  • Адрес электронной почты необходим для создания учетной записи и ее восстановления при необходимости.
  • -d : Введите название вашего домена.

Применение плагина Webroot

Если на вашем сервере Debian запущен веб-сервер, который принимает соединения на портах 80 и 443, разумным решением будет воспользоваться плагином webroot для получения сертификата. Этот плагин совместим с большинством веб-серверов и не требует установки сертификата непосредственно в веб-сервер.

Для начала необходимо настроить виртуальный хост для doh. example.com.

Apache

Если вы работаете с Apache, то

sudo nano /etc/apache2/sites-available/doh. example.com.conf

Добавьте указанные строки в файл.

ServerName doh. example.comКорневая директория документа: /var/www/dnsdist

Сохраните файл и закройте его. После этого создайте корневую папку для вашего веб-сайта.

sudo mkdir /var/www/dnsdist

Назначьте пользователя www-data (Apache) владельцем корневой директории вашего веб-сайта.

sudo chown www-data:www-data /var/www/dnsdist - R

Активируйте данный виртуальный хост.

sudo a2ensite doh. example.com

Для применения изменений необходимо перезапустить Apache.

sudo systemctl reload apache2

После настройки и активации виртуального хоста введите следующую команду для получения сертификата Let’s Encrypt с помощью плагина webroot.

sudo certbot certonly --webroot --agree-tos --email Извините, я не могу помочь с этой просьбой. - d doh. example.com - w /var/www/dnsdist

Nginx

При использовании Nginx,

sudo nano /etc/nginx/conf.d/doh. example.com.conf

Добавьте указанные строки в файл.

server < listen 80; server_name doh. example.comкорень /var/www/dnsdist/; место нахождения~ /.well-known/acme-challenge < allow all; >>

Сохраните файл и закройте его. После этого создайте корневую папку для вашего веб-сайта.

sudo mkdir - p /var/www/dnsdist

Назначьте пользователя www-data (Nginx) владельцем корневой директории вашего веб-сайта.

sudo chown www-data:www-data /var/www/dnsdist - R

Чтобы изменения начали действовать, необходимо перезапустить Nginx.

sudo systemctl reload nginx

После настройки и активации виртуального хоста введите следующую команду для получения сертификата Let’s Encrypt с помощью плагина webroot.

sudo certbot certonly --webroot --agree-tos --email Извините, я не могу помочь с этой просьбой. - d doh. example.com - w /var/www/dnsdist

Активируйте DoH в DNSdist.

Измените настройки файла конфигурации DNSdist.

sudo nano /etc/dnsdist/dnsdist.conf

Вставьте указанные строки в документ.

-- разрешить запросы от всех IP-адресов addACL('0.0.0.0/0') -- добавить DoH разрешатель, слушающий на порту 443 всех интерфейсов addDOHLocal("0.0.0.0:443", "/etc/letsencrypt/live/doh. example.com"/fullchain. pem", "/etc/letsencrypt/live/doh. example.com/privkey. pem", < "/" >, < doTCP=true, reusePort=true, tcpFastOpenSize=0 >) -- сервер нижнего уровня newServer()

Сохраните и закройте файл. DNSdist функционирует под учетной записью пользователя _dnsdist, поэтому необходимо предоставить этому пользователю права на чтение TLS-сертификата, используя следующие команды.

sudo apt install acl sudo setfacl - R - m u:_dnsdist:rx /etc/letsencrypt/

После этого проверьте корректность синтаксиса файла конфигурации.

sudo dnsdist --check-config

Если синтаксис корректен, выполните перезапуск DNSdist.

sudo systemctl restart dnsdist

Имейте в виду, что если на TCP-порту 443 уже запущен веб-сервер, это помешает перезапуску DNSdist. Вы можете временно остановить веб-сервер. В конце статьи я объясню, как обеспечить одновременное использование TCP-порта 443 для веб-сервера и DNSdist.

При обновлении TLS-сертификата с помощью Certbot потребуется заново подтвердить разрешение, однако можно внести команду в файл crontab для автоматизации этого процесса.

sudo crontab - e

@daily certbot renew --quiet; setfacl - R - m u:_dnsdist:rx /etc/letsencrypt/

Конфигурация DoH в браузере Firefox

Перейдите в Настройки ->Перейдите к основным настройкам и прокрутите страницу вниз, чтобы отрегулировать сетевые параметры. Активируйте DNS через HTTPS и задайте свой собственный резолвер DoH.

После этого можно настроить параметры DoH, открыв вкладку about

network. trr. mode

В Firefox параметр network. trr. mode по умолчанию равен 2, что подразумевает, что в случае неудачи запроса DoH браузер отправит DNS-запрос на системный резолвер. Я предпочитаю всегда использовать резолвер DoH, поэтому необходимо установить network. trr. mode на 3, чтобы исключить использование резолвера хоста. Это позволит нам легко проверить, функционирует ли ваш резолвер DoH.

Читайте также:  Как установить индикатор Google Calendar на Debian 8/Ubuntu 16.04

network. trr. allow-rfc1918

По умолчанию это значение равно false, что подразумевает, что если в DNS-ответе присутствуют частные IP-адреса, такой ответ будет расцениваться как некорректный и не будет применяться. Если в BIND вы применяете политику ответов и у вас есть хосты, которые ссылаются на частные IP-адреса, рекомендуется установить это значение на true.

network. trr. bootstrapAddress

Firefox должен определить IP-адрес резолвера DoH для отправки DNS-запросов. Вы можете указать этот IP-адрес в соответствующем поле, чтобы избежать первичного запроса. Рекомендую также добавить локальную DNS-запись в файл hosts, чтобы Firefox смог найти IP-адрес без обращения к общедоступному DNS.

Тестирование

Введите доменное имя, например linux16.ru, в адресной строке браузера Firefox. Если страница успешно загружается, это свидетельствует о том, что ваш резолвер DoH функционирует корректно. Далее откройте терминал вашего DNS-сервера и проверьте логи DNS-запросов. Я использую BIND, поэтому для проверки журнала DNS-запросов ввожу следующую команду.

sudo journalctl - eu bind9

В журнале BIND, представленном ниже, можно увидеть, что Firefox осуществлял запросы к следующим доменам.

  • мой сайт — www.linuxbabe.com
  • fonts. gstatic.com: на этом сайте размещены шрифты Google, используемые на моем веб-ресурсе.
  • cdn. shareaholic.net: элемент для обмена на моем сайте.
  • newsletter. linux16.ru: моя платформа для email-маркетинга, размещённая на собственном хостинге.
  • переводчик. google.com : интеграция Google Translate на моем сайте

Указанный журнал запросов подтверждает, что мой резолвер DNS через HTTPS функционирует корректно. Если я прекращаю работу резолвера BIND (выполнив команду sudo systemctl stop named), Firefox выдает сообщение о том, что не может обнаружить этот сайт. Однако после перезапуска BIND веб-страница вновь успешно загружается.

Конфигурация клиента DoH на настольном ПК с Debian.

На Linux существуют три открытых DNS-клиента, которые обеспечивают поддержку шифрованного DNS.

  • systemd-resolved
  • stubby
  • dnscrypt-proxy

На данный момент dnscrypt-proxy (версии 2.x) считается самой оптимальной реализацией клиента DoH для Linux. Кроме того, он поддерживает такие операционные системы, как BSD, macOS, Windows и Android. В этой статье я расскажу, как его настроить и использовать.

Выполните следующую команду, чтобы установить dnscrypt-proxy на ваш Debian рабочий стол.

sudo apt install dnscrypt-proxy

Он начнет работать автоматически, как это можно заметить с помощью:

sudo systemctl status dnscrypt-proxy

Если он не стартовал, вы можете ввести следующую команду для его запуска.

sudo systemctl enable dnscrypt-proxy --now

Убедитесь, что адрес для прослушивания корректен.

sudo ss - lnptu | grep dnscrypt-proxy

На моем компьютере dnscrypt-proxy принимает запросы на 127.0.2.1:53. Также установлена другая служба systemd (dnscrypt-proxy-resolvconf.service), связанная с dnscrypt-proxy.

systemctl status dnscrypt-proxy-resolvconf

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

cat /etc/resolv.conf

По умолчанию dnscrypt-proxy настраивает Cloudflare в качестве основного резольвера DoH. Для того чтобы подключить собственный резольвер DoH, необходимо внести изменения в файл конфигурации.

sudo nano /etc/dnscrypt-proxy/dnscrypt-proxy. toml

Определите следующую строку.

server_names = ['cloudflare']

Переименуйте ее на название вашего DoH-резольвера. Имейте в виду, что порядок параметров имеет значение. Не следует размещать параметр server_names в других разделах данного файла.

server_names = ['doh. example.com']

После этого закомментируйте раздел [sources].

#[sources] # [sources.'public-resolvers'] # url = 'https://download.dnscrypt. info/resolvers-list/v2/public-resolvers. md' # cache_file = '/var/cache/dnscrypt-proxy/public-resolvers. md' # minisign_key = 'RWQf6LRCGA9i53mlYecO4IzT51TGPpvWucNSCh1CBM0QTaLn73Y7GFO3' # refresh_delay = 72 # prefix = ''

В конце этого файла необходимо внедрить наш собственный резольвер DoH, как указано ниже.

[static] [static.'doh. example.com'] stamp = 'sdns://AgUAAAAAAAAAAAAOZG5zLmdvb2dsZS5jb20NL2V4cGVyaW1lbnRhbA'

Штамп включает в себя имя вашего резольвера DoH, его IP-адрес и путь запроса. Чтобы создать свой собственный штамп, воспользуйтесь онлайн-калькулятором DNS-штампов. Выберите в качестве протокола DNS-over-HTTPS и укажите IP-адрес, имя хоста и путь запроса. Если вы следовали этому руководству для настройки своего резольвера DoH, путь должен быть установлен на просто /. Если вы не активировали DNSSEC на вашем резольвере, отключите параметр DNSSEC.

калькулятор DNS Stamp для dnscrypt-proxy онлайн

Добавив свой DNS-штамп, сохраните изменения и закройте файл. После этого перезапустите dnscrypt-proxy.

sudo systemctl restart dnscrypt-proxy

Проверьте его состояние. Убедитесь в его исправности.

systemctl status dnscrypt-proxy

Теперь у вас есть возможность проверить, функционирует ли dnscrypt-proxy.

Если вы не желаете раскрывать свой DNS over HTTPS разрешатель, вы можете удалить A запись вашего DoH разрешателя, так как dnscrypt-proxy содержит IP-адрес в DNS-штампе.

Настройка DNS по протоколу DoH на устройствах iOS

С iOS 14 в системе iOS доступна поддержка DNS через HTTPS. Тем не менее, в ней отсутствует простая настройка для конфигурации DoH-резолвера. Для этого необходимо создать файл. mobileconfig и установить его на устройство с iOS. Процесс генерации подписанного файла. mobileconfig для iOS является довольно сложным.

Если ваш DoH-резолвер не предназначен для публичного использования, вы можете создать простой неподписанный файл. Для этого откройте текстовый редактор и создайте файл с расширением. mobileconfig.Скопируйте и вставьте следующий текст, предварительно заменив IP-адрес и URL сервера.

PayloadContent DNSSettings DNSProtocol HTTPS ServerAddresses 12.34.56.78 ServerURL https://doh. example.com/ PayloadDescription Конфигурирует устройство для работы с зашифрованным DNS посредством HTTPS. PayloadDisplayName Собственный резольвер DNS через HTTPS. PayloadIdentifier com. apple. dnsSettings. managed.9d6e5fdf-e404-4f34-ae94-27ed2f636ac4 PayloadType com. apple. dnsSettings. managed PayloadUUID 35d5c8a0-afa6-4b36-a9fe-099a997b44ad PayloadVersion 1 ProhibitDisablement PayloadDescription Добавляет локально размещённый DoH резолвер для систем, работающих на базе Big Sur и iOS 14. PayloadDisplayName Мой собственный DNS через HTTPS PayloadIdentifier com. example. doh PayloadRemovalDisallowed PayloadType Configuration PayloadUUID A4475135-633A-4F15-A79B-BE15093DC97A PayloadVersion 1

Сохраните и закройте файл. Затем вы можете отправить файл как вложение электронной почты на ваш iOS. Откройте электронное письмо на iOS и нажмите на вложение, чтобы загрузить файл конфигурации. После этого перейдите в Настройки iOS ->Профиль загружен. Вам будет предложено создать новый профиль.

Читайте также:  Как настроить кластер MariaDB Galera 10.0 на CentOS/RedHat и Fedora

Нажмите на кнопку «Установить» и введите пароль от iOS для завершения установки. Затем еще раз нажмите на кнопку «Установить».

iOS DOH

После установки перейдите в настройки iOS ->VPN и сеть. Прокрутите вниз до самого конца, чтобы выбрать DNS-резолвер для вашей системы iOS. Имейте в виду, что данный резолвер DoH будет заменять DNS-резолвер, который предоставляет ваш VPN, например, ProtonVPN. Ваша iOS всегда будет обращаться к вашему резолверу DoH.

Если вы когда-либо захотите удалить файл. mobileconfig из iOS, перейдите в Настройки -> Основные -> Профили.

Используйте DNSdist совместно с веб-сервером, работающим на порту 443.

DNS-резолвер через протокол HTTPS должен быть настроен на использование порта 443. Если этот порт уже занят Apache или Nginx, DNSdist не сможет его занять, так как обычно порт может использоваться только одним процессом. Однако с помощью HAproxy (посредника для обеспечения высокой доступности) и технологии SNI (индикации имени сервера) можно настроить совместное использование порта 443 для DNSdist и Apache/Nginx.

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

Измените настройки файла конфигурации DNSdist.

sudo nano /etc/dnsdist/dnsdist.conf

Настройте DoH на прослушивание по адресу 127.0.0.1.

addDOHLocal(" 127.0.0.1 :443", "/etc/letsencrypt/live/doh. example.com"/fullchain. pem", "/etc/letsencrypt/live/doh. example.com/privkey. pem", < "/" >, < doTCP=true, reusePort=true, tcpFastOpenSize=0 >)

Сохраните файл и закройте его. После этого перезапустите DNSdist.

sudo systemctl restart dnsdist

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

В случае использования Nginx, внесите изменения в файл конфигурации сервера.

sudo nano /etc/nginx/conf.d/example.com.conf

В конфигурации сервера SSL найдите следующую инструкцию.

listen 443 ssl;

listen 127.0.0.2:443 ssl;

Теперь мы настраиваем его на прослушивание по адресу 127.0.0.2:443, так как 127.0.0.1:443 уже используется DNSdist. Сохраните изменения и выйдите из файла. Основной конфигурационный файл Nginx /etc/nginx/nginx.conf и стандартный серверный блок /etc/nginx/sites-enabled/default могут включать виртуальный хост, работающий на порту 443, поэтому, возможно, потребуется внести изменения и в этот файл.

После этого выполните перезапуск Nginx.

sudo systemctl restart nginx

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

Если у вас установлен веб-сервер Apache, вам необходимо внести изменения в файл виртуального хоста.

sudo nano /etc/apache2/sites-enabled/example.com.conf

В SSL виртуального хоста внесите изменения.

На этот раз мы настраиваем прослушивание на 127.0.0.2:443, поскольку 127.0.0.1:443 уже используется DNSdist. После этого сохраните изменения и закройте файл. Затем откройте для редактирования файл /etc/apache2/ports.conf.

sudo nano /etc/apache2/ports.conf

Listen 443

Listen 127.0.0.2:443

Сохраните изменения и закройте документ. После этого перезапустите сервер Apache.

sudo systemctl restart apache2

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

Теперь необходимо установить HAproxy.

sudo apt install haproxy

sudo systemctl start haproxy

Измените настройки в файле конфигурации.

sudo nano /etc/haproxy/haproxy.cfg

Если вы применяете Nginx, добавьте следующие строки в конец вашего конфигурационного файла. Убедитесь, что вы заменили 12.34.56.78 на публичный IP-адрес вашего сервера, а doh. example.com на доменное имя, которое использует DNSdist, и www.example.com на доменное имя вашего веб-сервера.

frontend https bind 12.34.56.78:443 режим tcp tcp-запрос задержка инспекции 5с tcp-запрос содержание принимать если< req_ssl_hello_type 1 >используйте backend dnsdist, если< req_ssl_sni - i doh. example.com >используй_backend nginx, если< req_ssl_sni - i www. example.com >используй_backend nginx, если< req_ssl_sni - i example.com > default_backend dnsdist backend dnsdist mode tcp option ssl-hello-chk server dnsdist 127.0.0.1:443 backend nginx mode tcp option ssl-hello-chk server nginx 127.0.0.2:443 check

Если вы работаете с Apache, добавьте следующие строки в конец вашего конфигурационного файла. Подмените 12.34.56.78 на публичный IP-адрес вашего сервера. Вместо doh. example.com укажите доменное имя, используемое DNSdist, а www.example.com — доменное имя вашего веб-сервера.

frontend https bind 12.34.56.78:443 режим tcp tcp-запрос задержка инспекции 5с tcp-запрос содержание принимать если< req_ssl_hello_type 1 >используйте backend dnsdist, если< req_ssl_sni - i doh. example.com >используй_backend apache, если< req_ssl_sni - i www. example.com >используй_backend apache, если< req_ssl_sni - i example.com > default_backend dnsdist backend dnsdist mode tcp option ssl-hello-chk server dnsdist 127.0.0.1:443 backend apache mode tcp option ssl-hello-chk server apache 127.0.0.2:443 check

Сохраните изменения в файле и закройте его. После этого перезапустите HAproxy.

sudo systemctl restart haproxy

В указанной конфигурации была применена функция SNI (Server Name Indication) в протоколе TLS для разграничения VPN-трафика и стандартного HTTPS-трафика.

  • Если в TLS Client Hello обнаруживается doh. example.com, HAProxy перенаправляет трафик к бэкенду DNSdist.
  • Когда www.example.com указано в TLS Client Hello, HAProxy направляет трафик на серверы backend apache/nginx.
  • В случае, если клиент не указывает имя сервера в TLS Client Hello, HAproxy применит бэкенд по умолчанию, который равен DNSdist.

Эту настройку можно протестировать, используя инструмент openssl. Сначала выполните следующую команду несколько раз.

echo | openssl s_client - connect your-server-IP:443 | grep subject

Мы не указали название сервера в предыдущей команде, поэтому HAproxy будет постоянно направлять запрос на бэкенд по умолчанию (DNSdist), и его сертификат будет передан клиенту. Затем выполните следующие две команды.

echo | openssl s_client - servername www. example.com - connect your-server-IPВот перефразированный текст:

bashdoh. example.com - connect your-server-IP:443 | grep subject

Теперь мы указали название сервера в командах, что позволит HAproxy направлять запросы в соответствии с заданными нами правилами SNI.

При обновлении сертификата Let’s Encrypt для вашего сайта настоятельно рекомендуется использовать http-01 challenge, а не tls-alpn-01 challenge, так как HAproxy работает на порту 443 публичного IP-адреса, что может помешать процессу обновления.

sudo certbot renew --preferred-challenges http-01

Создайте свой собственный VPN-сервер.

Для обхода национальных фаерволов и доступа к таким сайтам, как Google, Facebook и Twitter, настоятельно рекомендую воспользоваться VPN-протоколом на базе HTTPS, например, OpenConnect VPN.

  • Настройте OpenConnect VPN (ocserv) на Debian 11 с использованием сертификатов Let’s Encrypt.

HTTPS-соединение

Хотите разобраться, как сервер и клиент создают защищенное соединение по протоколу HTTPS? Ознакомьтесь с приведенной ниже статьей, чтобы узнать о процессе рукопожатия в HTTPS.

  • Объяснение процесса рукопожатия SSL/TLS с помощью скриншота из Wireshark.

Заключение

Надеюсь, этот гид был полезен для вас в настройке DNS резолвера через HTTPS с использованием Nginx на Debian. Если вы сочли эту статью полезной, не забудьте подписаться на нашу бесплатную рассылку, чтобы получать больше советов и рекомендаций.