Skip to content

VMess — mihomo

mihomo поддерживает VMess с обеих сторон. Форма исходящего несёт все транспорты (ws, http, h2, grpc), TLS, REALITY, ECH и два переключателя расширений аутентификации. Входящий сознательно проще — список пользователей находится прямо на слушателе.

Исходящий

Запись в proxies: с type: vmess. Структура встраивает BasicOption (общие поля исходящих: interface-name, routing-mark, ip-version, dialer-proxy, …).

ПолеТипПо умолчаниюДопустимые значенияОписание
namestring(required)<string>Уникальное имя прокси.
serverstring(required)<host>Имя хоста или IP вышестоящего сервера.
portint(required)<port>Порт вышестоящего сервера.
uuidstring(required)<UUID>UUID пользователя, принимаемый сервером.
alterIdint00 | <int>Совместимость с устаревшим MD5-AEAD. Для современного режима «только AEAD» оставьте 0.
cipherstringautoauto | aes-128-gcm | chacha20-poly1305 | none | zeroСимметричный шифр. Название mihomo для `security`.
udpboolfalsetrue | falseРазрешить ретрансляцию UDP-пакетов через этот исходящий.
networkstringtcptcp | ws | http | h2 | grpc | mekya | mkcpНижележащий транспорт. `mekya` и `mkcp` (псевдоним `kcp`) берут свои настройки из `mekya-opts` / `mkcp-opts`.
tlsboolfalsetrue | falseОбернуть поток в TLS.
alpn[]string[]h2 | http/1.1Список ALPN, предлагаемый при TLS-рукопожатии.
skip-cert-verifyboolfalsetrue | falseОтключить проверку TLS-сертификата (только для тестов).
name-cert-verifystring(unset)<hostname>Проверять сертификат сервера по этому имени хоста вместо SNI.
fingerprintstring(unset)<SHA256 hex>Закрепить TLS-сертификат сервера за этим отпечатком SHA-256.
certificatestring(unset)<PEM file path>Клиентский сертификат (mTLS).
private-keystring(unset)<key file path>Закрытый ключ, соответствующий `certificate`.
servernamestring(unset)<SNI>Переопределить TLS SNI.
ech-optsECHOptions(disabled)ECHOptionsКонфигурация Encrypted Client Hello.
shadow-tls-optsShadowTLSOptions(disabled)ShadowTLSOptionsБлок маскировки Shadow-TLS (`{ password, version }`). На каждый прокси можно включить только один блок TLS-маскировки.
restls-optsRestlsOptions(disabled)RestlsOptionsБлок маскировки Restls (`{ password, version-hint, restls-script }`). На каждый прокси можно включить только один блок TLS-маскировки.
jls-optsJLSOptions(disabled)JLSOptionsБлок маскировки JLS (`{ username, password }`). На каждый прокси можно включить только один блок TLS-маскировки.
reality-optsRealityOptions(disabled)RealityOptionsКлиентская конфигурация REALITY.
tlsmirror-optsTLSMirrorOptions(disabled)TLSMirrorOptionsБлок маскировки TLSMirror, включается заданием его `primary-key`; несёт собственный блок подопций. На каждый прокси можно включить только один блок TLS-маскировки.
mekya-optsMekyaOptions(unset)MekyaOptionsНастройки для `network: mekya` (V2Ray-совместимый Mekya, KCP поверх HTTP-запросов); несёт собственный блок подопций (`url`, `h2-pool-size`, `kcp`, ...).
mkcp-optsMKCPOptions(unset)MKCPOptionsНастройки для `network: mkcp` (V2Ray-совместимый mKCP поверх UDP); несёт собственный блок подопций (`mtu`, `tti`, `seed`, `header`, ...).
http-optsHTTPOptions(unset)HTTPOptionsНастройки для `network: http`.
h2-optsHTTP2Options(unset)HTTP2OptionsНастройки для `network: h2`.
grpc-optsGrpcOptions(unset)GrpcOptionsНастройки для `network: grpc`.
ws-optsWSOptions(unset)WSOptionsНастройки для `network: ws`.
packet-addrboolfalsetrue | falseИспользовать устаревшую кодировку UDP packet-addr.
xudpboolfalsetrue | falseИспользовать кодировку xudp для UDP-пакетов (современный вариант по умолчанию). Взаимоисключимо с packet-addr.
packet-encodingstring(use udp/xudp flags)packetaddr | xudpЯвный селектор кодировки пакетов; при установке переопределяет булевы флаги.
global-paddingboolfalsetrue | falseДополнять все записи до одинаковой длины. Сервер должен использовать ту же настройку.
authenticated-lengthboolfalsetrue | falseИспользовать фрейминг authenticated-length. Сервер должен использовать ту же настройку.
client-fingerprintstring(global)chrome | firefox | safari | ios | edge | random | randomizedОтпечаток client-hello uTLS.

Исходный код: adapter/outbound/vmess.go:53-89 · зафиксировано на v1.19.29 (e26714a)

ws-opts

ПолеТипПо умолчаниюДопустимые значенияОписание
pathstring//<path>Путь WebSocket.
headersmap[string]string{}{<header>: <value>}Дополнительные HTTP-заголовки в запросе апгрейда.
max-early-dataint0<bytes>Максимум байтов ранних данных, буферизуемых до завершения WS-рукопожатия.
early-data-header-namestring(unset)<header name>Заголовок для передачи ранних данных в кодировке base64, когда их ожидает сервер.
v2ray-http-upgradeboolfalsetrue | falseИспользовать транспорт HTTP-upgrade в стиле V2Ray вместо настоящего WebSocket.
v2ray-http-upgrade-fast-openboolfalsetrue | falseОтправлять полезную нагрузку клиента вместе с запросом HTTP-upgrade, экономя один RTT.

Исходный код: adapter/outbound/vmess.go:165-172 · зафиксировано на v1.19.29 (e26714a)

grpc-opts

ПолеТипПо умолчаниюДопустимые значенияОписание
grpc-service-namestring(required)<name>Путь имени gRPC-сервиса.
grpc-user-agentstring(unset)<UA string>Переопределить User-Agent gRPC-клиента.
ping-intervalint0<seconds>Интервал кадров HTTP/2 PING. 0 отключает.
max-connectionsint0<int>Максимум одновременных gRPC-каналов (разветвление mux).
min-streamsint0<int>Минимум потоков на канал до выделения нового канала.
max-streamsint0<int>Максимум потоков на канал.

Исходный код: adapter/outbound/vmess.go:156-163 · зафиксировано на v1.19.29 (e26714a)

Входящий

Запись в listeners: с type: vmess. Встраивает BaseOption (listen, port).

ПолеТипПо умолчаниюДопустимые значенияОписание
users[]VmessUser(required)<VmessUser array>Принимаемые клиенты.
ws-pathstring(unset)/<path>Путь WebSocket, обслуживаемый этим слушателем.
grpc-service-namestring(unset)<name>Имя gRPC-сервиса, принимаемое этим слушателем.
certificatestring(unset)<PEM file path>Серверный TLS-сертификат.
private-keystring(unset)<key file path>Закрытый TLS-ключ.
client-auth-typestring(none)no-client-cert | request-client-cert | require-any-client-cert | verify-client-cert-if-given | require-and-verify-client-certРежим аутентификации клиента mTLS.
client-auth-certstring(unset)<PEM file path>Набор CA, принимаемых как корневые для клиентов.
ech-keystring(unset)<ECH config>Материал Encrypted Client Hello.
shadow-tlsShadowTLS(disabled)ShadowTLSСерверный блок маскировки Shadow-TLS (`{ enable, version, password, users, handshake, ... }`).
res-tlsResTLS(disabled)ResTLSСерверный блок маскировки Restls (`{ enable, dest, password, ... }`); неаутентифицированные клиенты ретранслируются на `dest`.
jls-configJLSConfig(disabled)JLSConfigСерверный блок маскировки JLS (`{ enable, users, sni, dest, ... }`); неаутентифицированные клиенты ретранслируются на `dest`.
reality-configRealityConfig(disabled)RealityConfigСерверная конфигурация REALITY.
tlsmirror-configTLSMirrorConfig(disabled)TLSMirrorConfigСерверный блок маскировки TLSMirror, включается заданием его `primary-key`; несёт собственный блок подопций (`dest`, `proxy`, ...).
mekya-configMekyaConfig(disabled)MekyaConfigСерверный блок (`enable` плюс подопции), принимающий V2Ray-совместимый транспорт Mekya. Несовместим с `mkcp-config`, `ws-path` и `grpc-service-name`.
mkcp-configMKCPConfig(disabled)MKCPConfigСерверный блок (`enable` плюс подопции), принимающий V2Ray-совместимый транспорт mKCP поверх UDP.
mux-optionMuxOption(disabled)MuxOptionНастройки мультиплексирования (sing-style mux).

Исходный код: listener/inbound/vmess.go:12-30 · зафиксировано на v1.19.29 (e26714a)

users[]

ПолеТипПо умолчаниюДопустимые значенияОписание
usernamestring(unset)<string>Отображаемое имя.
uuidstring(required)<UUID>UUID пользователя.
alterIdint00 | <int>Совместимость с устаревшим MD5-AEAD.

Исходный код: listener/inbound/vmess.go:32-36 · зафиксировано на v1.19.29 (e26714a)

Примеры

Исходящий — VMess поверх WebSocket с TLS:

yaml
proxies:
  - name: vmess-ws
    type: vmess
    server: example.com
    port: 443
    uuid: a3482e88-686a-4a58-8126-99c9df64b7bf
    alterId: 0
    cipher: auto
    udp: true
    network: ws
    tls: true
    servername: example.com
    ws-opts:
      path: /vm
      headers:
        Host: example.com

Исходящий — VMess поверх gRPC с REALITY:

yaml
proxies:
  - name: vmess-grpc
    type: vmess
    server: example.com
    port: 443
    uuid: a3482e88-686a-4a58-8126-99c9df64b7bf
    alterId: 0
    cipher: auto
    network: grpc
    tls: true
    servername: www.cloudflare.com
    client-fingerprint: chrome
    reality-opts:
      public-key: <reality public key>
      short-id: <short id>
    grpc-opts:
      grpc-service-name: GunService

Входящий в listeners:

yaml
listeners:
  - name: vmess-in
    type: vmess
    listen: 0.0.0.0
    port: 443
    users:
      - username: alice
        uuid: a3482e88-686a-4a58-8126-99c9df64b7bf
        alterId: 0
    certificate: /etc/mihomo/server.crt
    private-key: /etc/mihomo/server.key

Примечания

  • Исходящий mihomo использует cipher для симметричного алгоритма. И Xray (security), и sing-box (security) называют это поле иначе. mihomo и sing-box принимают auto, aes-128-gcm, chacha20-poly1305, none, zero; Xray-core удалил none / zero в v26.7.x и теперь принимает только первые три (неизвестные значения откатываются к auto).
  • На исходящем есть три разных переключателя кодировки UDP: udp (булев — включает ретрансляцию UDP как таковую), xudp / packet-addr (устаревшие булевы селекторы) и packet-encoding (современный явный селектор). Когда задан packet-encoding, булевы селекторы игнорируются.
  • global-padding и authenticated-length зеркалируют global_padding / authenticated_length из sing-box — обе стороны должны использовать одинаковые значения.
  • ws-opts.v2ray-http-upgrade заменяет WebSocket-рукопожатие транспортом HTTP-upgrade V2Ray; v2ray-http-upgrade-fast-open дополнительно экономит RTT, отправляя полезную нагрузку клиента вместе с запросом.
  • shadow-tls-opts, restls-opts, jls-opts, reality-opts и tlsmirror-opts — взаимоисключающие режимы TLS-маскировки: включайте не более одного, и все они требуют tls: true. Shadow-TLS, Restls и JLS работают только по TCP и отклоняются при network: mkcp. Входящие аналоги shadow-tls, res-tls и jls-config также взаимоисключающи.
  • V2Ray-совместимые транспорты mekya и mkcp несут настройки в отдельных блоках: mekya-opts / mkcp-opts на исходящем, mekya-config / mkcp-config на слушателе. Mekya упаковывает KCP-кадры в пул HTTP-обменов «запрос/ответ»; mKCP гоняет KCP напрямую поверх UDP.

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

  • Xray поддерживает только AEAD и полностью убирает alterId; поле называется security (а не cipher). См. VMess — Xray-core.
  • sing-box сохраняет alterId (на исходящем — alter_id, у пользователей входящего — alterId), использует security вместо cipher и выносит мультиплексирование в отдельный блок multiplex. См. VMess — sing-box.

Исходный код: adapter/outbound/vmess.go:53-172 · v1.19.29 (e26714a)

Core Tutorial от Argsment