Про 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 на готовых приложениях не могут это раздать одной кнопкой.