О методах блокировки интернет-ресурсов

Обзорная (без глубокого разбора протоколов и софта) статья о принципах работы различных средств ограничения доступа к интернет-ресурсам, способах их обхода и методах борьбы с этими способами.

Credits: svgrepo.com freepik.com
Credits: svgrepo.com freepik.com

Итак, предположим, что вы стали правителем какой-нибудь страны N, и заметили, что люди тратят слишком много времени на просмотр картинок с котами. Вы видите, как люди проводят часы на cutecatpictures.meow. Вы решаете действовать – заблокировать доступ к ресурсу. Но как это сделать? В этой статье рассмотрены все основные способы ограничения доступа к ресурсам в Интернете, и просто (вроде бы) объяснен их принцип действия. Также есть немного сведений о том, как хитрые любители кошек будут обходить ваши ограничения, и что с этим делать.

Это не подробная техническая статья, её цель – предоставить вам базовые теоретические знания по теме с примерами.

Приятного чтения)

Содержание

Блокировки с помощью DNS

Как известно, основная функция DNS – предоставление информации о том, какие IP адреса у серверов, обслуживающих тот или иной домен (разрешение доменных имён). Следовательно, достаточно просто подменить DNS записи для домена, к которому нужно ограничить доступ. Теперь, когда пользователь захочет зайти на cutecatpictures.meow, он увидит, к примеру, страничку с информацией о причинах блокировки – получит нужный вам IP адрес вместо настоящего в ответ на DNS запрос.

Пример блокировки:

Чтобы быстро и легко увидеть, как это работает, воспользуемся публичным DNS сервером от Cloudflare, который должен блокировать фишинговые сайты.

Контрольный запрос для dtf.ru, чтобы убедиться, что всё работает:

$ nslookup dtf.ru 1.1.1.2 Server: 1.1.1.2 Address: 1.1.1.2#53 Non-authoritative answer: Name: dtf.ru Address: 109.238.90.252

Как видим, возвращается реальный IP адрес, и если обратиться к нему, мы получим ответ от DTF:

$ curl -I -L -H "Host: dtf.ru" http://109.238.90.252 ... HTTP/2 200 server: nginx date: Wed, 23 Oct 2024 19:08:51 GMT content-type: text/html; charset=utf-8 content-length: 483365 ...

А вот при попытке разрешить доменное имя тестового "фишингового" сайта, мы получаем нулевые адреса – на сайт мы не попадем:

$ nslookup phishing.testcategory.com 1.1.1.2 Server: 1.1.1.2 Address: 1.1.1.2#53 Non-authoritative answer: Name: phishing.testcategory.com Address: 0.0.0.0 Name: phishing.testcategory.com Address: ::

Достоинства и недостатки:

Большой плюс такого метода в том, что не требуется установка никаких дополнительных коробок “в разрез” провода для фильтрации трафика. Можно использовать существующие DNS сервера провайдеров. Даже не нужно иметь дело со всякими файрволлами.

Однако, и минусов тут предостаточно:

  • Такую блокировку обойти легче всего - пользователь может просто сменить DNS сервер, либо же обращаться к ресурсам напрямую по IP адресу
  • Если пользователь обращается к ресурсу по HTTPS (или другому протоколу с проверкой подлинности сервера), то подобные манипуляции приведут к ошибке, ведь конечный сервер не сможет предоставить сертификат и ключ, соответствующий доменному имени. Пользователь увидит ошибку в браузере, а вы ведь столько времени потратили на красивую страницу с предупреждением.
  • DNSSEC позволяет предотвратить подмену записей (однако, его использование не обязательно и мало распространено)

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

Стоит отметить, что вообще-то всё вышеописанное называется DNS hijacking, и для простых смертных сие занятие, как правило, незаконно.

Капелька информации про адреса

Интернет – это сеть сетей (или автономных систем - AS). Этим AS адреса выделяются сразу большими диапазонами, которые характеризуются префиксом – битами в начале адреса (старшими), которые будут одинаковы у всех адресов в этом диапазоне.

Например, вот один из блоков адресов Google, входящий в AS15169: 8.8.4.0/24. Первые (или старшие) 24 бита у всех адресов будут одинаковы.

Блокировки по IP

Реализовать данный тип блокировок очень просто. В IP пакетах адрес отправления и назначения передаются в открытом виде. То есть, достаточно просто проверять, что трафик идёт к запрещенному адресу, а дальше либо разрывать соединение (если речь о каком-нибудь TCP) согласно протоколу, либо просто дропать пакеты.

При этом, как уже говорилось выше, адреса распределены не случайным образом, то есть вполне реально заблокировать все диапазоны адресов Google LLC, например.

Теперь поговорим о минусах:

  • На одном IP с высокой вероятностью будет находиться множество разных, иногда никак не связанных друг с другом ресурсов. Например, Cloudflare использует подсети, в которых суммарно менее 2 млн IPv4 адресов, обслуживая около 20% всех сайтов в интернете. Представьте, что будет, в случае блокировки их IP.
  • IP адреса могут часто меняться, ведь они, в отличие доменов не влияют на пользовательский опыт и, как правило, не связаны с брендом.

BGP

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

Итак, для реализации блокировок можно воспользоваться тем, как вообще происходит выбор маршрута для трафика в интернете. Вернее то, как он путешествует между AS.

BGP (Bridge Gateway Protocol) помогает AS обмениваться информацией о том, в какой из них находится тот или иной адрес. Всё это происходит с помощью анонсирования префиксов соседним AS, которые затем анонсируют его их соседям... Ну, вы поняли. Причем при выборе маршрута предпочитаются AS, которые наиболее специфичны в своих анонсах (префикс больше).

Это даёт вам возможность заворачивать весь трафик до определенного IP в нужную вам AS. Достаточно просто анонсировать его с префиксом, большим, чем в анонсах других AS. Это единственный метод из описанных здесь, который не получил широкого применения, однако случаи были. Например, однажды Пакистан сломал YouTube по всему миру. С тех пор в протокол были внедрены меры защиты, чтобы не допускать бед такого масштаба в будущем.

Анализ трафика

Итак, подмена DNS ненадежна и создает подозрения у пользователей, поддерживать базы данных IP адресов заблокированных ресурсов в актуальном состоянии тоже не так легко (ведь ещё же надо все эти изменения доводить до сетевых фильтров), ещё и задеть не то можно.

Значит, пришло время внедрять в сети устройства DPI (Deep Packet Inspection), которые смогут анализировать проходящий через них трафик и блокировать нежелательные соединения. Интернет работает так слаженно (ну... для своих масштабов) благодаря различным протоколам, которые хорошо стандартизированы. И эта то стандартизация поможет в блокировках – прочитав содержимое пакетов, можно предположить, какому протоколу связи они соответствуют, и затем извлечь различные данные.

Определяем протокол

Большинство сетевых протоколов имеют характерные особенности. Это может быть определенный формат сообщений, их размер, время между ними и др.

Например, если вы перехватите незашифрованный HTTP запрос, там будет что-то такое:

... 0030 04 02 f8 1c 00 00 47 45 54 20 2f 20 48 54 54 50 ......GET / HTTP 0040 2f 31 2e 31 0d 0a 48 6f 73 74 3a 20 65 78 61 6d /1.1..Host: exam 0050 70 6c 65 2e 63 6f 6d 0d 0a 55 73 65 72 2d 41 67 ple.com..User-Ag 0060 65 6e 74 3a 20 4d 6f 7a 69 6c 6c 61 2f 35 2e 30 ent: Mozilla/5.0 0070 20 28 57 69 6e 64 6f 77 73 20 4e 54 20 31 30 2e (Windows NT 10. ...

У TLS, который используется для шифрования в HTTPS, тоже есть характерный формат сообщений при рукопожатии.

Ещё пример: согласно спецификации BitTorrent 1.0, первое сообщение от клиента включает строку BitTorrent protocol.

Как видно, обычно определить протокол несложно (позже поговорим о том, когда это не так. Да-да, ShadowSocks).

Узнаем, куда идёт запрос

Сейчас поговорим про те самые блокировки про SNI, про которые все уже наслышаны.

Итак, cutecatpictures.meow - это веб-сайт, поэтому браузер будет взаимодействовать с ним с помощью HTTP(-S). С HTTP всё уже понятно, в предыдущем разделе мы прекрасно видели в перехваченном запросе строку Host: example.com.

С HTTPS всё сложнее. Там зашифровано будет всё, начиная с GET. Но есть нюанс. Перед тем, как соединение будет установлено, должно произойти рукопожатие, во время которого некоторые данные (например, поддерживаемые алгоритмы шифрования) передаются открытым текстом.

Схема рукопожатия TLS
Схема рукопожатия TLS

Server Name Indication (SNI) — расширение компьютерного протокола TLS, которое позволяет клиенту сообщать имя хоста, с которым он желает соединиться во время процесса «рукопожатия». Это позволяет серверу предоставлять несколько сертификатов на одном IP-адресе и TCP-порту, и, следовательно, позволяет работать нескольким безопасным (HTTPS) сайтам (или другим сервисам поверх TLS) на одном IP-адресе без использования одного и того же сертификата на всех сайтах.

Источник: Wikipedia

Кроме того, SNI позволяет различным прокси-серверам маршрутизировать трафик без расшифровки.

Браузеры, как правило, устанавливают имя хоста равным доменному имени или IP адресу, если в адресную строку ввести его.

Перехватим Client Hello во время рукопожатия:

... 0730 00 17 00 00 00 00 00 13 00 11 00 00 0e 77 77 77 .............www 0740 2e 67 6f 6f 67 6c 65 2e 63 6f 6d 00 2d 00 02 01 .google.com.-... ...

Таким образом мы определили, что пользователь пошёл (предположительно, значение можно и подменить) на www.google.com.

Пример блокировки:

Рассмотрим блокировки по SNI в РФ, чтобы далеко не ходить.

Для начала получаем IP одного из серверов Yandex (можно любой другой точно не заблокированный ресурс):

$ nslookup yandex.ru Server: one.one.one.one Address: 1.1.1.1 Non-authoritative answer: Name: yandex.ru Addresses: 2a02:6b8:a::a 77.88.44.55 77.88.55.88 5.255.255.77

Проверяем, что всё работает при SNI yandex.ru:

$ curl -I --resolve yandex.ru:443:77.88.44.55 https://yandex.ru HTTP/1.1 302 Moved temporarily ....

Как видим, ответ получен. Теперь попробуем отправить на тот же адрес запрос с неподходящим, но разрешенным доменом:

$ curl -I --resolve example.com:443:77.88.44.55 https://example.com curl: (60) schannel: SNI or certificate check failed: SEC_E_WRONG_PRINCIPAL (0x80090322)

Всё работает как и ожидалось: мы получаем ошибку, ведь на серверах Яндекса нет сертификата для example.com. И, наконец убедившись, что для незаблокированных ресурсов всё работает как надо, делаем запрос на тот же IP, используя SNI discord.com (заблокирован в РФ на момент написания статьи):

$ curl -v --resolve discord.com:443:77.88.44.55 https://discord.com * Added discord.com:443:77.88.44.55 to DNS cache * Hostname discord.com was found in DNS cache * Trying 77.88.44.55:443... * Connected to discord.com (77.88.44.55) port 443 * schannel: disabled automatic use of client certificate * ALPN: curl offers http/1.1 * Recv failure: Connection was reset * schannel: failed to receive handshake, SSL/TLS connection failed * Closing connection * schannel: shutting down SSL/TLS connection with discord.com port 443 * Send failure: Connection was reset * schannel: failed to send close msg: Failed sending data to the peer (bytes written: -1) curl: (35) Recv failure: Connection was reset

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

DPI – это не только блокировки

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

Можно давать приоритет определенным соединениям за счет других (вообще, базовая функциональность для этого предусмотрена в самом IP). Например, знаменитое замедление торрентов у мобильных операторов, которое позволяет им снизить нагрузку на сеть.

Также, пассивный анализ трафика может позволить провайдеру собрать статистику по посещаемости и количеству трафика в сторону отдельных ресурсов.

Бонус: можно ли расшифровать TLS соединение?

Дальше много текста, не столь важного для именно блокировок. Если вам не интересно, мотайте вниз.

В ассиметричной криптографии используются пары ключей. Данные, зашифрованные одним, можно расшифровать только другим. Точно так же, если "подписать" данные одним ключом, то с помощью другого можно подтвердить их подлинность.

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

Этого простого объяснения без деталей достаточно, чтобы понять то, о чём пойдет речь дальше.

TLS (и более старый SSL) при правильном использовании выполняют сразу две функции – шифрование трафика и подтверждение подлинности сервера. С шифрованием всё, я думаю, понятно. А что по подлинности?

Для этого используются сертификаты, которые устанавливают соответствие между публичным ключом и его владельцем (организация, домен...). Если речь идет не о частных сетях, то обычно сертификаты выдаются доверенными организациями, которые используют свои пары ключей для генерации подписей. В свою очередь то, что их ключи настоящие, подтверждают вышестоящие центры сертификации... И так до корневых, которым принято доверять без вопросов (да-да).

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

Значит, необходимо вмешаться в процесс рукопожатия. И для этого вам нужна пара ключей. Для того, чтобы ей обзавестись, есть два пути.

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

Но ведь можно самим стать доверенным центром сертификации. Это отлично работает в корпоративных сетях, ведь у администраторов есть доступ ко всем машинам – они просто добавят сертификат в список доверенных. Таким образом, оборудование на границе сети сможет перехватить рукопожатие, использовать свою пару ключей, и затем проверять, что конфиденциальные данные никуда не утекают, например. В масштабах страны такое сделать сложнее, ведь придется убеждать людей вручную добавить сертификат национального центра в доверенные на всех устройствах....

Что будут делать пользователи

Постоянных посетителей cutecatpictures.meow спасает один факт: продвинутая фильтрация трафика в масштабах страны, или даже крупной организации – очень дорогое удовольствие. Поэтому, когда вы будете разворачивать устройства DPI, чтобы блокировать cutecatpictures.meow, вы попросите разработчиков по максимуму экономить ресурсы. Средства обхода DPI же пытаются создать такую ситуацию, к которой алгоритмы анализа трафика не готовы.

Например, алгоритм может не распознать заголовок Host (помните, где был example.com), если он записан как hOsT.

Также могут использоваться новые протоколы, например QUIC. В случае с блокировкой по SNI, можно использовать ECH (Encrypted Client Hello), если конечный сервер его поддерживает. В этом случае, SNI будет зашифрован, и анализатор не сможет ничего вытащить. Правда такой переизбыток приватности, часто приводит к блокированию государством вообще любого трафика, который использует ECH.

К тому же, в связи с ограниченными ресурсами, может быть тяжело восстановить сообщение, если оно фрагментировано на множество отдельных пакетов. Например, половина SNI будет в одном IP пакете, а половина в следующем. Если алгоритм анализирует только отдельные пакеты, этого уже достаточно, чтобы его обойти.

Кроме того, у IP пакетов есть TTL (максимальное количество пересылок до того, как он должен быть дропнут) и контрольная сумма. Если соединение проверяется только на этапе рукопожатия, а все следующие пакеты пропускаются без проверки, то хитрый любитель котов отправит сначала пакет с низким TTL или неверной контрольной суммой, зато “правильным” SNI. Пакет не дойдет до конечного сервера, или будет им отброшен. Зато фильтр может прекратить проверять последующие пакеты, давая клиенту провести настоящее рукопожатие.

Также пакеты можно менять местами –протокол TCP предполагает такую ситуацию, и конечный сервер, обслуживающий cutecatpictures.meow сможет их рассортировать в нужном порядке.

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

Блокировка обхода блокировок

Итак, вы дали инженерам команду улучшать алгоритмы DPI, отслеживая все самые новые вариации извращений с пакетами, но люди просто переходят на VPN. Как вы уже, наверное, догадались, спецификации большинства VPN-протоколов находятся в открытом доступе, поэтому вы сможете с достаточно высокой точностью обнаруживать использование многих из них, прямо как с HTTP.

Теперь вам нужно выбирать способ борьбы с постоянно модифицируемыми протоколами. Тут два пути

  • Белый список. Блокировать весь трафик, который не похож на самые распространенные протоколы
  • Черный список. Блокировать только трафик, который похож на протоколы, используемые для обхода блокировок.

В первом случае, будут развиваться способы маскировки под разрешенные протоколы (как это делает VLESS+Reality, позволяя "спрятаться" за любой доступный по HTTPS с TLS 1.3 ресурс), либо вообще прямое использование этих протоколов для создания туннелей. Например, WebSocket или gRPC отлично подходят для таких задач, причём достаточно много используются по прямому назначению, поэтому вы их блокировать, скорее всего, не будете. Хотя, если так подумать, то и VPN-протоколы используются для создания, собственно, виртуальных приватных сетей, из сервисов, например....

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

Здесь важно понимать, что вполне возможно отслеживать количество трафика, его паттерны и т.п. Конечно же, это становится дороже и дороже по мере усложнения алгоритмов, но дает гораздо больше возможностей выявления подозрительных соединений и IP адресов.

Типичный паттерн трафика download при просмотре видео на YouTube
Типичный паттерн трафика download при просмотре видео на YouTube

Например, зная, что по SSH, как правило, не передается много данных, можно смело ограничивать скорость соединений до килобайт в секунду.

Ещё интересно то, что вам не обязательно создавать правила отдельно для каждого протокола. Достаточно просто собрать все существующие "хорошие" протоколы и провести анализ структуры их пакетов, дабы выявить общие признаки. Вроде «несколько байт, попадающих в диапазон кодов ASCII в начале запроса». После этого можно блокировать весь трафик, который не имеет ничего общего с "хорошими" протоколами, а затем пропускать "выжившие" пакеты через фильтры на известные "плохие". Чтобы вашим инженерам было легче применить эту стратегию, дайте им ознакомиться с китайским опытом.

Об active probing

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

Помните тест на рефлексы, когда врач бьет вам молоточком в область коленки? Принцип тот же. Вам нужно отправить на подозрительный сервер данные, в надежде вызвать характерный ответ. Это могут быть заранее подготовленные или перехваченные и сохраненные с других соединений пакеты; просто случайный набор данных.

Чтобы защититься, сервер должен быть либо готов к этому, либо фаервол должен блокировать все пакеты с адресов устройств, проводящих active probing. Как реагировать на такие "огороженные" сервера – решать вам.

Китай снова приходит вам на помощь с многолетним опытом.

Endgame: белые списки адресов

В конце концов, вы можете заблокировать доступ ко всем IP адресам и доменам, не внесенным в список одобренных. Теперь вы точно заблокировали доступ к cutecatpictures.meow? Зависит от того, что в этих списках. Например, если вы всё ещё оставили доступ к серверам тех же Cloudflare, Fastly, Akamai и других сетей доставки контента, не вмешиваясь в их внутренние коммуникации, – хитрые пользователи могут воспользоваться этим окошком в мир.

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

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

Заключение

В этой статье мы рассмотрели основные способы ограничения доступа к ресурсам в интернете, способы обхода этих способов ограничения, и способы блокировки способов обхода этих способов ограничения.

Удачи в вашей борьбе с cutecatpictures.meow!

UPD | Тэги:

11
Начать дискуссию