Предупреждение №1: данная статья несет исследовательских характер, не побуждает никого что-либо предпринимать и использовать. Идея основана на личном опыте, а любые совпадения случайны.
Предупреждение №2: в статье не раскрываются тайны Атлантиды, поиска Святого Грааля и иные загадки вселенной, весь материал находится в свободном доступе и возможно не раз был описан на Хабре.
Для тех, кто прочитал предупреждения начнем.
Что такое DPI?
DPI или Deep Packet Inspection — технология накопления статистических данных, проверки и фильтрации сетевых пакетов анализируя не только заголовки пакетов, но и полное содержимое трафика на уровнях модели OSI со второго и выше, что позволяет обнаруживать и блокировать вирусы, фильтровать информацию, не удовлетворяющую заданным критериям.
Существует два типа подключения DPI, которые описаны ValdikSS на github:
Пассивный DPI
DPI, подключенный в провайдерскую сеть параллельно (не в разрез) либо через пассивный оптический сплиттер, либо с использованием зеркалирования исходящего от пользователей трафика. Такое подключение не замедляет скорость работы сети провайдера в случае недостаточной производительности DPI, из-за чего применяется у крупных провайдеров. DPI с таким типом подключения технически может только выявлять попытку запроса запрещенного контента, но не пресекать ее. Чтобы обойти это ограничение и заблокировать доступ на запрещенный сайт, DPI отправляет пользователю, запрашивающему заблокированный URL, специально сформированный HTTP-пакет с перенаправлением на страницу-заглушку провайдера, словно такой ответ прислал сам запрашиваемый ресурс (подделывается IP-адрес отправителя и TCP sequence). Из-за того, что DPI физически расположен ближе к пользователю, чем запрашиваемый сайт, подделанный ответ доходит до устройства пользователя быстрее, чем настоящий ответ от сайта.
Активный DPI
Активный DPI — DPI, подключенный в сеть провайдера привычным образом, как и любое другое сетевое устройство. Провайдер настраивает маршрутизацию так, чтобы DPI получал трафик от пользователей к заблокированным IP-адресам или доменам, а DPI уже принимает решение о пропуске или блокировке трафика. Активный DPI может проверять как исходящий, так и входящий трафик, однако, если провайдер применяет DPI только для блокирования сайтов из реестра, чаще всего его настраивают на проверку только исходящего трафика.
От типа подключения зависит не только эффективность блокирования трафика, но и нагрузка на DPI, поэтому существует возможность не проверять весь трафик, а только определенный:
«Обычный» DPI
Под «обычным» DPI понимается такой DPI, который фильтрует определенный тип трафика только на самых распространенных портах для этого типа. Например, «обычный» DPI выявляет и блокирует запрещенный HTTP-трафик только на порту 80, HTTPS-трафик на порту 443. Данный тип DPI не будет отслеживать запрещенный контент, если вы отправите запрос с заблокированным URL на незаблокированный IP или нестандартный порт.
«Полный» DPI
В отличие от «обычного» DPI, данный тип DPI классифицирует трафик вне зависимости от IP-адреса и порта. Таким образом, заблокированные сайты не будут открываться, даже если вы используете прокси-сервер на совершенно другом порту и незаблокированном IP-адресе.
Использование DPI
Чтобы не снижать скорость передачи данных требуется использовать «Обычный» пассивный DPI, который позволяет эффективно? блокировать любые? ресурсы, по умолчанию конфигурация выглядит так:
- HTTP фильтровать только на 80 порту
- HTTPS только на 443 порту
- BitTorrent только на 6881-6889 портах
Но проблемы начинаются, если ресурс будет использовать другой порт, чтобы не терять пользователей, тогда придется проверять каждый пакет, для примера можно привести:
- HTTP работает на 80 и 8080 порту
- HTTPS на 443 и 8443 порту
- BitTorrent на любом другом диапазоне
Из-за этого придется либо перейти на «Активный» DPI, либо использовать блокирование с помощью дополнительного DNS-сервера.
Блокирование с помощью DNS
Одним из способов заблокировать доступ к ресурсу является перехват DNS-запроса с помощью локального DNS-сервера и возвращение пользователю IP-адреса “заглушки”, а не требуемого ресурса. Но это не дает гарантированный результат, так как существует возможность предотвратить подмену адреса:
Вариант 1: Редактирование файла hosts (для десктопа)
Файл hosts является неотъемлемой частью любой операционной системы, что позволяет всегда использовать его. Для доступа к ресурсу пользователю надо:
- Узнать IP-адрес требуемого ресурса
- Открыть на редактирование файл hosts (требуются права администратора), расположенный в:
- Linux: /etc/hosts
- Windows: %WinDir%\System32\drivers\etc\hosts
- Добавить строку в формате: <ip-адрес> <имя ресурса>
- Сохранить изменения
Преимущество данного метода — его сложность и требования наличие прав администратора.
Вариант 2: DoH (DNS over HTTPS) или DoT (DNS over TLS)
Данные методы позволяют защитить от подмены DNS-запрос с помощью шифрования, но реализация поддерживается не всеми приложениями. Рассмотрим простоту настройки DoH для Mozilla Firefox версии 66 со стороны пользователя:
- Перейти по адресу about:config в Firefox
- Подтвердить, что пользователь принимает на себя весь риск
- Изменить значение параметра network.trr.mode на:
- 0 — отключить TRR
- 1 — автоматический выбор
- 2 — включить DoH по умолчанию
- Изменить параметр network.trr.uri выбрав DNS-сервер
- Cloudflare DNS: mozilla.cloudflare-dns.com/dns-query
- Google DNS: dns.google.com/experimental
- Изменить параметр network.trr.boostrapAddress на:
- Если выбран Cloudflare DNS: 1.1.1.1
- Если выбран Google DNS: 8.8.8.8
- Изменить значение параметра network.security.esni.enabled на true
- Проверить правильность настройки с помощью сервиса Cloudflare
Хотя данный способ более сложный, он не требует наличия прав администратора у пользователя, а также существует множество других способов защиты DNS-запроса, не описанных в данной статье.
Вариант 3 (для мобильный устройств):
Использование приложения от Cloudflare для Android и IOS.
Тестирование
Для проверки отсутствия доступа к ресурсам был временно выкуплен домен, заблокированный на территории РФ:
- Проверка HTTP + 80 порт
- Проверка HTTP + 8080 порт
- Проверка HTTPS + 443 порт
- Проверка HTTPS + 8443 порт
Заключение
Надеюсь, данная статья будет полезна и сподвигнет не только администраторов более подробно разбираться в теме, но и даст понимание, что ресурсы всегда будут на стороне пользователя, а поиск новых решений должен быть для них неотъемлемой частью.
Полезные ссылки
P.S. Пока это первый провайдер, правильно блокирующий ресурсы.
Комментарии (7)
svsd_val
24.05.2019 11:55Если мне не изменят память помню что полный DPI не умеет HTTPS трафик смотреть (для этого ему нужно иметь корневой сертификат), так что если Вы будете использовать прокси сервер с HTTPS то обход будет работать.
KonstantinXD Автор
24.05.2019 12:02DPI смотрит только поле SNI в «HTTPS» и на основе его блокирует доступ.
Теоретически включение ESNI (шифрование SNI) должно помогать обходить блокировку, но практически не работает (вероятнее всего из-за даунгрейда TLSv1.3 до TLSv1.2).
Sly_tom_cat
24.05.2019 13:43Ну ничего такой велосипед…
Вот готовый трактор: github.com/ValdikSS/blockcheckKonstantinXD Автор
24.05.2019 13:51Ссылка на данный «трактор» указана в статье и мой провайдер все равно блокирует доступ по SNI, но все зависит от региона)
В данном же случае рассматривается ситуация, когда со стороны пользователя требуется только добавить :port в адрес, либо перейти по готовой ссылке.
Не в темуЕсли статья зайдет, то напишу как сделать реальные «велосипеды» XD
Hidevs
У меня открываются на не стандартных портах
KonstantinXD Автор
Видимо даже у одного оператора различаются настройки оборудования. Теле2 был проверен только в своем регионе, а вот другие операторы в нескольких.