22

Чем хорош и плох «безопасный DNS»

Возможно вы слышали, что в новых версиях Firefox внедрили поддержку нового шифрованного/безопасного/еще более лучшего (нужное – подчеркнуть) DNS, но не знаете что это за DoH такой и нужeн ли он вам; попробую объяснить.

Сперва – что такое старый нешифрованный, небезопасный и менее лучший DNS. Совсем кратко – это «адресная книга» для веб-сайтов: мы набираем в адресной строке браузера pikabu.ru, но браузер не знает, что это и как это найти. Он посылает DNS-запрос к DNS-серверу, и тот уже объясняет: что, как и где. Подробнее можно почитать в Педивикии – тот редкий случай, когда все объясняется четко и по делу.


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


Подмена цели, это когда вы хотите зайти на pikabu.ru, а попадаете на сборник троянов. Или когда набираете адрес любимого сайта с детским проном котятками, а вместо него видите «Доступ к ресурсу заблокирован Роскомпозором». В обоих случаях происходит перехват DNS-запроса и подмена IP-адреса искомого сайта. С «телеметрией», думаю, и так все понятно – обычная история из серии «хочу все знать» и желательно про всех.


Если же DNS-запрос зашифровать, то ваши намерения в Интернете окажутся неизвестны «посредникам», т.е. в ваших поисках IP-адреса сайта pikabu.ru они будут участвовать не зная об этом. Куда идете вы с Пятачком Огнелисом будет известно лишь вам, администрации Пикабу и используемого DNS-сервера, а не всем подряд по дороге к нему и обратно.


Правда евангелисты «безопасного DNS» часто «забывают» уточнить несколько моментов.


Во-первых, вся эта возня с настройками браузера на «безопасный DNS» имеет смысл только в том случае, если вы собираетесь заходить на сайты, которые поддерживают соединение по защищенному протоколу – HTTPS, в противном случае вы получите лишь бронированную калитку в картонных воротах.


Во-вторых, первый запрос к искомому сайту будет содержать незашифрованный идентификатор имени сервера (SNI), из которого будут четко видны ваши намерения. Это нормально, как говорится, by design, но если провайдер использует систему анализа пакетов (DPI), то все напрасно. Чтобы превозмочь провайдерский DPI, вы можете включить поддержку шифрования идентификатора – ESNI (Encrypted SNI): заходите в about:config, находите (или создаете) параметр network.security.esni.enabled (тип – Boolean), и выставляете ему значение true, но…


Но, в-третьих, если провайдер использует DPI, то не обнаружив в вашем запросе ожидаемого там SNI, он, вполне вероятно, просто заблокирует этот запрос и вы увидите вместо искомого сайта сообщение PR_CONNECT_ABORTED_ERROR. Да, это цензура, не имеющая правовых оснований, нарушение положений ФЗ «О связи», прав человека, гражданина, потребителя и это все – жалуйтесь в Роскомпозор, там вас с интересом выслушают и даже посочувствуют.


В-четвертых, если в реестр Роскомпозора внесено не доменное имя, а IP-адрес, то схема с шифрованием DNS-запроса и SNI просто не работает (и не должна).


Таким образом, «безопасный DNS» панацея не столько от цензуры, сколько от излишне любознательных «информационных посредников», в первую очередь – интернет-провайдеров, и интернет-жулья. Но… но пока где-то в сибирской тайге или московском пентхаузе горько рыдает отечественное жулье, отлученное от ваших интернет-логов, в солнечной Калифорнии плачет от счастья сотрудник Cloudflare или другой Корпорации бобра, которой вы добровольно передали отнятые у своего провайдера данные о своих интернет-маршрутах. Упс…


Это было в-пятых? Погнали дальше, в-шестых: если вы блокируете рекламу и прочий мусор с помощью hosts, блокировка работать перестанет, т.к. DNS-клиент операционной системы будет получать от браузера уже зашифрованный запрос к DNS-серверу и проверить наличие искомого сайта в hosts не сможет. Вернее, сможет в теории, но не умеет в разбор пакетов, вычленение из них SNI и сравнение его с записями в hosts, а переписывать код ОС ради этого никто не будет (хотя насчет Linux утверждать не стану).


Как в теории можно было бы реализовать максимально безопасный и удобный для пользователя шифрованный DNS? Я это вижу как «DNS-рулетку»: у пользователя существует список безопасных DNS-серверов, которым он доверяет (т.е. в нем априори нет серверов Google и прочих глобальных шпионов), при подаче DNS-запроса из этого списка случайным образом выбирается один из серверов, к нему и идет запрос.


Следующий запрос – к другому случайному серверу из списка, в который могут входит сотни серверов. Таким образом, каждый из серверов получает некоторые данные о запросах (читай – идентифицирующих признаках) пользователя, но ни один из них не видит всей картины целиком. В каждом запросе еще можно подставлять рандомный user-agent и прочие составляющие «цифрового отпечатка». Мечтать не вредно…


Для справки


Доведенных до практической реализации) протоколов безопасного DNS существует два: DoT (DNS over TLS) и DoH (DNS over HTTPS). Первый предложен Институтом информационных наук Университета Южной Калифорнии, компанией Verisign и ICANN в 2016 году, второй – спустя два года – той же ICANN и компанией Mozilla, оба до сих пор не утверждены в качестве стандарта.


DoT поддерживается на системном уровне в Android 9 и выше, DoH – в экспериментальных функциях Chrome (начиная с версии 78) и полноценно в Firefox (с версии 62). ESNI, насколько я знаю, сейчас поддерживается только в Firefox.


Проверить, используется ли безопасный DNS.


Проверить, используется ли ESNI.