Главное помните в production есть место только long-term релизам, не о каких stable и тем более testing не идёт и речи.

Сегодняшняя тема пойдёт о функционале DoH который перекочевал из ветки testing в stable.

DoH - DNS over HTTPS, по сути это замена стандартного клиента DNS которые не шифрует запросы и ответы, а обмен информации поверх HTTPS естественно в зашифрованном виде. На самом деле очень простой протокол, я даже пару месяцев назад писал и сервера и клиента на все платформы с помощью GO.

Для чего DoH необходим или нужен?

В первую очередь защититься от подмены DNS сервера и естественно ответов с таких серверов, многие провайдеры очень любят заниматься такими делами (привет домру).

Для чего провайдеры это делают?

Во-первых, чтобы вы не отправляли в интернет трафик который отправить у вас не получиться, например на хосты которые требует заблокировать РКН, дело в том, что провайдеру значительно дешевле поднять пару ДНС серверов и перенаправить ваши запросы на свои сервера, чем фильтровать огромный объём трафика. Провайдер в любом случае должен его фильтровать, но согласитесь если относительно дешёвым способом можно снизить нагрузку на пакетный фильтр. Да да я знаю, что некоторые использую blackhole.

Представим себе вы хотите открыть запрещённый сайт telegram.org , первым делом ваш хост отправляет DNS запрос на поиск IP адреса, и такой запрос перенаправляет провайдер на свои сервера DNS и отвечает каким-то внутренним адресом, на котором запущен Nginx с заглушкой (Мол так и так, Привет РКН), а также такой записи можно выдать большое время кеширования TTL записи DNS, что приведёт к тому, клиент на долгое время закеширует запись и будет сразу идти напрямую на заглушку.

Во-вторых провайдер может собирать по вашим запросам статистику, например вы часто ходите по порносайтам, как итог получите рекламу мази от мозолей. (Шутка но смысл вы поняли) причём как с некоторым провайдерами рекламы вы можете получить как изменённый незашифрованный HTTP трафик (привет домру), например добавят на все страницы javascript который будет вам показывать, что-то не то. Минус такого подхода заключается в том, вот решили вы подарить своей супруге путешествие на Мальдивы, открыли сайт мальдивы.рф и после этого реклама от вашего провайдера будет пестреть мальдивами на всех устройствах и на вашем и на устройствах вашей супруги. А ведь вы можете искать, что-то и другое....

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

Именно для того чтобы ваши запросы не мог перехватить и подменить кто-то третий, была придумана реализация DoH. Но здесь есть обратная сторона медали, если вы использовали ДНС сервера провайдера или позволяли перехватывать трафик провайдеру, то только провайдер знал куда вы реально ходите в интернет на какие адреса. А когда вы будете использовать публичные ДНС сервера DoH например Гугл, то это значит, что теперь Гугл будет знать куда вы ходите и будет вам подсовывать соответствующую рекламу... тут исключительно дело вкуса.

Есть ещё одна сторона, третья, допустим ваш клиент это известный человек в публичном пространстве или просто успешный человек с финансовым достатком и конечно человек семейный, и он любит ходить "на лево", отследить по ДНС запросам значительно проще провайдеру так как он знает, какой реально человек стоит за запросом, и согласитесь если запросы идут, сначала на сайты знакомств\досуг, а потом Цветы, гостиницы и тд.. можно провести некую параллель, а теперь представьте такая информация досталась Васе Пупкину сотруднику провайдера, который недоволен жизнью, зарплатой и личной жизнью, и решил "по легкому срубить бобла"... Публичному серверу это будет сделать значительно сложнее в виду огромного количества запросов и сложностью сопоставления с реальным человеком, хотя и возможно. Отдельным особняком стоят люди которые имеют доступ к секретной\закрытой информации или могут принимать управленческие решения в гос-ве, в таком случае может быть всё наоборот.

Что-то далеко ушёл.

И так начнём.

DoH стандартизирован и работа с ним описана в документа RFC8484

Мы разберём на примере двух серверов.

  • Google
  • OpenDNS

Первым делом нам необходимо выяснить по какому url необходимо отправлять запросы, привожу список страниц на которых указаны url для запросов.

Google - https://developers.google.com/speed/public-dns/docs/doh

OpenDNS - https://support.opendns.com/hc/en-us/articles/360038086532-Using-DNS-over-HTTPS-DoH-with-OpenDNS

И сами урл-ы, чтобы вам лишний раз не лазить.

  • Google - https://dns.google/dns-query
  • OpenDNS - https://doh.opendns.com/dns-query

Кстати у OpenDNS есть семейный сервер, я так понимаю без порнографии и прочих прелестей. https://doh.familyshield.opendns.com/dns-query хороший вариант если вы хотите уберечь детей от взрослого контента.

На данный момент MikroTik поддерживает только один сервер, но прелесть в том, что, так как к ДНС серверу мы обращаемся по доменному адресу, DoH провайдеры могут сделать DNS-RR для данных записей A записей и они будут зарезервированный ну или могут смениться без перенастройки оборудования с вашей стороны. Вы только представьте если завтра Гугл скажет, что они решили изменить 8.8.8.8 на 8.8.9.9 мир рухнет =).

Обратите внимание, что схема URI должна быть обезательно https

Установим сервер и обязательно поставим галочку отвечающую за то, что будет проверяться SSL сертификат сервера, иначе прилетит ответ с не валидным сертификатом от провайдера "и пиши пропал", начинай всё сначала.

Vasilev Kirill mikrotik DoH

Либо вариант через CLI

/ip dns set verify-doh-cert=yes use-doh-server=https://doh.familyshield.opendns.com/dns-query

А так же для резольвинга самой записи нам понадобиться любой ДНС сервер, можно от провайдера можно от гугла это без разницы.

Сразу проверим работу DNS

[admin@R1] > :put [/resolve domain-name=mikrotik.me]
failure: dns server failure

Как видите запрос не прошёл, посмотрим кэш

[admin@R1] > /ip dns cache print 
Flags: S - static 
#   NAME                         TYPE   DATA          TTL         
0   doh.familyshield.opendns.com A      146.112.41.3  4m2s   

Видим, что в КЭШ только адрес нашего DoH сервера, после того как вы указали DoH сервер резольвиться адрес с помощью обычного ДНС сервера будет только адреса DoH серверов.

Почему не работает?

Дело в том, что мы установили параметр verify-doh-cert   что означает проверять SSL сертификат, но сверять сертификат RouterOS не с чем и некому доверять так как в RouterOS нет корневых сертификатов центров сертификации, по народному CA.

Как узнать какой CA нужно установить?!

Очень просто, нам необходимы выяснить какой CA выдал сертификат.

Вы найдёте на просторах уже инструкции, что можно скачать сам сертификат основной который висит на сайте, на сомом деле это не обязательно, можно скачать CA сертификат который подписал непосредственно данный сертификат или подписал CA которых стал промежуточным CA и подписал конечный сертификат. Проще, скачать и доверять самому верхнему сертификату в цепочке. Единственный какой может быть тут подвох, в том, что у таких сертификатов отсутствует CRL пусть к проверке отозванных сертификатов, но мы не будет сейчас затрагивать данную тему.

Unix-like

Для тех у кого unix-like обратите внимание, что сервер указывается два раза. В параметре -servername и -connect с портом 443.

echo | openssl s_client -showcerts -servername doh.familyshield.opendns.com  -connect doh.familyshield.opendns.com:443 2>/dev/null | openssl x509 -inform pem -noout -text
echo | openssl s_client -showcerts -servername doh.familyshield.opendns.com  -connect doh.familyshield.opendns.com:443 2>/dev/null | openssl x509 -inform pem -noout -text
Certificate:
    Data:
        Version: 3 (0x2)
        Serial Number:
            01:f5:60:56:ea:cc:65:cf:b9:be:22:af:e0:88:4f:e7
    Signature Algorithm: sha256WithRSAEncryption
        Issuer: C=US, O=DigiCert Inc, CN=DigiCert SHA2 Secure Server CA
        Validity
            Not Before: May 13 00:00:00 2020 GMT
            Not After : May 17 12:00:00 2021 GMT
        Subject: C=US, ST=California, L=San Francisco, O=Cisco OpenDNS LLC, CN=doh.opendns.com
        Subject Public Key Info:
            Public Key Algorithm: rsaEncryption
                Public-Key: (2048 bit)
                Modulus:
                    00:ce:86:37:43:94:95:9e:2b:46:4e:61:d5:13:8c:
                    ba:63:84:7c:1b:d4:8e:56:c6:d3:ae:36:10:aa:61:
                    61:17:76:59:b7:79:fd:04:af:89:83:b6:5a:c8:4a:
                    2b:09:9a:65:cf:76:6d:98:d3:a7:09:fe:36:c1:3b:
                    84:31:ac:46:3f:f5:bb:0d:ed:3a:e4:43:3f:22:0f:
                    f5:fe:b9:7b:93:af:bb:bf:52:c7:32:23:84:40:6b:
                    67:c5:7a:71:3b:80:25:b6:12:09:3c:85:3b:e7:4b:
                    f2:d2:78:37:3c:72:fb:17:f9:32:5d:26:f4:d9:42:
                    8f:19:67:eb:89:ef:fb:8a:db:1b:52:bc:ec:6a:23:
                    f8:dc:b3:9d:f6:49:23:4e:a5:44:47:2d:7e:5d:16:
                    a4:2f:b1:d0:4c:12:0c:30:0f:12:2e:73:36:0e:33:
                    0e:b0:19:e9:21:73:ad:e9:85:82:8f:48:96:26:4a:
                    3b:ef:5b:b2:e7:93:75:65:81:59:3f:b9:36:c5:63:
                    b4:7d:b9:d0:90:33:4b:a2:34:84:e8:23:da:b7:04:
                    c7:ec:2a:46:fa:4e:6f:cc:35:f1:d5:00:10:f2:50:
                    e5:0a:1a:fd:a1:0b:a1:54:28:a2:fc:2b:ad:f5:a9:
                    88:8e:e9:8a:00:bc:79:0e:3d:d7:4c:c8:42:87:8f:
                    8a:9b
                Exponent: 65537 (0x10001)
        X509v3 extensions:
            X509v3 Authority Key Identifier: 
                keyid:0F:80:61:1C:82:31:61:D5:2F:28:E7:8D:46:38:B4:2C:E1:C6:D9:E2
            X509v3 Subject Key Identifier: 
                C2:31:0C:27:50:6D:DE:02:0C:B9:CD:24:73:A8:7E:71:75:C9:BF:29
            X509v3 Subject Alternative Name: 
                IP Address:2620:119:FC:0:0:0:0:2, IP Address:2620:119:FC:0:0:0:0:3, IP Address:2620:119:FC:0:0:0:0:4, IP Address:2620:119:FC:0:0:0:0:5, DNS:doh.opendns.com, DNS:doh.umbrella.com, IP Address:146.112.41.2, DNS:doh.familyshield.opendns.com, IP Address:146.112.41.3, DNS:doh.sandbox.opendns.com, IP Address:146.112.41.4, IP Address:146.112.41.5
            X509v3 Key Usage: critical
                Digital Signature, Key Encipherment
            X509v3 Extended Key Usage: 
                TLS Web Server Authentication, TLS Web Client Authentication
            X509v3 CRL Distribution Points: 
                Full Name:
                  URI:http://crl3.digicert.com/ssca-sha2-g6.crl
                Full Name:
                  URI:http://crl4.digicert.com/ssca-sha2-g6.crl
            X509v3 Certificate Policies: 
                Policy: 2.16.840.1.114412.1.1
                  CPS: https://www.digicert.com/CPS
                Policy: 2.23.140.1.2.2
            Authority Information Access: 
                OCSP - URI:http://ocsp.digicert.com
                CA Issuers - URI:http://cacerts.digicert.com/DigiCertSHA2SecureServerCA.crt

            X509v3 Basic Constraints: critical
                CA:FALSE
            1.3.6.1.4.1.11129.2.4.2: 
                ......u..\./.w0".T..0.V..M..3.../ ..N.d....r...g.....F0D. 4.\>..0....-.8=.sd;....Nz...Da... /..O.m.#U....:;..a..p..........B.u.\.C....ED.^..V..7...G..s..^........r.........F0D. #o....}#.R..7D..........,>..?.... o.5{.5>...r....c....=....g_..i'u
    Signature Algorithm: sha256WithRSAEncryption
         05:97:3d:88:c9:b4:93:3b:88:7e:9d:10:55:7d:5b:08:51:7e:
         0a:46:1a:6d:4d:42:62:cd:29:6d:ac:ce:90:bc:16:d0:a5:51:
         36:02:91:e5:2a:e8:50:e5:c0:a3:de:ef:fd:34:cf:35:21:db:
         3e:6c:6b:46:06:c0:eb:45:7e:df:48:5e:76:67:29:01:89:fe:
         41:c6:45:0d:53:17:5f:14:a9:51:b2:08:a0:09:e8:10:01:31:
         7e:22:e6:f2:af:68:d1:54:db:bb:c0:51:b1:99:4e:7a:62:24:
         06:21:74:fa:b4:97:e8:ac:29:43:88:c7:a9:9a:e7:3f:0a:97:
         ea:c7:c5:ea:f2:20:07:3d:31:a7:a6:60:94:01:3e:2b:06:58:
         5a:a6:13:b2:60:53:fe:f6:84:2d:64:93:76:2f:ec:8d:81:93:
         2b:a2:91:4d:46:25:cd:23:a8:34:46:5f:73:96:f8:f5:a7:11:
         94:d2:41:7c:89:30:60:f5:69:04:1c:4e:18:9e:80:70:56:d3:
         8e:44:77:16:60:d4:de:8a:e3:a7:be:90:2e:3f:fa:3b:c2:15:
         ad:88:33:1e:26:db:c2:f5:2a:fe:cf:ac:fd:b7:ea:de:f1:ff:
         71:67:6f:85:5a:0c:d6:c5:d6:79:c7:9d:93:6a:39:41:c1:d2:
         57:00:93:df

Нас интересует владелец и видим что его выдал DigiCert

Windows

Для тех у кого WIndows идём в ~~powershell~~ и открываем адрес Doh сервера допустим хромом и смотрим какой сертификат, а точнее кто выдал видим что это DigiCert

Vasilev Kirill mikrotik DoH

Идём в Гугл и находи сайт CA DigiCert и по ключевому слову download ищем страницу загрузки CA сертификатов, находим нужный сертификат, качаем.

Vasilev Kirill mikrotik DoH

Прежде чем копировать сертификат на Микротик, откройте (не устанавливайте) его в вашей операционной системой и убедить, что ему ОС доверяет, если не доверяет значит вы скачали не то или не оттуда.

Если всё хорошо, скопируйте сертификат на Микротик и выполните команду импорта сертификата

[admin@R1] > /certificate import file-name=DigiCertGlobalRootCA.crt.pem 
passphrase: 
     certificates-imported: 1
     private-keys-imported: 0
            files-imported: 1
       decryption-failures: 0
  keys-with-no-certificate: 0

Всё должно работать, проверяем.

[admin@R1] > :put [/resolve domain-name=mikrotik.me]                               
185.26.122.14

Настоятельно рекомендую не пользоваться скриптами из интернета, всё, что касается сертификатов, сделайте пару раз руками, дальше пойдёт как по маслу. Если вы ещё не готовы понимать того, что написано в скрипте, то откажитесь от автоматической генерации и скачивании сертификатов, особенно если там встречаются короткие ссылки который по факту непонятно куда могут привести и не понятно какой сертификат скачать.

Я специально не привожу готовые сертификаты а только ссылки на них, пожалуйста убедитесь что вы скачиваете сертификаты именно с нужного сайта (наш сайт тоже могут ломануть =)) )

Opendns - https://cacerts.digicert.com/DigiCertGlobalRootCA.crt.pem

Google - https://pki.goog/gsr2/GSR2.crt

Рассказать друзьям

Чатик телеграм

@mikrotikme