Сетевые технологии
23 сентября

Rutracker включил eSNI. Конец эпохи DPI и конец блокировок

Из песочницы


Несмотря на желтый заголовок, дальше будет не желтая статья. Всех нас (я надеюсь именно здесь я наконец-таки смогу сказать от всего сообщества) уже достали действия Роскомнадзора. А так же его постоянное появление в рекомендованном на хабре. Поэтому эта новость вам понравится. Хоть что-то важное. Новость кстати еще от декабря 2018.

Если в двух словах, сейчас основной эффективный способ DPI это проверка поля SNI в пакете. Чтобы не повторяться, я отправлю вас на статью ValdikSS. Не то, чтобы там вся информация, но основные моменты изложены верно. Добавлю только, что теперь оборудование оператора научилось вставлять https TLS 1.2 сертификат, который не проходит валидацию в браузере и имеет общее имя MGTS. (Даже не mgts.ru, ха-ха, то есть это даже не домен, не то, чтобы у них могло получиться создать его, со всеми этими Certificate Transparency, который создал Google.) Кроме того, сейчас уже непонятно, заблокирован ли ip полностью. Т.е. все порты, например, как ping.pe/www.7-zip.org. или вам отвечает DPI. Тут решение у сайтов только одно: постоянно менять ip адрес.

Rutracker имеет всего лишь три официальных зеркала (хотя можно создать свое, персональное, нужен лишь свой домен): rutracker.net rutracker.nl и rutrackerripnext.onion. Все они имеют определенное отношение к Cloudflare (авторитативный DNS сервер от cloudflare или tor, а у rutracker.nl и ip от cloudflare bgp.he.net/ip/104.28.16.16):

root@kali:~# dig @8.8.8.8 IN SOA rutracker.nl && dig @8.8.8.8 IN A rutracker.nl

;; ANSWER SECTION:
rutracker.nl.		3599	IN	SOA	buck.ns.cloudflare.com. dns.cloudflare.com. 2031873434 10000 2400 604800 3600

;; ANSWER SECTION:
rutracker.nl.		231	IN	A	104.28.17.16
rutracker.nl.		231	IN	A	104.28.16.16

;; Query time: 22 msec
;; SERVER: 8.8.8.8#53(8.8.8.8)
;; WHEN: Mon Sep 23 16:46:24 MSK 2019
;; MSG SIZE  rcvd: 73

Тем, кто читал статьи habr.com/ru/post/424857 habr.com/ru/company/globalsign/blog/427563 уже все понятно. Кстати, если у вас предубеждение перед cloudflare… Там вся идея была в том, что 35% всех доменов в мире держат зону на авторитативных серверах cloudflare (en. wiki), кроме того, какой-то процент еще и хостят там сервера. И если сразу везде активировать eSNI, то это будет существенно… Что и было сделано.

Но для тех, кто не читал: eSNI (encrypted Server Name Indication) по умолчанию работает на Cloudflare хостинге (а именно _esni поддомен любого домена имеет запись TXT с ключом, которым шифруется SNI, хотя эти негодники из IETF уже успели изменить IN TXT запись на новый тип IN ESNI github.com/tlswg/draft-ietf-tls-esni/pull/144).

root@kali:~# dig @8.8.8.8 IN TXT _esni.rutracker.nl

; <<>> DiG 9.11.5-P4-5.1+b1-Debian <<>> @8.8.8.8 IN TXT _esni.rutracker.nl
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 33017
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 512
;; QUESTION SECTION:
;_esni.rutracker.nl.		IN	TXT

;; ANSWER SECTION:
_esni.rutracker.nl.	3599	IN	TXT	"/wF+a004ACQAHQAgtyygbWc/bwQo5RPSszvuzK+0BIucwJhOLHZ0iCqrCjsAAhMBAQQAAAAAXYTNUAAAAABdjLZQAAA="

;; Query time: 42 msec
;; SERVER: 8.8.8.8#53(8.8.8.8)
;; WHEN: Mon Sep 23 16:54:07 MSK 2019
;; MSG SIZE  rcvd: 152

Итак, как заставить его работать? Во-первых, работает eSNI только в Mozilla Firefox. В Chromium (а значит и Chrome) поддержка будет добавлена не скоро, да и работать оно не будет, поскольку Google будет использовать IN ESNI запись, которая будет видимо поддерживаться только Google (ни cloudflare, ни Firefox это не поддерживают). Можете перейти по ссылкам и высказать свое фе гуглу и IETF. Нужен лишь google и/или github аккаунт.

Кратенькая инструкция: в firefox в about:config меняете network.security.esni.enabled на true. Для работы eSNI желательна работа (на самом деле она не нужна, но есть проблема: в windows сложно сделать такой запрос (IN TXT) асинхронно bugzilla.mozilla.org/show_bug.cgi?id=1500289) DNS over HTTPS, так как публичный ключ для шифрования sni берётся с поддомена _esni.example.com IN TXT, так что желателен зашифрованный транспорт dns, чтобы большое око Саурона провайдера не увидело этого. Для этого network.trr.mode выставляете в 2 (или 3, чтобы был только TRR), а network.trr.uri выставляете в https://mozilla.cloudflare-dns.com/dns-query (либо можно https://dns.google.com/experimental или https://1.0.0.1/dns-query)

Можно еще прописать network.trr.bootstrapAddress, иначе resolve самого mozilla.cloudflare-dns.com будет происходить через системный resolver и лишь дальше установлена DoH сессия с DNS, что вызывает проблемы, если сразу запустить Firefox (Можно поставить 1.0.0.1, 1.1.1.1 2606:4700:4700::1111 или 2606:4700:4700::1001 или что там будет у dig mozilla.cloudflare-dns.com. (А там не обязательно эти адреса, но и любые из динамического облака cloudflare.)) Подробнее про trr resolver: github.com/bagder/TRRprefs

Дальше нужно проверить, что все заработало)) Заходите на cloudflare.com/ssl/encrypted-sni и нажимаете на Check My Browser

Вот после этого заходите, например, на rutracker.nl, заблокированный РКН (2-6-20/ 2019-04-25-699-АИ от 29.05.2019 от налоговой службы). И… все работает! Небольшой бонус: реализация для Android ровно такая же, так что там тоже всё работает. К сожалению, нативная работа DNS over TLS в Android 9 не дает насладиться eSNI, нужен TRR внутри браузера. Увы и ах. Опять таки, высказываем свое фе, не стесняемся. bugzilla.mozilla.org/show_bug.cgi?id=1542754

Будем надеяться, что это уничтожит в ближайшее время DPI и Нумерационному совету (NRO) RIR не придется выносить ноту протеста РФ. Ничего хорошего не будет, если они попробуют отозвать Автономные Системы у крупных операторов РФ, как это недавно обсуждалось. Пока что APNIC собирается использовать свою распределенную DNS сеть (каждый ip адрес Cloudflare может стать DNS сервером, если это понадобится) и включение eSNI как возможный метод упрощения идентификации несанкционированных вмешательств в нумерационный ресурс интернета, так как блокировки по ip это нарушения связности, которые легко искать просто по looking glass внутри провайдеров, принадлежащих RIR.

Также следует сказать, что отсутствующее поле SNI может заставить некоторые DPI сбоить и т.д. Впрочем на МГТС это работает. Также читаем коммент в соседней статье.

+187
142k 465
Комментарии 340