📮 VMess: протокол V2Ray, который проиграл собственному наследнику

О чём заметка

Разбор протокола VMess — основного протокола V2Ray, который в 2010-х был стандартом обхода блокировок, а сегодня почти вытеснен VLESS. Здесь: как он устроен, что означает загадочное поле alterId, какие уязвимости в нём находили и стоит ли его использовать в 2026 году. Карта протоколов целиком — в обзоре.

TL;DR

  • VMess — протокол проекта V2Ray: пользователь опознаётся по UUID, каждое соединение шифруется, а в заголовке передаются время, случайные данные и адрес назначения.
  • Ключевая идея времён создания — привязка к времени: заголовок аутентифицировался хешем от UUID и метки времени, поэтому часы клиента и сервера должны совпадать (расхождение больше пары минут ломает подключение).
  • alterId — рудимент старой схемы с «дополнительными идентификаторами». В современных реализациях он должен быть 0, что включает VMess AEAD — правильный режим аутентификации заголовка.
  • Старый режим (alterId больше нуля, аутентификация на MD5) объявлен устаревшим, а в Xray-core поддержку старой схемы убрали вовсе.
  • В 2020 году в реализации V2Ray нашли уязвимость к активному зондированию: по реакции сервера можно было опознать VMess. Проблему закрыли переходом на AEAD-заголовки.
  • Сегодня VMess держат в основном ради совместимости со старыми серверами. Для новых установок используют VLESS: он проще, быстрее и активно развивается.

Как устроен VMess

VMess появился вместе с V2Ray как замена Shadowsocks — с расширяемым заголовком, поддержкой разных транспортов и учётом пользователей. Соединение выглядит так.

Клиент знает UUID пользователя (строка вида b831381d-6324-4d53-ad4f-8cda48b30811) — это и есть учётные данные. Он формирует заголовок запроса, куда кладёт версию протокола, ключ и вектор инициализации для шифрования данных, выбранный метод шифрования, тип команды (TCP или UDP), адрес назначения и случайную набивку. Заголовок аутентифицируется так, чтобы сервер мог понять «это наш пользователь» ещё до расшифровки полезной нагрузки. Дальше идут зашифрованные данные, разбитые на блоки.

Привязка к времени — характерная деталь: в исходной схеме аутентификатор строился от UUID и текущей метки времени с допуском в несколько десятков секунд. Это давало защиту от повторов, но породило самую известную бытовую проблему протокола: если на клиенте сбились часы, подключение просто не устанавливается. Симптом узнаваемый — сервер жив, ключ верный, а соединение отваливается; проверка системного времени решает вопрос.

Что такое alterId и почему он должен быть 0

alterId — поле, которое до сих пор встречается в старых конфигах и вызывает больше всего вопросов. Исторически оно задавало число дополнительных идентификаторов, порождённых от основного UUID: клиент брал один из них для каждого соединения, чтобы аутентификаторы не повторялись и сервер не мог быть опознан по однообразию заголовков.

Схема оказалась и громоздкой, и уязвимой: аутентификация в ней опиралась на MD5, а сама конструкция давала наблюдателю материал для анализа. Её заменили на VMess AEAD — заголовок аутентифицируется и шифруется современным AEAD-примитивом. Включается это ровно одним способом: alterId: 0.

Правило простое: в 2026 году alterId в конфиге либо равен нулю, либо его нет вовсе. Старый режим (alterId больше нуля) объявлен устаревшим в V2Ray, а Xray-core поддержку прежней MD5-схемы удалил — конфиг с ненулевым alterId там просто не заработает.

Уязвимости и обнаружение

Активное зондирование (2020). В реализации VMess в V2Ray обнаружили уязвимость, позволявшую опознать VMess-сервер активной проверкой: причина была в том, как разбирался зашифрованный заголовок и как реализация реагировала на некорректные данные — по различиям в поведении сервер выдавал себя. Проблему нашли пользователи GitHub p4gefau1t и studentmain; современный режим с AEAD-заголовками ей не подвержен.

Проще говоря: цензору не нужно было расшифровывать трафик — достаточно было постучаться на подозрительный порт особым образом и посмотреть, чем сервер ответит. Это общий приём против прокси-протоколов, и устойчивость к нему сегодня — обязательное требование к дизайну (сравните с логикой Trojan, который на неверный пароль отдаёт настоящий сайт).

Пассивное обнаружение. Как и Shadowsocks, VMess без обёртки не выглядит ничем легальным. Поэтому его почти всегда заворачивают в TLS и транспорт — WebSocket, gRPC, HTTP/2 — чтобы соединение походило на обычный веб-трафик. Но у связки «прокси внутри TLS» есть собственный узнаваемый почерк: шифрованное рукопожатие внутри шифрованного канала даёт характерные размеры и тайминги пакетов. Этот класс детекта разобран в заметке про DPI-почерк TLS — и именно против него придуманы XTLS Vision и AnyTLS.

«Работает» не значит «незаметен»

VMess с корректным AEAD-заголовком криптографически в порядке, и подключение через него устанавливается. Но по устойчивости к современному DPI он проигрывает связкам с REALITY и XTLS Vision, потому что не решает задачу «TLS внутри TLS». Если узел на VMess у вас регулярно отваливается волнами — дело обычно не в сервере, а в том, что схему научились отбирать.

Стоит ли использовать VMess в 2026 году

Практический ответ: для новых установок — нет, для совместимости — да, с оговорками.

Причина вытеснения не в том, что VMess «плохой», а в том, что его наследник делает то же самое дешевле. VLESS сознательно убрал из протокола собственное шифрование и привязку ко времени: раз соединение и так идёт внутри TLS, второй слой шифрования — это лишний расход процессора и лишний слой, который и создаёт заметный почерк. Отсюда и XTLS Vision, и REALITY — они возможны именно потому, что VLESS не шифрует данные повторно.

Если VMess у вас всё же используется, минимальный набор требований такой:

  • alterId: 0 — то есть режим AEAD; ненулевое значение означает мёртвую MD5-схему.
  • Актуальная версия ядра на клиенте и сервере — старые сборки несут исправленные с тех пор ошибки реализации.
  • Обёртка TLS плюс транспорт (WS/gRPC/HTTP2) — голый VMess в сети с DPI живёт недолго.
  • Синхронные часы на обеих сторонах.

📚 См. также


🤖 Эти статьи открыты — можно обучать на них ИИ

При желании вы можете натренировать ИИ на наших статьях. Исходное форматирование и скачивание всего репозитория одним zip-архивом доступны в Forgejo: исходник этой заметки · весь репозиторий.