Привет, Хабр! На протяжении последнего года регуляторы значительно усилили блокировку VPN-протоколов. Если совсем давно основной метод сводился к блокировке IP-адресов известных VPN-провайдеров, то сейчас везде применяется глубокий анализ трафика (DPI), позволяющий идентифицировать и блокировать VPN-соединения на уровне протокола.
Сегодня разберемся, как блокируют OpenVPN и WireGuard.
Уточнение
Стоит уточнить, что в России блокируются только зарубежные соединения к этим протоколам. VPN до сервера внутри страны работает, а тот же VPN до сервера в Германии - блокируется. Это позволяет не ломать корпоративные VPN внутри страны, но отрезает выход наружу.
Раньше всех пишем о новых блокировках в России в нашем телеграм
Как работает OpenVPN

(странная картинка)
Для понимания механизмов блокировки стоит немного вспомнить, как протокол устанавливает соединение.
OpenVPN, по сути, создаёт туннель в два этапа: сначала поднимается защищённый контрольный канал через TLS, затем внутри него согласовываются ключи для шифрования данных.
Клиент отправляет init-пакет с опкодом
0x38(P_CONTROL_HARD_RESET_CLIENT_V2)Сервер отвечает своим хардресетом
Происходит TLS-хендшейк - клиент шлёт ClientHello со списком поддерживаемых шифров
Стороны обмениваются ключами по TLS сессии и трафик начинает идти
И вот здесь сразу появляется несколько узких мест:
Первое и самое очевидное - опкоды в заголовке. Первый байт каждого пакета OpenVPN содержит тип сообщения. Эти значения фиксированы в спецификации: 0x38 для инициализации, 0x20 для данных и так далее. DPI достаточно посмотреть на первый байт, чтобы заподозрить использование OpenVPN.
Второе, по чему палится протокол - характерный TLS. OpenVPN использует TLS, но не притворяется браузером. Набор поддерживаемых шифров и порядок их перечисления очень сильно отличается от тех, что отправляют Chrome или Firefox. Получается уникальный TLS-отпечаток.
Как блокируют OpenVPN
Теперь о том, как всё это используется для блокировки.
Сигнатурный анализ.
Самый понятный и прямолинейный метод детекта для DPI - анализ пакетов и поиск в них характерных байтов в начале.
При таком анализе, наличие опкода 0x38 на первой позиции UDP-пакета или в начале TCP-потока - это сразу флаг, что пакет может использоваться протоколом. Внутри пакета, в зависимости от агрессивности DPI в регионе, проверяют структуру пакета, длину полей, корректность значений.
TLS Fingerprinting
Второй фактор, используемый для блокировки - анализ TLS-отпечатка пакета. Более продвинутый метод.
DPI анализирует ClientHello и сравнивает отпечаток с базой известных. Если отпечаток не совпадает ни с одним популярным браузером - пакет блокируется. При этом неважно, что там внутри TLS-сессии: сам факт нестандартного хендшейка выдаёт протокол.
Поведенческий анализ
Окей, вы можете вполне резонно возразить: так я повешу OpenVPN на 443 порт, и что ты мне сделаешь?
Здесь стоит помнить о том, что DPI могут использовать постоянный анализ пакетов на наличие подозрительных признаков. Даже при попытках маскировки вашего сервера поведенческие паттерны протокола остаются.
Взять те же KeepAlive-пакеты: OpenVPN поддерживает постоянное соединение, регулярно отсылая пакеты фиксированного размера на сервер. Это не очень похоже на обычный веб-сёрфинг.
На практике же все эти методы комбинируются. Если DPI видит, что какой-то клиент отправляет одни и те же пакеты, шифрованные при помощи кастомного TLS, не похожего на браузерный, да еще и с опкодами, характерными VPN.
Такой пакет, конечно, будет ЛИКВИДИРОВАН.
Как работает WireGuard

Перейдём к другому протоколу.
WireGuard появился сильно позже OpenVPN, и изначально создавался для максимально быстрой работы протокола, с упором на производительность и чистоту кода.
Весь протокол состоит буквально из 4000 строк кода против 100 000+ у OpenVPN.
Минимум настроек, один набор криптографии (Curve25519, ChaCha20, Poly1305), а обе стороны заранее знают ключи друг друга. Что может быть лучше для скорости протокола и скорости детекта его при помощи DPI?
Хендшейк WG выглядит примерно так:
Клиент отправляет Handshake Initiation, всегда состоящий из ровно 148 байт
Сервер отвечает Handshake Response, всегда ровно 92 байта
??
profit!
Красота! Всего четыре типа сообщений, фиксированные размеры, предсказуемая структура, а первые 4 байта каждого пакета - это тип сообщения: 0x01000000 для инициализации и0x02000000 для ответа. И все это добро работает только поверх UDP.
Создатели WireGuard и не ставили задачу противостоять DPI. Протокол разрабатывался для скорости, простоты аудита и надёжной криптографии. А устойчивость к блокировкам никто и не задумывал. И это честный выбор, но он делает WireGuard буквально крякми для DPI-спецов.
Как блокируют WireGuard
Думаю, ответ очевиден из вышеперечисленного
Провайдер просто блокирует все UDP пакеты по соответствующим сигнатурам: фиксированный размер секций в пакете позволяет почти идеально точно опознать хендшейк.
Кроме того, он всегда начинается с 0x01, будто специально сделанный для того, чтобы уменьшить количество false-positive'ов у DPI.
В сравнении с OpenVPN, WG даже не позволяет косить под HTTPS трафик, ведь просто не позволяет использовать TCP.
Просуммируем:
OpenVPN | WireGuard | |
|---|---|---|
Методы детекта | TLS fingerprinting + опкоды | Фиксированные размеры пакетов |
Транспорт | UDP или TCP | Только UDP |
Порт 443 под HTTPS | Можно, но палится по TLS | Невозможно |
Вариативность | Много режимов и настроек | Один режим, одна криптография |
Собственно да, WireGuard блокируется быстрее и надёжнее просто потому, что очень предсказуем.
Методы обхода и методы обхода обхода
Раз стандартные протоколы детектируются, появились инструменты обфускации.
Для WireGuard это обёртки вроде AmneziaWG или swgp-go. Хочется подробнее разобрать проблему второго протокола.
Идея swgp-go была в маскировке WG среди кучи рандомного шума. И некоторые страны его заблокировали, просто «посчитав» отпечаток для этого протокола.
Сделали это так: в DPI добавили правило, считающее количество нулей и единиц в байтах пакета. И если соотношение их количества в пакете примерно одинаково, то это серьезная аномалия, которой не может быть в легитимных протоколах (типа HTTPS).
Это называется анализом энтропии пакета, и применяется для большого количества таких «оберток» вокруг VPN-протоколов.
Honorable mentions
Среди других методов детектирования - Active Probing. Серверы регулятора отправляет запросы на подозрительный сервер, ранее помеченный по другим аномалиям. Если сервер отвечает как VPN или не отвечает так, как должен отвечать легитимный веб-сервер, а сам при этом прячется под 443 портом - соединения к нему на время блокируются.
А уж если бот найдет на адресе впн-панельку то все, прощай, сервачок ;( Сообщение об ужасной технологии на вашем сервере уже летит вашему провайдеру.
Месяц назад, например, AEZA заблокировала несколько серверов своих клиентов, на которых стояли VPN по просьбе РКН
И хорошо, если регулятор не введет Машинное обучение и классификаторы, которые будут учится на паттернах трафика. В таком случае даже если обфускация обманывает статические правила, ML-модель может поймать аномалию по совокупности признаков. А, ой...
Пишем обо ВСЕХ новых блокировках в России раньше всех в нашем телеграм
Последнее время у VLESS проблемы, так что подписывайтесь на наш телеграм, чтобы ничего не пропустить