Про Reality обычно пишут одно и то же: «маскируется под HTTPS, поэтому не блокируется». Это верно ровно настолько, насколько верно «самолёт летит, потому что у него крылья». Ниже - разбор того, что именно происходит в первые 200 миллисекунд соединения, почему подмена работает и в каких случаях она перестаёт работать.
Проблема, которую решает Reality
Любой VPN-протокол должен как-то договориться с сервером о ключах. Этот первый обмен - рукопожатие - идёт до того, как шифрование заработало, и потому виден системе фильтрации целиком.
Дальше начинается неприятное. У каждого протокола рукопожатие имеет узнаваемую форму:
- OpenVPN начинает с пакета, где первый байт - код операции
P_CONTROL_HARD_RESET_CLIENT. Его видно без всякой расшифровки. - WireGuard шлёт первым сообщением 148 байт фиксированной структуры с типом
0x01. Достаточно посмотреть на длину и первый байт. - IKEv2/IPsec ходит по выделенным портам 500 и 4500 - их блокируют целиком, даже не разбирая содержимое.
- Shadowsocks формально выглядит как случайный шум. Но настоящий интернет-трафик шумом не бывает: поток с равномерным распределением байт и без TLS-заголовка сам по себе аномалия, и её ловят статистикой.
То есть спрятать содержимое недостаточно. Нужно, чтобы соединение выглядело как что-то обыкновенное. Reality решает именно эту задачу.
Что происходит при подключении по шагам
Когда ваше приложение подключается к серверу с Reality, сценарий такой:
- Клиент открывает TCP-соединение на 443-й порт - тот же, на котором работает весь HTTPS в интернете.
- Клиент отправляет
ClientHelloи указывает в поле SNI не адрес VPN-сервера, а чужой настоящий домен - например, крупный зарубежный сайт с безупречной репутацией. - Сервер с Reality в этот момент делает главный трюк. Он сам идёт на этот настоящий сайт, забирает у него подлинный TLS-сертификат и отдаёт его вам в
ServerHello. - Система фильтрации на пути видит: соединение на 443, SNI указывает на легитимный сайт, сертификат этого сайта настоящий, подписан настоящим удостоверяющим центром, цепочка сходится. Никаких претензий.
- Внутри уже установленного TLS-канала клиент и сервер по заранее известному ключу распознают друг друга, и дальше по этому каналу идёт ваш VPN-трафик.
Тонкость, из-за которой всё это вообще имеет смысл: если к серверу постучится не клиент Reality - скажем, сканер, проверяющий, не VPN ли это, - сервер молча проксирует его на тот самый настоящий сайт. Сканер увидит настоящий сайт и уйдёт ни с чем. Отличить одно от другого без приватного ключа невозможно.
Почему это не подделка сертификата. Сервер не выпускает поддельный сертификат и не подписывает ничего от чужого имени - он пересылает подлинный, публично доступный сертификат, который и так отдаёт любому желающему настоящий сайт. Подмены удостоверяющего центра здесь нет, поэтому браузерные проверки не срабатывают и в логах ничего подозрительного не появляется.
Чем Reality отличается от предыдущих попыток
Маскировать VPN под HTTPS пробовали и раньше. Разница в деталях, и она решающая.
| Подход | Как маскируется | Почему ловится |
|---|---|---|
| VMess + TLS | Свой домен и свой сертификат Let's Encrypt | Домен молодой, трафика мало, сертификат выпущен неделю назад - домен уходит в блок целиком |
| Trojan | Свой домен, при неудаче отдаёт заглушку | То же самое: сервер обслуживает один-единственный домен, за которым нет реального сайта |
| Shadowsocks | Никак, трафик под случайный шум | Отсутствие структуры само по себе примета |
| Reality | Чужой сертификат чужого популярного домена | Заблокировать значит заблокировать настоящий крупный сайт |
Вот в этом и суть. У всех предыдущих схем блокировка ничего не стоила: закрыли неизвестный домен - и всё. С Reality цена ошибки для фильтрующей стороны - обвал настоящего популярного ресурса, которым пользуются миллионы. Это принципиально другой расклад.
XTLS Vision: зачем нужен ещё один слой
Если завернуть TLS внутрь TLS, получится двойное шифрование: данные шифруются один раз внутри туннеля и ещё раз снаружи. Это лишняя работа процессора и, что важнее для DPI, характерная картина размеров пакетов - «TLS в TLS» опознаётся статистически, даже когда содержимое недоступно.
XTLS Vision это чинит. Он распознаёт, что внутри туннеля уже идёт зашифрованный TLS-поток, и после установки соединения перестаёт шифровать его повторно, просто копируя байты. Результат - меньше нагрузка на процессор (заметно на слабых роутерах и телефонах) и отсутствие двойной подписи. В конфигурации это выглядит как flow: xtls-rprx-vision.
Транспорт: TCP, gRPC или XHTTP
Reality отвечает за маскировку рукопожатия, но данные внутри можно возить по-разному, и в российских сетях это влияет на стабильность сильнее, чем кажется.
| Транспорт | Сильная сторона | Где проседает |
|---|---|---|
| TCP + Vision | Минимальные накладные расходы, лучший потолок скорости | Чувствителен к потерям: одна потеря тормозит весь поток |
| gRPC | Хорошо переживает нестабильные мобильные сети, легко мультиплексируется | Выше задержка на установку, чуть больше служебных данных |
| XHTTP | Выглядит как обычные HTTP-запросы, лучше всех проходит через прокси и кривые LTE-сети | Требует аккуратной настройки, иначе ломается на ровном месте |
Грабли из практики. У XHTTP есть параметр xPaddingBytes - диапазон случайного «мусора», добавляемого к запросам, чтобы сбить статистику по размерам. Если диапазон на сервере уже клиентского по умолчанию (100-1000 байт), сервер начинает отвечать HTTP 400 на часть запросов. Со стороны пользователя это выглядит как «VPN подключился, но интернета нет» - и диагностируется мучительно, потому что все ключи верные и порт открыт. Мы напоролись на это при настройке собственного узла: лечится расширением серверного диапазона так, чтобы он перекрывал клиентский.
Где Reality всё-таки виден
Честный раздел, которого обычно нет в обзорах. Reality не всесилен, и понимать его границы полезно.
- Аномальный объём. Скачать 50 ГБ «с сайта, который обычно отдаёт пару мегабайт» - статистическая аномалия. Само по себе это не блокировка, но повод для внимания.
- Длительность сессии. Обычный визит на сайт длится минуты. Соединение, живущее сутками, выделяется. Хорошие клиенты периодически переустанавливают соединение именно поэтому.
- Плохой выбор маскировочного домена. Если домен недоступен из России или сам заблокирован, соединение к нему выглядит подозрительно уже потому, что его в принципе не должно быть. Домен обязан быть живым, зарубежным, популярным и доступным.
- Всплеск на один IP. Когда тысяча абонентов одного оператора вдруг идёт на один и тот же адрес, адрес привлекает внимание независимо от протокола. Лечится размазыванием пользователей по узлам.
- Активное зондирование. Фильтрующая сторона может сама постучаться на подозрительный адрес и посмотреть на ответ. Reality это переживает - отдаёт настоящий сайт, - но только если настроен правильно. Кривая настройка выдаёт узел мгновенно.
Ни один из этих пунктов не про криптографию. Все - про эксплуатацию. Поэтому качество VPN на Reality определяется не тем, что в описании написано «Reality», а тем, насколько аккуратно администратор ведёт узлы.
Что Reality не делает
Три частых заблуждения:
- Не делает вас анонимным. Провайдер видит, что вы установили соединение, видит адрес и объём. Он не видит, что это VPN и что внутри. Это разные вещи.
- Не защищает от того, кто держит сервер. Выходной узел видит ваш трафик ровно так же, как любой VPN-сервер. Reality - про незаметность на пути, не про недоверие к оператору сервиса.
- Не ускоряет интернет. Скорость упирается в ваш канал и в маршрут до выходного узла. Как это выглядит в цифрах - мы замерили на своих серверах.
Как это выглядит у нас
Мы держим сеть узлов в Нидерландах, Швеции, США и Польше плюс отдельный входной узел в России, и все они работают на VLESS Reality с XTLS Vision. Пользователю ничего из вышеописанного настраивать не нужно: параметры маскировки, транспорт и ротация уже зашиты в ссылку подписки, а приложение забирает актуальный список серверов само. Если мы меняем узел или добавляем новый, он появляется в приложении без каких-либо действий с вашей стороны.
Как подключиться - по шагам расписано в инструкциях для iPhone, Android, Windows и Mac.
Частые вопросы
Нет. VLESS - это транспортный протокол (что и как передаётся внутри туннеля), Reality - способ замаскировать TLS-рукопожатие снаружи. Их используют вместе, поэтому в приложениях конфигурация подписана «VLESS Reality», но это два разных слоя.
По содержимому рукопожатия - практически нет: оно математически неотличимо от обращения к настоящему сайту, чей сертификат заимствован. По поведению - иногда да: если вы качаете 40 ГБ «с сайта банка», это аномалия. Именно поэтому важен разумный выбор маскировочного домена.
С точки зрения шифрования они сопоставимы: Reality опирается на стандартный TLS 1.3 с X25519. С точки зрения незаметности Reality сильно впереди - OpenVPN распознаётся DPI по первому же пакету рукопожатия.
Reality требует сервера, который вы контролируете, и аккуратной настройки: ошибка в параметрах маскировки делает узел заметнее обычного VPN. Массовые коммерческие VPN на готовых приложениях не могут это раздать одной кнопкой.