В данной статье не рассматривается полная настройка DPI и все вместе связанное, а научная ценность текста минимальна. Но в ней описывается простейший способ обхода DPI, который не учли многие компании.
Предупреждение №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%System32driversetchosts
Добавить строку в формате: <ip-адрес> <имя ресурса>
Сохранить изменения
Преимущество данного метода — его сложность и требования наличие прав администратора.
Вариант 2: DoH (DNS over HTTPS) или DoT (DNS over TLS)
Данные методы позволяют защитить от подмены DNS-запрос с помощью шифрования, но реализация поддерживается не всеми приложениями. Рассмотрим простоту настройки DoH для Mozilla Firefox версии 66 со стороны пользователя:
Хотя данный способ более сложный, он не требует наличия прав администратора у пользователя, а также существует множество других способов защиты DNS-запроса, не описанных в данной статье.
Вариант 3 (для мобильный устройств):
Использование приложения от Cloudflare для Android и IOS.
Тестирование
Для проверки отсутствия доступа к ресурсам был временно выкуплен домен, заблокированный на территории РФ:
Надеюсь, данная статья будет полезна и сподвигнет не только администраторов более подробно разбираться в теме, но и даст понимание, что ресурсы всегда будут на стороне пользователя, а поиск новых решений должен быть для них неотъемлемой частью.
Дополнение вне статьиТест на Cloudflare невозможно пройти в сети оператора Tele2, а правильно настроенный DPI блокирует доступ к тестовой площадке.
P.S. Пока это первый провайдер, правильно блокирующий ресурсы.