Skip to content

VMess — Xray-core

VMess — классический протокол V2Ray, работающий только с AEAD. Xray-core поддерживает только AEAD-вариант — устаревший режим MD5-AEAD на основе alterId удалён. При запуске среда выполнения выводит уведомление об устаревании с рекомендацией перейти на шифрование VLESS (infra/conf/vmess.go:65, 124).

Входящий

settings для входящего с "protocol": "vmess":

ПолеТипПо умолчаниюДопустимые значенияОписание
users[]json.RawMessage<user object array> | …Список учётных записей входящего; та же форма объекта, что и у `clients`. `users` — более новое имя, появившееся в свежих версиях Xray и принимаемое наряду с `clients`.
clients[]json.RawMessage(required)<user object array>Список принимаемых пользователей. Каждая запись содержит поля учётной записи VMess (id, security, experiments) плюс общие пользовательские поля (email, level).
default*VMessDefaultConfig(unset)VMessDefaultConfigРезервные настройки пользователя, применяемые, когда входящее соединение не совпало ни с одним настроенным клиентом. Сегодня существует только поле `level`.

Исходный код: infra/conf/vmess.go:57-61 · зафиксировано на v26.7.28 (5ca6f4b)

default

ПолеТипПо умолчаниюДопустимые значенияОписание
levelbyte0<byte>Уровень политики, применяемый к резервным пользователям.

Исходный код: infra/conf/vmess.go:46-48 · зафиксировано на v26.7.28 (5ca6f4b)

clients[] — объект пользователя

Каждая запись clients[] — это VMessAccount плюс общие пользовательские поля (email, level):

ПолеТипПо умолчаниюДопустимые значенияОписание
idstring(required)<UUID>UUID пользователя. Каноническая форма 8-4-4-4-12 или hex без дефисов. При загрузке разбирается и приводится к канонической форме.
securitystringautoauto | aes-128-gcm | chacha20-poly1305Симметричный шифр полезной нагрузки VMess. `auto` выбирает AES-GCM на x86 с AES-NI и ChaCha20 в остальных случаях. Нераспознанные значения молча откатываются к `auto`.
experimentsstring(unset)<string>Разделённые запятыми флаги экспериментов, передаваемые в протокол. В protobuf передаются как `TestsEnabled`.

Исходный код: infra/conf/vmess.go:18-22 · зафиксировано на v26.7.28 (5ca6f4b)

Исходящий

settings для исходящего с "protocol": "vmess":

ПолеТипПо умолчаниюДопустимые значенияОписание
address*Address(unset)<host>Упрощённая форма — имя хоста или IP сервера. Если задано, `vnext` строится внутренне.
portuint16(required with address)<port>Порт сервера (упрощённая форма).
leveluint320<uint32>Уровень пользователя (упрощённая форма).
emailstring(unset)<string>Идентификатор пользователя, отображаемый в статистике.
idstring(required with address)<UUID>UUID пользователя (упрощённая форма).
securitystringautoauto | aes-128-gcm | chacha20-poly1305Тот же набор шифров, что и у клиентов входящего.
experimentsstring(unset)<string>Флаги экспериментов, передаваемые серверу.
vnext[]*VMessOutboundTarget(use simplified shape)[{address,port,users:[user]}]Полная форма — должна содержать ровно один сервер с ровно одним пользователем.

Исходный код: infra/conf/vmess.go:111-120 · зафиксировано на v26.7.28 (5ca6f4b)

Упрощённая форма vs. vnext

Исходящий принимает либо упрощённую форму (address, port, id, security, ...), либо полную форму vnext. Упрощённая форма переписывается в массив vnext из одного элемента (infra/conf/vmess.go:127-135). Полная форма должна содержать ровно один сервер с ровно одним пользователем — для нескольких конечных точек используйте несколько исходящих VMess и балансировщик маршрутизации.

Примеры

Минимальный входящий:

json
{
  "inbounds": [
    {
      "tag": "vmess-in",
      "listen": "0.0.0.0",
      "port": 443,
      "protocol": "vmess",
      "settings": {
        "clients": [
          { "id": "a3482e88-686a-4a58-8126-99c9df64b7bf", "email": "alice", "security": "auto" }
        ]
      },
      "streamSettings": { "network": "tcp", "security": "tls" }
    }
  ]
}

Упрощённый исходящий:

json
{
  "outbounds": [
    {
      "tag": "vmess-out",
      "protocol": "vmess",
      "settings": {
        "address": "example.com",
        "port": 443,
        "id": "a3482e88-686a-4a58-8126-99c9df64b7bf",
        "security": "auto"
      },
      "streamSettings": { "network": "ws", "security": "tls", "wsSettings": { "path": "/vm" } }
    }
  ]
}

Примечания

  • VMess в Xray — только AEAD. В структуре конфигурации нет поля alterId. В конфигурациях, перенесённых из V2Ray с "alterId": <n>, это поле следует убрать; новые клиент и сервер всё равно отклонят устаревший режим MD5-AEAD.
  • security: "auto" — безопасное умолчание: AES-GCM на платформах с AES-NI, иначе ChaCha20-Poly1305. Неизвестные строки security молча откатываются к auto (infra/conf/vmess.go:34-35).
  • Устаревшие значения безопасности none и zero удалены из парсера — конфигурации, которые их всё ещё содержат, теперь молча получают auto.
  • Уведомление об устаревании («VMess (with no Forward Secrecy, etc.)») печатается при каждой загрузке входящего или исходящего VMess (infra/conf/vmess.go:65, 124). Рекомендуемая замена — VLESS с новым шифрованием mlkem768x25519plus.

Сравнение с другими ядрами

  • sing-box использует users[].uuid вместо clients[].id и предоставляет опции alter_id (snake_case), global_padding и authenticated_length, которые Xray больше не поддерживает. См. VMess — sing-box.
  • mihomo имеет единую форму объекта прокси, использует имя поля cipher для выбора шифра и выносит на исходящий переключатели кодирования UDP (xudp, packet-addr, packet-encoding). См. VMess — mihomo.

Исходный код: infra/conf/vmess.go:18-120 · v26.7.28 (5ca6f4b)

Core Tutorial от Argsment