Настройка собственного DoH-сервера
CoreDNS
CoreDNS — это гибкий и мощный DNS-сервер, поддерживающий множество плагинов. Он отлично подходит для создания DoH-сервиса.
Инициализация
Установка необходимых компонентов
Сначала обновите систему и установите необходимые пакеты, включая Docker Compose и Certbot (для получения SSL-сертификатов).
sudo apt update && sudo apt upgrade -y && sudo apt install -y docker-compose certbotНастройка брандмауэра
Обеспечьте безопасность сервера, настроив правила брандмауэра для разрешения необходимых портов (22, 80 и 443).
sudo ufw allow 22sudo ufw allow 80sudo ufw allow 443sudo ufw enableПолучение SSL-сертификата
Используйте Certbot для получения SSL-сертификата. Замените <DOMAIN> на ваше фактическое доменное имя.
sudo certbot certonly --standalone -d <DOMAIN>Примечание: Убедитесь, что домен правильно разрешается в IP-адрес вашего сервера, и порт 80 не занят другими службами.
Настройка и развертывание CoreDNS
Мы будем запускать CoreDNS через Docker.
Создание каталога конфигурации CoreDNS
Создайте каталог для хранения файлов конфигурации.
sudo mkdir -p /etc/corednsСоздание файла конфигурации CoreDNS
Создайте и отредактируйте /etc/coredns/Corefile:
sudo vim /etc/coredns/CorefileДобавьте в файл следующее содержимое, не забудьте заменить <DOMAIN> на ваше фактическое доменное имя:
https://.:443 { tls /etc/letsencrypt/live/<DOMAIN>/fullchain.pem /etc/letsencrypt/live/<DOMAIN>/privkey.pem bind 0.0.0.0:443 forward . 1.1.1.1 8.8.8.8 log errors cache 300}Пояснения к конфигурации:
<DOMAIN>:443— прослушивание HTTPS-запросов на порту 443 для указанного домена.tls— указание пути к SSL-сертификату и закрытому ключу.bind 0.0.0.0:443— привязка к порту 443 на всех сетевых интерфейсах для внешнего доступа.forward . 1.1.1.1 8.8.8.8— перенаправление DNS-запросов на публичные DNS-серверы Cloudflare (1.1.1.1) и Google (8.8.8.8).logиerrors— включение журналирования и записи ошибок для отладки.cache 300— включение кэширования DNS с временем жизни 300 секунд для ускорения запросов.
Запуск контейнера CoreDNS
Запустите контейнер CoreDNS через Docker. Убедитесь, что вы заменили <DOMAIN> на ваше фактическое доменное имя.
sudo docker run -d \ --name coredns \ --restart unless-stopped \ --network host \ -v /etc/coredns:/etc/coredns \ -v /etc/letsencrypt/live/<DOMAIN>/fullchain.pem:/etc/letsencrypt/live/<DOMAIN>/fullchain.pem \ -v /etc/letsencrypt/live/<DOMAIN>/privkey.pem:/etc/letsencrypt/live/<DOMAIN>/privkey.pem \ coredns/coredns \ -conf /etc/coredns/CorefileПояснения к запуску:
--network host— использование сетевого стека хоста, позволяющее CoreDNS прослушивать порт 443 на хосте.-v /etc/coredns:/etc/coredns— монтирование каталога конфигурации хоста в контейнер для удобного управления.-v /etc/letsencrypt/live/<DOMAIN>/fullchain.pemи-v /etc/letsencrypt/live/<DOMAIN>/privkey.pem— монтирование SSL-сертификата и закрытого ключа в контейнер для обеспечения работы HTTPS.
Проверка состояния CoreDNS
Убедитесь, что контейнер CoreDNS работает и прослушивает правильный порт.
sudo docker ps | grep corednsВы должны увидеть вывод, похожий на следующий, указывающий, что контейнер CoreDNS работает и прослушивает порт 443:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES<container_id> coredns/coredns "/coredns -conf /etc…" X seconds ago Up X seconds 0.0.0.0:443->443/tcp corednsНастройка клиента для использования DoH
После выполнения вышеуказанных шагов ваш DoH-сервер готов. Теперь на клиентских устройствах настройте DNS, используя https://<DOMAIN>/dns-query в качестве адреса DoH-сервера.
Автоматическое обновление SSL-сертификата
SSL-сертификаты, полученные через Certbot, действительны 90 дней. Рекомендуется настроить задачу по расписанию для автоматического обновления сертификатов и перезапуска контейнера CoreDNS.
Создайте задачу cron для ежедневной проверки и обновления сертификатов:
sudo crontab -eДобавьте следующую строку:
0 2 1 * * certbot renew --quiet && sudo docker restart corednsЭта задача будет запускаться в 2 часа ночи первого числа каждого месяца, автоматически обновлять сертификаты и перезапускать контейнер CoreDNS.