Внезапно, без предварительного анонса, на 8.8.8.8 заработал DNS over TLS. Ранее Google анонсировал только поддержку DNS over HTTPS.

Публичный резолвер от компании CloudFlare с IP-адресом 1.1.1.1 поддерживает DNS over TLS с момента запуска проекта.

Зачем это нужно


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

C DNS over TLS/HTTPS запросы посылаются внутри зашифрованного тоннеля так, что провайдер не может подменить или просмотреть запрос.

А с приходом шифрования имени домена в сертификатах X.509 (ESNI) станут невозможны блокировки через DPI по SNI (Server Name Indication, специальное поле, в котором передается имя домена в первом TLS-пакете), которые сейчас применяются у некоторых крупных провайдеров.

Как это работает


На порт TCP:853 выполняется TLS-подключение, при этом проверка сертификата резолвера происходит с использованием системных корневых сертификатов, точно так же, как HTTPS в браузере. Это избавляет от необходимости добавлять какие-либо ключи вручную. Внутри тоннеля выполняется обычный DNS-запрос. Это создает меньше накладных расходов по сравнению с DNS over HTTPS, который добавляет HTTP-заголовки к запросу и ответу.

К сожалению, на текущий момент только в Android 9 (Pie) поддержка DNS over TLS встроена в системный резолвер. Инструкция по настройке для Android 9.

Для остальных систем предлагается использовать сторонний демон, а системный резолвер направлять на localhost (127.0.0.1).

Настройка на macOS


Разберем настройку DNS over TLS на последней версии macOS, на примере резолвера knot

Установка


brew install knot-resolver

По умолчанию knot будет работать как обычный рекурсивный резолвер, подобно dnsmasq.

Редактируем конфиг


nano /usr/local/etc/kresd/config


И добавляем в конец файла:

policy.add(
        policy.all(
                policy.TLS_FORWARD({
                        {'8.8.8.8', hostname='8.8.8.8'},
                        {'8.8.4.4', hostname='8.8.4.4'}
                })))

В итоге мой конфиг выглядит так:
Раскрыть спойлер
-- Config file example useable for personal resolver.
-- The goal is to have a validating resolver with tiny memory footprint,
-- while actively tracking and refreshing frequent records to lower user latency.
-- Refer to manual: https://knot-resolver.readthedocs.io/en/latest/daemon.html#configuration

-- Listen on localhost (default)
-- net = { '127.0.0.1', '::1' }

-- Drop root privileges
-- user('knot-resolver', 'knot-resolver')

-- Auto-maintain root TA
trust_anchors.file = 'root.keys'

-- Load Useful modules
modules = {
        'policy',   -- Block queries to local zones/bad sites
        'hints',    -- Load /etc/hosts and allow custom root hints
        'stats',    -- Track internal statistics
        'predict',  -- Prefetch expiring/frequent records
}

-- Smaller cache size
cache.size = 10 * MB

policy.add(
        policy.all(
                policy.TLS_FORWARD({
                        {'8.8.8.8', hostname='8.8.8.8'},
                        {'8.8.4.4', hostname='8.8.4.4'}
                })))


Подробнее про hostname и проверку подлинности TLS-сертификата
Параметр hostname в данном случае — Common Name (CN) или Subject Alt Name (SAN) сертификата. То есть, доменное имя, для которого выпущен сертификат. По нему проверяется подлинность сертификата сервера.

Вот какие значения SAN у сертификата, который используется при подключении на 8.8.8.8:853
dns.google
8888.google
8.8.4.4
8.8.8.8 
2001:4860:4860:0:0:0:0:64 
2001:4860:4860:0:0:0:0:6464
2001:4860:4860:0:0:0:0:8844
2001:4860:4860:0:0:0:0:8888

Любое из этих значений можно использовать в качестве параметра hostname. Если же вы будете разворачивать собственный публичный рекурсивный резолвер, у вас вряд ли получится выпустить X.509-сертификат на IP-адрес, поэтому в параметре hostname придется указывать доменное имя.

Запуск демона


sudo brew services start knot-resolver

Проверить, успешно ли запустился демон, можно командой:

sudo lsof -i -P -n | grep kresd

процесс kresd должен слушать порт 53 на localhost.

Если что-то пошло не так, смотрим лог ошибок:

cat  /usr/local/var/log/kresd.log

Проверка работы резолвера


dig @127.0.0.1 habr.com

Проверяем, что локальный резолвер отвечает корректно.

Установка в качестве системного резолвера


Если все работает правильно, можно назначить системный резолвер в свойствах сетевого адаптера:



UPD

В чем разница между DNSCrypt, DNSSEC, DNS over TLS/HTTPS.


DNSCrypt может работать по UDP и TCP. Подключение на порт 443. Для шифрования используется собственный протокол, который отличается от HTTPS. Может быть легко выделен с помощью DPI. Это скорее черновик, который тестировали до внедрения DNS over TLS/HTTPS, так как он не имеет RFC, то есть не является официальным стандартом интернета. Вероятнее всего, в скором, времени он будет полностью вытеснен последними.

DNS over TLS (DoT) — TCP-подключение происходит на порт 853, внутри тоннеля передается обычный DNS-запрос. Провайдер видит, что это DNS запрос но не может в него вмешаться. При прочих равных, в DNS over TLS должно быть чуть меньше накладных расходов на каждый запрос, чем в over HTTPS.

DNS over HTTP (DoH) — TCP-подключение на порт 443, подобно обычному HTTPS. Внутри другой формат запроса, с HTTP-заголовками. Однако для провайдера такой запрос будет виден как обычное HTTPS-подключение. Полагаю, этот протокол был придуман на случай, когда DNS-запросы к чужим серверам будут заблокированы, чтобы маскировать под обычный веб трафик. А также, чтобы браузеры могли сами резолвить домены и не создавать при этом аномальный трафик.

По сути, DNS over HTTPS и over TLS — одно и то же, с немного отличающемся форматом запросов. Оба эти протокола приняты в качестве стандартов и имеют RFC. Вероятнее всего, в ближайшее время мы увидим массовое распространение их обоих.

DNSSEC — протокол цифровой подписи DNS-записей. Не имеет отношения к шифрованию, так как все запросы передаются в открытом виде. Может работать как по старому классическому протоколу DNS, то есть UDP/TCP на порту 53, так и внутри DNS over TLS/HTTPS. Целью DNSSEC является подтверждение подлинности DNS-записи. Владелец домена может добавить публичный ключ на корневые сервера своей доменной зоны и подписывать все записи на мастер NS-серверах. По сути, к каждой DNS записи, например, A-записи или MX-записи, добавляется еще одна запись типа RRSIG, содержащая подпись. Процедура валидации DNSSEC на рекурсивном резолвере позволяет установить, действительно эта запись была создана владельцем домена.

Более подробное сравнение всех протоколов dnscrypt.info/faq (абзац Other protocols)

Комментарии (101)


  1. time2rfc
    25.10.2018 01:38
    +1

    Господа, что можно настроить под linux без долгой ругани, с возможностью часть доменной зоны(например работодатель.net) отдать на откуп вышестоящему dns работающему по-старинке.


    1. zhovner Автор
      25.10.2018 01:45

      Я так понимаю зона работодатель.net существует только на одном резолвере и не существует в интернете? Это интересный вопрос. Полагаю, что можно на сервере развернуть knot и задать ему апстрим сервера которые знают об этой зоне. Ну а на клиенте уже настроить dns over tls до этого сервера.


    1. ValdikSS
      25.10.2018 01:52
      +1

      В некоторых дистрибутивах NetworkManager интегрирован с dnsmasq. Если у вас такой дистрибутив (проверить можно наличием запущенного dnsmasq и записью nameserver 127.0.0.2 или аналогичной в /etc/resolv.conf), можно прописать определенным зонам определенный сервер DNS, в /etc/dnsmasq.conf.


      1. selivanov_pavel
        25.10.2018 04:28

        Точнее, прописывать надо в /etc/NetworkManager/dnsmasq.d/*.conf.


        Потому что NetworkManager запускает dnsmasq с опциями --conf-file=/dev/null --conf-dir=/etc/NetworkManager/dnsmasq.d.


      1. develop7
        25.10.2018 19:37

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


        1. ValdikSS
          25.10.2018 19:40

          Я встречал использование NetworkManager+dnsmasq по умолчанию только в Ubuntu-based.


    1. Jouretz
      25.10.2018 12:05
      +1

      Unbound, например.
      Там весь конфиг можно в 20 строчек уложить. И локальные ресолверы на зоны настроить.
      wiki.archlinux.org/index.php/unbound#Include_local_DNS_server


    1. inkvizitor68sl
      26.10.2018 15:31

      Unbound так умеет.
      Там для форварда всех запросов делается так:
      forward-zone:
      name: "."
      ....


      Соответственно, отдельную зону форвардить можно в отдельные NS.


  1. wtigga
    25.10.2018 05:49

    Теперь DNS 8.8.8.8 излечивает от Роскомнадзора? И если да, сколько недель пройдёт до блокировки этого адреса Ростелекомом?


    1. DeeZ
      25.10.2018 07:29

      Нет, не излечит. Но от определенных блокировок поможет. Например мой провайдер при DNS запросах к запрещенным сайтам возвращает IP своей заглушки. А весь трафик ДНС заворачивает на себя. От таких блокировок поможет.


      1. snizovtsev
        25.10.2018 22:13

        Что за провайдер, если не секрет? Потенциальные новые клиенты должны знать героев, которые бегут вперёд паровоза РКН и заворачивают ДНС.


        1. TrueBers
          26.10.2018 02:21

          Да таких десятки по стране. Как минимум, лично сталкивался с дюжиной. Всех перечислять что ли? Часто это мелкие локальные провайдеры, которые ресейлят всяких Ростелекомов.


    1. dollar
      25.10.2018 07:43
      +1

      Пока что речи о нативной поддержке не идёт. В статье говорится, что это возможно только для Android 9. А с помощью стороннего софта и раньше можно было «излечиваться» от РКН (то есть избегать перенаправления DNS запросов).

      Кроме того, DNS over TLS/HTTPS не спасает от блокировки по SNI. Так что РКН, скорее всего, даже не будет смотреть в сторону блокировки 8.8.8.8. Кстати, вы статью вообще читали?


      1. zhovner Автор
        25.10.2018 12:52
        +2

        Если все заблокированные сайты включат поддержку шифрования SNI, тогда обойти блокировку можно будет простой сменой резолвера на специальный, вроде сервиса Antizapret. В таком случае на стороне клиента не потребуется устанавливать VPN или прокси, или какой-либо сторонний софт.

        Я вижу это так: специальным образом сконфигурированный DNS over TLS/HTTPS резолвер выборочно обрабатывает заблокированные сайты, подменяя их реальные IP на свои DNAT прокси. При этом проксируя только TCP. А так как SNI зашифрован, DPI не увидит к какому сайту запрос. Однако это может сломать DNSSEC, если владелец заблокированного домена решит подписать зону.

        Возможно я где-то ошибаюсь, призываю ValdikSS раскидать по понятиям.


        1. zhovner Автор
          25.10.2018 13:08
          +1

          Надеюсь, все движется к тому, что блокировки сайтов станут невозможными. Этому должно помочь распространение ESNI, шифрованного DNS и IPv6.

          Вангую, что в ближайшем будущем, любые веб-сайты будут открываться с любых IP. Как это сейчас сделано с веб-фронтендом гугла: вы можете открыть любой сайт (youtube, gmail, google drive) обратившись к любому IP адресу google указав нужный заголовок Host:.

          Конечно, всегда остается тупая блокировка по IP, но с приходом IPv6 обычному владельцу сайта станут доступны миллиарды адресов почти бесплатно. Поэтому на каждый DNS запрос можно будет резолвить разный адрес, даже из разных сетей. Наверняка у сервисов вроде Cloudflare появится опция типа IP mixer, как раз для защиты сайтов от государственной цензуры. В такой системе блокировать сайты можно будет только заблокировав большую часть интернета.

          Соудтрек этого комментария: youtube.com/watch?v=H8xwrF4sKsg


          1. jryj
            25.10.2018 13:25

            вы можете открыть любой сайт (youtube, gmail, google drive) обратившись к любому IP адресу google указав нужный заголовок Host:


            А можно поподробнее? Что и как делать?


            1. zhovner Автор
              25.10.2018 13:37
              +1

              Есть некоторые мобильные операторы, которые для корректной работы Android пропускают трафик к определенным служебным адресам google. Это позволяет смотреть youtube при отрицательном балансе :)

              Пробуем найти случайный IP адрес google.com:

              $ ping google.com
              PING google.com (74.125.140.100): 56 data bytes
              64 bytes from 74.125.140.100: icmp_seq=0 ttl=46 time=71.698 ms
              64 bytes from 74.125.140.100: icmp_seq=1 ttl=46 time=71.703 ms
              


              Пробуем запросить по этому адресу сайт Youtube.com. По заголовкам видим, что попали на youtube.
              
              $ curl -v -I  --resolve www.youtube.com:443:74.125.140.100 https://www.youtube.com
              
              ...
              *  subjectAltName: host "www.youtube.com" matched cert's "*.youtube.com"
              ....
              server: YouTube Frontend Proxy
              ...
              set-cookie: PREF=f1=40000000; path=/; domain=.youtube.com;
              


              Иначе это можно было сделать добавив в файл hosts такую запись:
              74.125.140.100 www.youtube.com


          1. snizovtsev
            25.10.2018 22:20

            Боюсь с приходом IPv6 у облачных провайдеров будет возможность привязывать к клиенту (юр. или физ. лицу) статическую подсеть вместо плавающего публичного IP из общего пула, что лишь поможет РКН точнее блокировать сайты даже без DPI.


            1. zhovner Автор
              25.10.2018 22:59

              Ну вообще-то и сейчас, по-хорошему клиенту должна выдаваться сеть /64 на каждый сервер. Но даже в этом случае IP адреса становятся сильно дешевле и их можно закупать у разных хостеров и обновлять хоть каждую минуту.


        1. ValdikSS
          25.10.2018 13:56
          +4

          Я вижу два возможных сценария блокировки соединения при распространении ESNI:

          1. DNS-серверы провайдера будут блокировать запросы на поддомен _esni.domain.com, на котором размещается публичный ключ для шифрования SNI, заставляя клиента отключать использование ESNI. Можно обойти с помощью стороннего DNS или DNS over TLS/HTTPS. Последний уже встраивается в браузеры.

          2. Системы DPI провайдера будут блокировать соединения с использованием ESNI. Для шифрованного SNI используется отдельное поле в пакете TLS ClientHello, и для DPI это выглядит так, будто TLS-сессия устанавливается без использования SNI. Некоторые DPI разрывают такие соединения, если они устанавливаются к IP-адресу, на котором расположен заблокированный домен с этим IP-адресом, из-за того, что нельзя понять, к какому домену происходит обращение.

          Чтобы системы с подставными перенаправляющими DNS-ответами работали корректно, нужно отключать DNSSEC и DNS over HTTPS в браузерах.


  1. ARad
    25.10.2018 06:45
    +5

    Как настроить Windows?


    1. DeeZ
      25.10.2018 07:27

      Первая ссылка в гугле


    1. lolmaus
      25.10.2018 11:31

      https://dnsprivacy.org/wiki/display/DP/Windows+installer+for+Stubby


      Советую закомментировать в конфиге дефолтные адреса и раскомментировать Cloudflare: они быстрее гугловских.


  1. nerudo
    25.10.2018 08:06
    +2

    > {'8.8.8.8', hostname='1.1.1.1'},

    Чтобы дополнительно запутать предполагаемого противника?


    1. zhovner Автор
      25.10.2018 12:05

      fixed


      1. nerudo
        25.10.2018 12:16
        +3

        Зря!


      1. Roquie
        25.10.2018 14:49

        В примере забыли.


  1. ksenobayt
    25.10.2018 08:42
    +2

    Немного оффтопик, но раз уж мы говорим за блокировки: с удивлением для себя обнаружил, что мой провайдер отдаёт нефильтрованный трафик в том случае, если клиент заказал себе белый IP. Из технических нюансов — адрес выдаётся из другой автономки, нежели та, из которой берутся адреса для NAT, плюс перестали, наконец, спуфить DNS.

    Я всё пытаюсь понять, чем это обсуловлено. Я почти уверен, что на каждого клиента, попросившего белый IP, маршрутизацию пишут вручную — ибо это, прости господи, в 2018-м году потребовало приезда монтажника (!!!), который полчаса ковырялся в несчастном 3Com'е, и заняло в целом четыре дня. Таким образом, завернуть трафик на фильтрацию становится технически едва ли не проще.


    1. lolmaus
      25.10.2018 11:32

      Просто накосячили или поленились нормально настроить.


      1. ksenobayt
        25.10.2018 11:36

        Фиг знает, подтверждается минимум с четырёх разных точек у того же провайдера.
        Достаточно занятный момент, который, впрочем, сильно упрощает мне жизнь.


    1. dollar
      25.10.2018 12:48
      -3

      Как называется ваш провайдер?


      1. ksenobayt
        25.10.2018 13:20
        +5

        Вам, собственно, зачем?


  1. Teomit
    25.10.2018 10:36

    Не знаю как сейчас, а раньше замечал 8.8.8.8 в небольшой фильтрации. Некоторые ресурсы, которые по мнению Google считаются пиратскими, не резолвились.
    В итоге плюнул и перешёл на DNSCrypt.


    1. achekalin
      25.10.2018 10:50

      А если использовать

      • 1.1.1.1
      • 1.0.0.1
      • 2606:4700:4700::1111
      • 2606:4700:4700::1001

      — там вроде обещали без цензуры?


    1. zhovner Автор
      25.10.2018 12:40
      +1

      Вот вам альтернативные конфигурации knot-resolver на всякий случай:

      Cloudflare (обещает вообще без фильтрации):

      policy.TLS_FORWARD({
                              {'1.1.1.1', hostname='1.1.1.1'},
                              {'1.0.0.1', hostname='1.0.0.1'}
                      })))
      


      Quad9 (вариант с валидацией DNSSEC, фильтрация вредоносных доменов):
      policy.TLS_FORWARD({
                              {'9.9.9.9', hostname='9.9.9.9'},
                              {'149.112.112.112', hostname='149.112.112.112'}
                      })))
      


      Quad9 (вариант без валидации DNSSEC, без фильтрации доменов):
      policy.TLS_FORWARD({
                              {'9.9.9.10', hostname='9.9.9.10'},
                              {'149.112.112.112', hostname='149.112.112.10'}
                      })))
      


      1. time2rfc
        25.10.2018 13:24

        Спасибо огромное !


  1. Feland
    25.10.2018 11:26

    Как настроить в Ubuntu?


  1. Loriamar
    25.10.2018 11:56

    Кто-нибудь объясните мне на пальцах в чем разница между DNS-pver-HTTPS и DNS-over-TLS (сам я пользуюсь github.com/jedisct1/dnscrypt-proxy)

    Но я пытаюсь понять это что два разных стандарта? Или как? хттпс же работает через тлс итак?


    1. zhovner Автор
      25.10.2018 12:22
      +3

      DNScrypt это скорее черновик, который тестировали до внедрения DNS over TLS/HTTPS, так как он не имеет RFC, то есть не является официальным стандартом интернета. Вероятнее всего, в скором времени он будет полностью вытеснен последними.

      В чем разница между DNS over TLS и over HTTPS.
      По сути это почти одно и то же, с некоторыми нюансами.

      DNS over TLS — TCP подключение происходит на порт 853, внутри тоннеля обычный DNS запрос. Провайдер видит что это DNS запрос но не может в него вмешаться.

      DNS over HTTP — TCP подключение на порт 443, подобному обычному HTTPS. Внутри другой формат запроса, с HTTP заголовками. Однако для провайдера такой запрос будет виден как обычное HTTPS подключение. Полагаю, этот протокол был придуман на случай, когда DNS запросы к чужим серверам будут заблокированы, чтобы маскировать под обычный веб трафик. А так же, чтобы браузеры могли сами резолвить домены и не создавать при этом аномальный трафик.

      При прочих равных, в DNS over TLS должно быть чуть меньше накладных расходов на каждый запрос.


      1. Loriamar
        25.10.2018 12:35

        Т.е через ХТТПС имеет оверхед но скрыт от провайдера, через ТЛС без оверхеда и виден как обычный ДНС запрос, но толкьо шифрованный. Всё. Поня.

        А DNScrypt во второй версии стал «Supports DNS-over-HTTPS (DoH) and DNSCrypt.»


        1. zhovner Автор
          25.10.2018 12:44
          +1

          Надеюсь, скоро DoH и DoT встроят во все системные резолверы и весь этот сторонний софт будет ненужен.


      1. mxms
        25.10.2018 23:42

        DNScrypt (к слову, ужасная мешанина технологий и пример оверинжиниринга) не имеет отношения к DNS-over-TLS.
        Последний удобен, быстр и просто в настройке.


  1. Whuthering
    25.10.2018 12:02
    +1

    В случае с https есть дополнительный оверхед на http-заголовки.


    1. Loriamar
      25.10.2018 12:18
      +1

      Хм логично. Но полагаю этим оверхедом можно пренебречь. Это же все-таки днс запросы, а не что-то другое. Или я не прав?


      1. zhovner Автор
        25.10.2018 12:42
        +3

        Можно, да. Просто трафик для таких запросов будет чуть больше.


  1. legolegs
    25.10.2018 13:39
    +1

    Пожалуйста, дополните ваш UPD. Интересно, чем всё-таки является DNSCrypt с технической точки зрения.
    Также прошу написать, яем всё это добро отличается от DNSSEC.

    Мне кажется, материал очень выиграет, если эти страшные слова будут разъяснены в одном месте.


    1. zhovner Автор
      25.10.2018 13:57
      +1

      Готово.


      1. legolegs
        25.10.2018 14:40

        Спасибо!
        Теперь бы ещё обзор софта с поддержкой шифрованного DNS на винду/линукс/мак/мобилки/роутеры


  1. dMac
    25.10.2018 14:45
    +3

    Тут один товарищ прикрутил DNS over TLS к рутованному микротику:
    https://forum.mikrotik.com/viewtopic.php?t=132678#p693725

    Кто может глянуть — возможно ли это сделать без рута?
    Думаю, на уровне маршрутизатора внедрить это дело было бы удобнее, чем на каждом конечном устройстве отдельно.


    1. zhovner Автор
      25.10.2018 15:07

      Есть инструкция по настройке на OpenWRT (LEDE) от cloudflare blog.cloudflare.com/dns-over-tls-for-openwrt
      Сам не пробовал.


      1. basilbasilbasil
        25.10.2018 22:55

        попробовал, пашет, но сломал unbound'ом dhcp в локалке, как починить не знаю


        1. ksenobayt
          26.10.2018 10:20

          Это распространённая проблема.
          Поэтому я предпочитаю резолвер держать на одноплатнике внутри сети, и просто на него перенаправлять запросы от dnsmasq, который их уже кеширует.

          ЗЫ: кстати, еще одна проблема подобного конфига с OpenWRT будет заключаться в том, что у них покамест даже в 18.04 и снэпшотах, используется слегка устаревшая версия OpenSSL, функционала которой недостаточно для проверки сертификатов.

          Таким образом, верифицировать подпись DNS-сервера на OpenWRT вам не удастся. Единственный рабочий вариант сейчас — форсить игнор проверки подписи, что СЛЕГКА нивелирует весь смысл затеи.


          1. YourChief
            26.10.2018 13:29

            А поподробнее можно про верификацию можно? У меня был unbound на openwrt 18.04 с верификацией сертов.


            1. ksenobayt
              26.10.2018 13:43

              А вы уверены, что она работала?
              Проверьте логи, у меня при попытке зафорсить ее включение, в логах были месседжи об ошибке проверки подписи.


              1. YourChief
                26.10.2018 13:51

                Да, иначе у меня резолвинг бы не работал. И когда я указывал проверяемый хостнейм неправильно, то он и действительно не работал. В данный момент я перешёл на stubby из-за меньшего объёма потребляемой памяти — она мне нужна для других важных фич.
                Возможно, разница в том, что я ставил самый последний ipk с unbound, который был доступен — в unbound из основного репозитория такой фичи не было вообще. Но проблема точно не в openssl, он проверяет сертификаты нормально во всех приложениях и никаких особенностей в отношении unbound тут нет.


  1. amarao
    25.10.2018 15:06
    +3

    А почему они все хотят TCP? Почему не шифровать запросы в udp? Меня идея засунуть state в stateless-протокол напрягает.


    1. zhovner Автор
      25.10.2018 15:11

      А мне наоборот нравится TCP, потому что тогда можно выставлять рекурсивный резолвер в интернет и при этом не превращаться в часть DDoS ботнета которого используют для UDP амплификации. Ну и TLS по UDP, наверное, не так просто реализовать.

      В firefox с его встроенным DNS over HTTPS используется keep-alive для TCP подключения, так что по сути резолв может работать подобно UDP: один пакет с запросом --> один ответ.


      1. amarao
        25.10.2018 15:34
        +1

        Вот именно это меня и напрягает. Если у нас пакеты шлются в существующий канал, то если этот канал ушёл в один из уголков TCP, то возвращаться он будет долго. Переупорядоченные пакеты, потерявшийся ack на dup, etc… Там же бездна.


        1. clickfreak
          25.10.2018 17:07

          В libc по умолчанию таймаут в 5 секунд (man resolv.conf), если явно в resolv.conf не исправить на что-то поменьше.
          Persistent DNS Connections for Reliability and Performance


          1. amarao
            25.10.2018 17:32
            +3

            Прочитал. «it is slower than using UDP but only by a factor of 4».

            Я понимаю их аргументы, я понимаю, что там есть таймауты, но я точно знаю, что tcp за счёт гарантий доставки более капризный, чем udp. Он делает гарантированную доставку, но так долго, что лучше не.

            Я могу дать простой пример: сеть с 75% потерь. Мне нужно в среднем около 6 попыток, чтобы получить UDP/DNS ответ в такой сети. 6*5 = 30 секунд. Теперь вопрос, а сколько мне нужно попыток, чтобы установить tcp соединение и передать через него запрос? Удвоение числа пакетов, нужных для успешной отправки резко ухудшает мои шансы.

            Заметим, в случае в UDP-повторами мне всё равно какой из ответов я получу. Любой из прорвавшихся ответов меня устроит. В случае с TCP, даже если мне придёт запоздалый ответ, я в ответ пришлю rst, потому что это «не в ту сессию».

            Короче, у меня скепсис насчёт tcp/dns.


            1. zhovner Автор
              25.10.2018 18:12

              сеть с 75% потерь

              А каким транспортным протоколом можно пользоваться в такой сети для решения каких-либо прикладных задач? Я не говорю что такие ситуации нереальны, но в действительно же будет почти невозможно пользоваться ничем.

              Кстати в таких сетях отлично работает mosh для ssh. Хозяйке на заметку.


              1. amarao
                25.10.2018 18:16

                Иногда просто нет выбора. И тогда очень обидно, что всё ломается ещё на этапе dns.


              1. arheops
                25.10.2018 23:17

                Вы едете в поезде по степям Украины всего в 5км от ближайшего города с 4Г, ага.
                С обычным dns — у вас будет шанс загрузить чегото сильно больше(особенно учитывая, что каждая страничка отправляет до полусотни днс запросиков).


              1. clickfreak
                26.10.2018 17:41

                Вспоминаю как я пытался на Кипре залить на сервер в Питере 100 гигов и отказался от этой затеи как раз из-за сети с кучей потерь, там это почти норма.


            1. clickfreak
              26.10.2018 17:35

              Тут как раз трюк в том что соединения не прибиваются, аля мы "экономим" на хендшейке. Cкепсис правильный, работая с серверами я забыл что потери бывают разные.


              Мобильные телефоны как раз регулярно имеют дело с потерями пакетов и у них, как я понял, stub резолвер умный и уже приспособлен к описанной ситуации.


    1. clickfreak
      25.10.2018 16:56
      +1

      Есть экспериментальный RFC 8094 "DNS over DTLS", в нём есть такие строчки:


      DTLS session resumption consumes one round trip, whereas TLS session resumption can start only after the TCP handshake is complete. However, with TCP Fast Open [RFC7413], the implementation can achieve the same RTT efficiency as DTLS.

      DNS ходит по UDP по историческим причинам, 30 лет назад сети были мееедленные. Хотя и тогда никто не запрещал ходить по TCP.


      На тему современных отношений DNS и TCP, копипаста ответа Anand Buddhdev на вопрос почему зона .org отваливается если включить валидацию DNSSEC на рекурсоре (и забыть убрать опцию tcp: no):


      Don't disable TCP. TCP is required for proper operation of DNS, especially if you want to do DNSSEC validation. Many of the signed responses can be large. For example, the DNSKEY response for .ORG is 1625 bytes, and sometimes TCP is required in order to retrieve such large responses. Disabling TCP can cause DNSSEC validation to fail.

      Ещё есть интересная затея с DNS over QUIC


    1. ValdikSS
      25.10.2018 19:51
      +1

      Можно пользоваться DNSCrypt, протокол у него отличный, просто, по какой-то причине, они не заморочились с его публикацией в качестве RFC. dnscrypt-proxy поддерживает и DNSCrypt, и DNS over HTTPS.


      1. chupasaurus
        25.10.2018 23:13

        DoH поддерживает DNSCrypt v2, который писан на Go и уже не на всякий роутер закинешь :/


    1. vagran
      25.10.2018 20:42

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


  1. int03e
    25.10.2018 15:10

    Кто-то пробовал ставить по этой инструкции knot-resolver на Mojave?
    Была ли у вас такая ошибка?

    cat  /usr/local/var/log/kresd.log
    [system] error ...cal/Cellar/knot-resolver/3.0.0/lib/kdns_modules/kres.lua:11: dlopen(libknot.8.dylib, 5): image not found


    1. zhovner Автор
      25.10.2018 15:15
      +1

      У меня Mojave, работает без проблем. Покажите конфиг knot-resolver и еще это:

      ls -la /usr/local//lib/libknot.8.dylib
      ls -la /usr/local//Cellar/knot-resolver/3.0.0/lib/kdns_modules/


      1. int03e
        25.10.2018 15:20

        ls -la
        ls -la /usr/local/Cellar/knot-resolver/3.0.0/lib/kdns_modules/
        total 712
        drwxr-xr-x  33 int03e  staff   1056 Oct 25 14:57 .
        drwxr-xr-x   6 int03e  staff    192 Aug 20 11:20 ..
        -r--r--r--   1 int03e  staff  31760 Oct 25 14:57 ahocorasick.dylib
        -r--r--r--   1 int03e  staff  17104 Oct 25 14:57 bogus_log.dylib
        drwxr-xr-x   3 int03e  staff     96 Aug 20 11:20 daf
        -r--r--r--   1 int03e  staff   8627 Aug 20 11:20 daf.lua
        -r--r--r--   1 int03e  staff   1240 Aug 20 11:20 detect_time_jump.lua
        -r--r--r--   1 int03e  staff   2329 Aug 20 11:20 detect_time_skew.lua
        -r--r--r--   1 int03e  staff   3552 Aug 20 11:20 dns64.lua
        -r--r--r--   1 int03e  staff  39820 Oct 25 14:57 dnstap.dylib
        -r--r--r--   1 int03e  staff   1212 Aug 20 11:20 etcd.lua
        -r--r--r--   1 int03e  staff   3199 Aug 20 11:20 graphite.lua
        -r--r--r--   1 int03e  staff  39860 Oct 25 14:57 hints.dylib
        drwxr-xr-x  21 int03e  staff    672 Aug 20 11:20 http
        -r--r--r--   1 int03e  staff  11169 Aug 20 11:20 http.lua
        -r--r--r--   1 int03e  staff   3015 Aug 20 11:20 http_trace.lua
        -r--r--r--   1 int03e  staff  12191 Aug 20 11:20 kres-gen.lua
        -r--r--r--   1 int03e  staff  26898 Aug 20 11:20 kres.lua
        -r--r--r--   1 int03e  staff  21422 Aug 20 11:20 policy.lua
        -r--r--r--   1 int03e  staff   5369 Aug 20 11:20 predict.lua
        -r--r--r--   1 int03e  staff   5780 Aug 20 11:20 prefill.lua
        -r--r--r--   1 int03e  staff   4236 Aug 20 11:20 priming.lua
        -r--r--r--   1 int03e  staff   4588 Aug 20 11:20 prometheus.lua
        -r--r--r--   1 int03e  staff   3357 Aug 20 11:20 rebinding.lua
        -r--r--r--   1 int03e  staff   3671 Aug 20 11:20 renumber.lua
        -r--r--r--   1 int03e  staff   1191 Aug 20 11:20 serve_stale.lua
        -r--r--r--   1 int03e  staff  32728 Oct 25 14:57 stats.dylib
        -r--r--r--   1 int03e  staff   2515 Aug 20 11:20 ta_sentinel.lua
        -r--r--r--   1 int03e  staff   1818 Aug 20 11:20 ta_signal_query.lua
        -r--r--r--   1 int03e  staff  15721 Oct 25 14:57 trust_anchors.lua
        -r--r--r--   1 int03e  staff   2737 Aug 20 11:20 view.lua
        -r--r--r--   1 int03e  staff   1658 Aug 20 11:20 workarounds.lua
        -r--r--r--   1 int03e  staff   2405 Aug 20 11:20 zonefile.lua
        
        ls -la /usr/local/lib/libknot.8.dylib
        ls: /usr/local/lib/libknot.8.dylib: No such file or directory
        


        1. zhovner Автор
          25.10.2018 15:23
          +1

          Листинг лучше спрятать под спойлер. У вас наверное не установлен knot, хотя он должен был подтянуться в зависимостях. Установите его вручную:

          brew install knot 


          1. int03e
            25.10.2018 15:31

            Проблема с knot немного в другом, как оказывается:

            brew install knot
            brew install knot
            Warning: knot 2.7.2 is already installed, it's just not linked
            You can use `brew link knot` to link this version.
            ?  sapience git:(development) brew link knot
            Linking /usr/local/Cellar/knot/2.7.2...
            Error: Could not symlink sbin/keymgr
            /usr/local/sbin is not writable.


            1. extempl
              25.10.2018 18:51

              https://docs.brew.sh/Troubleshooting


              If commands fail with permissions errors, check the permissions of /usr/local’s subdirectories. If you’re unsure what to do, you can run
              cd /usr/local && sudo chown -R $(whoami) bin etc include lib sbin share var opt Cellar Caskroom Frameworks.

              После этого всё ещё может не завестись. Пришлось сделать реинсталл, после стопнуть и запустить сервис заново (рестарт не помогал). Может быть реинсталл лишний.


  1. FakieStyle
    25.10.2018 15:57
    +1

    для настройки DoH в Android 9 нужно указать один домен через которых произойдет автоконфигурация. В случае с cloudflare это домен 1dot1dot1dot1.cloudflare-dns.com.

    Судя по всему это домен у которого оба резолвера указаны в A и AAAA записях соответственно:

    1dot1dot1dot1.cloudflare-dns.com. 253 IN A 1.0.0.1
    1dot1dot1dot1.cloudflare-dns.com. 253 IN A 1.1.1.1
    1dot1dot1dot1.cloudflare-dns.com. 253 IN AAAA 2606:4700:4700::1001
    1dot1dot1dot1.cloudflare-dns.com. 253 IN AAAA 2606:4700:4700::1111
    


    А есть ли такой же домен для гугл dns?


    1. zhovner Автор
      25.10.2018 16:10

      Я нашел домен для гугла в сертификате: dns.google
      У него так же как и cloudflare сделано:

      $ dig A dns.google
      ;; ANSWER SECTION:
      dns.google.		825	IN	A	8.8.4.4
      dns.google.		825	IN	A	8.8.8.8
      
      $ dig AAAA dns.google
      ;; ANSWER SECTION:
      dns.google.		808	IN	AAAA	2001:4860:4860::8844
      dns.google.		808	IN	AAAA	2001:4860:4860::8888


  1. morr
    25.10.2018 19:03

    На OSX mojave спустя разные интервалы времени 1-4 часа сервис падает с сообщением в логе

    Assertion failed: (map_contains(&worker->tcp_connected, key) == 0), function worker_add_tcp_connected, file daemon/worker.c, line 1997.

    После падения соответственно DNS перестаёт работать до перезапуска вручную sudo brew services restart knot-resolver. Можно ли как-то настроить автоматический моментальный перезапуск при падении?


    1. onlinehead
      26.10.2018 01:58

      Если не сложно, то можете попробовать другой вариант.
      Я для себя писал подобный прокси простенький на базе либы «miekg/dns», специально для DNS-over-TLS и DNS-over-HTTPS и максимально простым конфигом, локально у меня нормально работает. Вот исходники, он на Go, так что соберется и под Мак — github.com/Onlinehead/dns-to-dns-tls
      Plst для автозапуска правда не делал, потому что у меня в контейнере живет на сервачке.
      Правки приветствуются.


    1. zhovner Автор
      26.10.2018 02:04

      Во первых создайте репорт об этой проблеме в багтрекере gitlab.labs.nic.cz/knot/knot-resolver/issues (можно войти с аккаунтом github)

      Вот измененный конфиг launchd который будет перезапускать knot в случае падения

      /Library/LaunchDaemons/homebrew.mxcl.knot-resolver.plist
      <?xml version="1.0" encoding="UTF-8"?>
      <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
      <plist version="1.0">
      <dict>
      	<key>KeepAlive</key>
      	<true/>
      	<key>Label</key>
      	<string>homebrew.mxcl.knot-resolver</string>
      	<key>ProgramArguments</key>
      	<array>
      		<string>/usr/local/Cellar/knot-resolver/3.0.0/sbin/kresd</string>
      		<string>-c</string>
      		<string>/usr/local/etc/kresd/config</string>
      	</array>
      	<key>RunAtLoad</key>
      	<true/>
      	<key>StandardErrorPath</key>
      	<string>/usr/local/var/log/kresd.log</string>
      	<key>StandardInPath</key>
      	<string>/dev/null</string>
      	<key>StandardOutPath</key>
      	<string>/dev/null</string>
      	<key>WorkingDirectory</key>
      	<string>/usr/local/var/kresd</string>
      </dict>
      </plist>



      1. morr
        26.10.2018 02:09

        спасибо


  1. CeyT
    25.10.2018 19:50

    Ради минимальных приличий хоть напишите, что грязными лапами в список посещённых доменов после этого будут лезть Google и Cloudflare, и что это всё делается не ради помощи бедным пользователям и их безопасности, а для борьбы с конкурентами, получающими поведенческие данные в тех точках, куда указанным компаниям не дотянуться.


    1. zhovner Автор
      25.10.2018 20:08
      +1

      Гугл и cloudflare по крайней мере не были замечены в инъекциях рекламы в HTTP трафик и модификации моих сайтов. В отличии от мегафона и билайна.

      Вообще я сомневаюсь что данные о резолвах открывают такое больше поле для аналитики. При обычном серфинге, вы, скорее всего, зарезолвите все те же ресурсы, что и при целевом посещении. Условно говоря, при поиске товаров для животных вы так или иначе зарезолвите vk.com, youtube.com, google.com и еще кучу доменов. Как из этого можно сделать поведенческий профиль? Резолв не дает так много информации, как например, трекеры на сайтах. Так что полагаю, что скорее всего, эти сервисы сделаны больше для того, чтобы доставлять свою рекламу в неизменном виде, чтобы по пути ее не резали блокировщиками и не подменяли на другую, а не столько для трекинга пользователей.


      1. CeyT
        25.10.2018 22:49

        Никого ничему история не учит: вы сейчас доказываете, что Microsoft большой (больше всех!), и что предложение добавить в веб OLE с внешним исполнимым кодом взлетит, «потому что это Microsoft, а не какая-то местная конторка».

        Вы сомневаетесь, а они не сомневаются. Это не благотворительные организации; то, что не приносит дохода, закрывается. Запросы к DNS дают не просто список доменов, а список доменов с точным временем перехода к ним — это и круглосуточный портрет пользователя, и статистика для всех сайтов (даже не имеющих ни одного трекера, даже при использовании блокировщика ни клиенте), и возможность легко объединить посещения конкретного пользователя со статистикой GA по нему. Cloudflare не сомневается, что халявный трафик через их сервера для любого желающего приносит прибыль, а не одни лишь убытки. Подрезали Google крылышки GDPR — встроенные карты тут же стали платными, потому что контент жирный, а сбор с него информации впрок теперь запрещён. Сравните старые и новые цены за доступ к технологии, чтобы прикинуть, во сколько это обходится.

        Мы имеем то, что имеем, не в результате того, что кто-то пришёл с ружьём и всех заставил, а в результате множества таких вот компромиссов, но даже предложение признать проблему — не говоря уж об отказе от использования — встречается с недоумением. С таким вот диджитал резистанс все причастные могут спать спокойно.


        1. dollar
          25.10.2018 23:36
          +1

          А вы не думали, что Google собирает данные просто для ранжирования сайтов в выдаче?
          Это их основной продукт.

          В любом случае, какой бы DNS вы ни использовали, данные будут кому-то утекать. Что ж, теперь, вообще Интернетом не пользоваться?


          1. CeyT
            26.10.2018 02:06

            «В какой бы магазин вы ни пошли купить мяса, вам в итоге навалят обрезков, костей, грязных тряпок, и ещё под зад пнут ногой».

            Не очень привычная логика, не находите?


  1. ZaEzzz
    25.10.2018 20:45

    Это отличная новость!
    К примеру, ростелеком гарантированно меняет содержимое перенаправляя на рекламу своих пакетов. Техподдержка говорит, что РТ так доносит предложения, но на письмо на каком основании нет, они такой фигней не занимаются.


    1. dimonoid
      25.10.2018 21:19
      +1

      Проверьтесь на вирусы/используйте другой компьютер. Есть небольшой шанс что они не врут. AdwCleaner может помочь. У меня такая фигня както раз была, большинство антивирусов ничего не находят, тк реклама по их мнению не вирус, а нежелательное по.


      1. ZaEzzz
        25.10.2018 21:43
        +2

        На мой запрос по какой причине производится замена результата пришел ответ с адреса no-reply@rt.ru:

        Уважаемый абонент, Ваша претензия № 47511808 рассмотрена По фактам, указанным в Вашем обращении, проведена проверка. Редирект произведен с сайта store.steampowered.com. Это могло произойти как как на стороне сервера, так и на стороне клиента (в браузере). Средствами АСР Ростелеком редирект не производится.

        Есть нюансы:
        1 — Все, что происходит в системе я знаю, никаких сюрпризов нет и AdwCleaner у меня запустится только в виртуалке или под вайном. Ну не использую я винду и хорошо знаю что у меня в лялихе крутится.
        2 — ТП в РТ сообщал о том, что это способ донести предложение. Цитирую: «Ростелеком старается предоставлять различным способами, включая показ при открытии сайтов. Очень жаль, если данный вариант Вас огорчил.» Но в письме с no-reply@rt.ru «Средствами АСР Ростелеком редирект не производится.»
        3 — Редирект произошел после того, как я руками вбил в адресную строку store.steampowered.com (то есть не переход по ссылке) и открылась реклама тарифа РТ с каким-то аккаунтом танков и с доп танками.

        В сухом остатке: видя, что я хочу перейти на игровой портал мне предлагают игровой тариф и говорят, что это не они устраивают MITM, а валв переводит трафик к своим конкурентам в надежде снизить посещаемость и продажи.
        Простите, но это смешно.


  1. nlykl
    25.10.2018 21:13

    Ждём гайда по настройке этого в OpenWRT.


    1. zhovner Автор
      25.10.2018 21:16

      blog.cloudflare.com/dns-over-tls-for-openwrt

      Сам не пробовал.


      1. YourChief
        26.10.2018 01:59

        Это старое руководство для старой версии unbound (<1.6.1), которая не валидирует SAN сертификата. В таком виде DoT бесполезен. Вот статья, освещающая проблему и предоставляющая правильную конфигурацию.


  1. Paskin
    25.10.2018 21:57

    А как теперь будут работать CDNы, локальные копии и тому подобное?


  1. konchok
    25.10.2018 22:11
    -1

    Посоветовал бы не пускать все DNS по крипте, а оставить какие-то открытыми. Пользователь без DNS запросов привлекает повышенное внимание.


    1. zhovner Автор
      25.10.2018 22:13
      +1

      Ох как бы не вызвать подозрений.


    1. dollar
      25.10.2018 23:47
      +1

      Хотите сказать, что к вам приедут с обыском и конфискацией оборудования, потому что у вас нет DNS запросов?


  1. IGHOR
    25.10.2018 23:44

    Что мешает провайдеру заблокировать все исходящие запросы на 853 порт?
    Тем самым вынудить всех использовать стандартный, легко модифицируемый протокол по 53 порту.


    1. dollar
      25.10.2018 23:54

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


    1. zhovner Автор
      26.10.2018 00:00

      Тогда будем использовать DNS over HTTPS. Его будет крайне сложно запретить не сломав при этом интернет целиком.


  1. firehunt
    26.10.2018 01:22

    DoH ломает концепцию, что DNS является «Control Plane» Интернет. Внезапно DNS оказывается на «Data Plane». Это не мои слова, это Paul Vixie.
    Скорости работы ни от DoT ни от DoH ждать не приходится.

    По скорости, среднем в РФ у провайдеров DNS сервера медленнее гуглового сервиса, иногда в разы.
    За исключением Ростелекома Северо-Западного макро филиала, DNS сервера которого работают быстрее чем Google Public DNS уже несколько лет.


  1. TrueBers
    26.10.2018 02:44

    А что со скоростью резолва, собственно? Сколько раньше ни попробовал, меньше 500-700ms на холодную не получалось добиться. А это совсем не юзабельно. Может, не так что-то делал? Накручивал всякие fast open, keepalive, etc. Бестолку.
    При том, что чистый днс ходит на гугл за 10-15мс.