Форум русскоязычного сообщества Ubuntu


Автор Тема: Замена стандартного DNS сервера на DoH сервер.  (Прочитано 1556 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн AlexDem

  • Автор темы
  • Активист
  • *
  • Сообщений: 466
    • Просмотр профиля
1. Вводные данные:
 - VPN сервер на иностранном хосте с неким IP - 123.456.789.012
 - на нем подняты 2 VPN сервера OpenVPN c сетью 10.100.0.0/24 и StrongSwan (IKE2) с сетью 10.10.10.0/24
 - собственный DNS сервер Pi-hole 10.100.0.1
2. Ситуация. Сейчас DNS сервер работает для OpenVPN машин, т.к. OpenVPN позволяет внутри своей сети ресолвить собственные DNS сервера, для этого внутри настроки сервера есть специальная опция, позволяющая вместо 8.8.8.8 и 8.8.4.4 указать 10.100.0.1 Это нужно для того, чтобы на уровне DNS запросов убивать рекламу и спам всяческий на клиентских машинах. Постепенно мигрируем на StrongSwan, он сейчас в опытной эксплуатации. Он работает хорошо, кроме того, что не позволяет пользоваться сервером DNS 10.100.0.1. Самым простым временным тестовым решением оказалось открыть 53 порт на 123.456.789.012 и указание StrongSwan клиентам использовать DNS сервер по адресу 123.456.789.012. С такой настройкой все DNS запросы идут через собственный сервер, реклама отрезается и выглядит все хорошо.
3. Проблема. Это решение неправильное и не секъюрное, т.к. открытие 53 порта есть зло. Но, StrongSwan в отличии от OpenVPN не хочет работать с собственными DNS без открытого порта 53 на сервере.
4. Задача. Родилась тут идея сделать DoH сервер. Т.е. сделать DNS запрос не по IP а по доменному имени через 443 порт через TLS. Для того, чтобы не было вообще разницы есть ли VPN или нет, просто прописал нужный адрес в настройках DNS и работай. Для этого был поднят Apache2, получен сертификат, и была предпринята попытка сделать редирект вот таким путем:

<VirtualHost *:443>

ServerName doh.mydomain.net
#DocumentRoot /var/www/html/@dummy

ProxyRequests On
ProxyPreserveHost On

ProxyPass / http://123.456.789.012
ProxyPassReverse / http://123.456.789.012

#ProxyPass /dns-query http://[123.456.789.012]/dns-query
#ProxyPassReverse  /dns-query http://[123.456.789.012]/dns-query

#ProxyPass / http://10.100.0.1:53
#ProxyPassReverse / http://10.100.0.1:53

SSLCertificateFile /etc/letsencrypt/live/doh.mydomain.net/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/doh.mydomain.net/privkey.pem
Include /etc/letsencrypt/options-ssl-apache.conf

</VirtualHost>

Вот этот вариант не работает никак, т.е. после перезагрузки Apache2 попытка скормить в качестве DoH адреса 'doh.mydomain.net' клиентским машинам заканчивается только 'Couldn't connect'. Закомменченные варианты редиректа пробовались в разных сочетаниях, но пока никакие варианты не сработали. Вот собственно и вопрос: как грамотно сделать редирект DNS запросов с внутреннего DNS сервера через вэб-сервер Apache2 с DoH? Т.е. хочется собственный dns.google.com с блэкджеком и шлюхами. Есть нескольо мануалов на этот счет,

но пока я не осилил.

В общем буду изучать эту тему, может переведу вопрос для StackOwerflow, но вдруг кто-то занимался похожей задачей и знает какой то путь как это сделать по задуманному сценарию?
« Последнее редактирование: 30 Декабрь 2020, 01:00:25 от AlexDem »

Оффлайн AnrDaemon

  • Заслуженный пользователь
  • Старожил
  • *
  • Сообщений: 27727
    • Просмотр профиля
Re: Замена стандартного DNS сервера на DoH сервер.
« Ответ #1 : 30 Декабрь 2020, 07:33:25 »
Вы бредите.
Хотите получить помощь? Потрудитесь представить запрошенную информацию в полном объёме.

Прежде чем [Отправить], нажми [Просмотр] и прочти собственное сообщение. Сам-то понял, что написал?…

Оффлайн The Green Side

  • Старожил
  • *
  • Сообщений: 1177
    • Просмотр профиля
Re: Замена стандартного DNS сервера на DoH сервер.
« Ответ #2 : 30 Декабрь 2020, 20:51:09 »
Родилась тут идея сделать DoH сервер
У меня есть и работает
Apache не нужен, нужен CoreDNS
Завтра скину свои конфиги и напишу, как сертификат подключал
Debian 11 (Gnome), Ubuntu Server 18.04

Оффлайн AlexDem

  • Автор темы
  • Активист
  • *
  • Сообщений: 466
    • Просмотр профиля
Re: Замена стандартного DNS сервера на DoH сервер.
« Ответ #3 : 30 Декабрь 2020, 21:00:13 »
Завтра скину свои конфиги и напишу, как сертификат подключал
Спасибо, буду признателен...

Оффлайн The Green Side

  • Старожил
  • *
  • Сообщений: 1177
    • Просмотр профиля
Re: Замена стандартного DNS сервера на DoH сервер.
« Ответ #4 : 30 Декабрь 2020, 23:45:32 »
CoreDNS скачиваем отсюда: https://coredns.io/
Там же есть полный мануал, если надо.

DNS сервер нужно защитить фаерволом, иначе его будут использовать боты для атак, и вам VPSку прикроют (ну сначала она захлебнётся, вероятно).
Разрешите в UFW доступ только из тех сетей, где бываете. Если что, у меня есть диапазон Билайна и Ёты для Мск.

Копируем бинарник руками в /usr/bin/ , назначаем владельцем root
Разрешаем ему использовать низкоуровневые порты без запуска от рута
sudo setcap CAP_NET_BIND_SERVICE=+eip /usr/bin/coredns
Создаём юзера и группу
adduser --system --disabled-password --disabled-login --home /var/lib/coredns --quiet --force-badname --group coredns
Создаём юнит файл для systemd
/etc/systemd/system/coredns.service
[Unit]
Description=CoreDNS DNS server
Documentation=https://coredns.io
After=network.target

[Service]
PermissionsStartOnly=true
LimitNOFILE=1048576
LimitNPROC=512
CapabilityBoundingSet=CAP_NET_BIND_SERVICE
AmbientCapabilities=CAP_NET_BIND_SERVICE
NoNewPrivileges=true
User=coredns
WorkingDirectory=~
ExecStart=/usr/bin/coredns -conf=/etc/coredns/Corefile
ExecReload=/bin/kill -SIGUSR1 $MAINPID
Restart=on-failure

[Install]
WantedBy=multi-user.target

Создаём конфиг файл
Блок hosts удалите (закомментируйте), у меня CoreDNS используется вместо Pi-hole, т.к. последний крашится после обновления на пятую версию, и я его удалил.
Логи в данном случае идут в системный журнал, смотрю всё в куче:
sudo journalctl -f
Я предполагаю, что сертификат у вас уже есть либо вы в курсе, как его получить.

/etc/coredns/Corefile
(Нажмите, чтобы показать/скрыть)

Разрешаем юзеру coredns читать сертификаты
sudo setfacl -m u:coredns:r-X /etc/letsencrypt/live
sudo setfacl -m u:coredns:r-X /etc/letsencrypt/live/example.org
sudo setfacl -m u:coredns:r /etc/letsencrypt/live/example.org/fullchain.pem
sudo setfacl -m u:coredns:r /etc/letsencrypt/live/example.org/privkey.pem
sudo setfacl -m u:coredns:r-X /etc/letsencrypt/archive/
sudo setfacl -m u:coredns:r-X /etc/letsencrypt/archive/example.org
sudo setfacl -m u:coredns:r /etc/letsencrypt/archive/example.org/fullchain1.pem
sudo setfacl -m u:coredns:r /etc/letsencrypt/archive/example.org/privkey1.pem

Включаем и запускаем
sudo systemctl enable --now coredns
Debian 11 (Gnome), Ubuntu Server 18.04

Оффлайн AlexDem

  • Автор темы
  • Активист
  • *
  • Сообщений: 466
    • Просмотр профиля
Re: Замена стандартного DNS сервера на DoH сервер.
« Ответ #5 : 31 Декабрь 2020, 00:06:46 »
Спасибо, я посмотрю этот вариант...
Я тут сам пока попробовал по другому сделать. Пришлось Nginx поставить. Вроде заработало, но работает отчего то ну очень-очень медленно, похоже PiHole не очень дружит. Использовтаь без вариантов. Попробую этот вариант, что у тебя.

Оффлайн AlexDem

  • Автор темы
  • Активист
  • *
  • Сообщений: 466
    • Просмотр профиля
Спасибо за отличную идею, эта штука почти что работает как надо. В связке с Pi-hole блокирует рекламу и довольно шустро, кстати.
"Почти" потому что не удается запустить её как системный сервис.
Если запускать вручную из командной строки,

./coredns -conf=/etc/coredns/Corefileто все работет как надо.

Если запустить как системный сервис:
sudo systemctl enable --now corednsто получаем вот такой баг:

sudo systemctl status coredns
● coredns.service - CoreDNS DNS server
   Loaded: loaded (/etc/systemd/system/coredns.service; disabled; vendor preset: enabled)
   Active: failed (Result: start-limit-hit) since Sat 2021-01-02 11:43:14 UTC; 485ms ago
     Docs: https://coredns.io
  Process: 14239 ExecStart=/bin/coredns -conf /etc/coredns/Corefile (code=exited, status=1/FAILURE)
 Main PID: 14239 (code=exited, status=1/FAILURE)

Jan 02 11:43:14 I2TPVPN systemd[1]: coredns.service: Main process exited, code=exited, status=1/FAILURE
Jan 02 11:43:14 I2TPVPN systemd[1]: coredns.service: Unit entered failed state.
Jan 02 11:43:14 I2TPVPN systemd[1]: coredns.service: Failed with result 'exit-code'.
Jan 02 11:43:14 I2TPVPN systemd[1]: coredns.service: Service hold-off time over, scheduling restart.
Jan 02 11:43:14 I2TPVPN systemd[1]: Stopped CoreDNS DNS server.
Jan 02 11:43:14 I2TPVPN systemd[1]: coredns.service: Start request repeated too quickly.
Jan 02 11:43:14 I2TPVPN systemd[1]: Failed to start CoreDNS DNS server.
Jan 02 11:43:14 I2TPVPN systemd[1]: coredns.service: Unit entered failed state.
Jan 02 11:43:14 I2TPVPN systemd[1]: coredns.service: Failed with result 'start-limit-hit'.
Пока не разобрался, что ему не так. Не проходил такое, нет ли идей как пофиксить?

Оффлайн The Green Side

  • Старожил
  • *
  • Сообщений: 1177
    • Просмотр профиля
Не встречал, попробуй запустить от юзера "coredns" с помощью sudo, тогда есть шанс увидеть подробнее в чём причина.
Debian 11 (Gnome), Ubuntu Server 18.04

Оффлайн ALiEN175

  • Модератор форума
  • Старожил
  • *
  • Сообщений: 4907
  • Capture the truth
    • Просмотр профиля
journalctl -u coredns
ASUS P5K-C :: Intel Xeon E5450 :: 8 GB RAM :: Radeon R7 260X :: XFCE
SAMSUNG N150 :: Intel Atom N450 :: 2 GB RAM :: Intel GMA3150 :: XFCE

Оффлайн AlexDem

  • Автор темы
  • Активист
  • *
  • Сообщений: 466
    • Просмотр профиля
Не встречал, попробуй запустить от юзера "coredns" с помощью sudo, тогда есть шанс увидеть подробнее в чём причина.
Не понял в чем было дело, в логах никакого криминал не нашел, просто после нескольких перезагрузок оно заработало само. Значит нигде в настройках и правах я не накосяцил, а что-то сервер неправильно работал. Сейчас вроде все нормально, и все работает. Еще раз спасибо за помощь.

systemctl status coredns.service
● coredns.service - CoreDNS DNS server
   Loaded: loaded (/etc/systemd/system/coredns.service; enabled; vendor preset: enabled)
   Active: active (running) since Sat 2021-01-02 16:09:13 UTC; 18s ago
     Docs: https://coredns.io
 Main PID: 967 (coredns)
   CGroup: /system.slice/coredns.service
           └─967 /bin/coredns -conf=/etc/coredns/Corefile

Jan 02 16:09:13 I2TPVPN systemd[1]: Started CoreDNS DNS server.
Jan 02 16:09:14 I2TPVPN coredns[967]: https://.:443
Jan 02 16:09:14 I2TPVPN coredns[967]: tls://.:853
Jan 02 16:09:14 I2TPVPN coredns[967]: CoreDNS-1.8.0
Jan 02 16:09:14 I2TPVPN coredns[967]: linux/amd64, go1.15.3, 054c9ae


Пользователь добавил сообщение 02 Январь 2021, 19:13:25:
Код: [Выделить]
journalctl -u coredns
Спасибо, но я это смотрел, там то, же что и я постил. Но сейчас вроде оно взлетело...

Пользователь добавил сообщение 03 Январь 2021, 15:32:13:
Итак, продолжаем эксперемент!  :) Вроде бы все работает как надо, на 99%. 1% за то, что при перезагрузке Linux сервера,  CoreDNS сервер хоть и стартует, и не показывает ошибок, но при этом подключится к нему нельзя, хотя
netstat -tulpn говорит о том, что порты 443 и 853 слушаются CoreDNS
Помогет
sudo ufw reloadпосле этого все работает как швейцарские часы.
« Последнее редактирование: 03 Январь 2021, 15:32:13 от AlexDem »

 

Страница сгенерирована за 0.074 секунд. Запросов: 21.