VMess — mihomo
mihomo поддерживает VMess с обеих сторон. Форма исходящего несёт все транспорты (ws, http, h2, grpc), TLS, REALITY, ECH и два переключателя расширений аутентификации. Входящий сознательно проще — список пользователей находится прямо на слушателе.
Исходящий
Запись в proxies: с type: vmess. Структура встраивает BasicOption (общие поля исходящих: interface-name, routing-mark, ip-version, dialer-proxy, …).
| Поле | Тип | По умолчанию | Допустимые значения | Описание |
|---|---|---|---|---|
name | string | (required) | <string> | Уникальное имя прокси. |
server | string | (required) | <host> | Имя хоста или IP вышестоящего сервера. |
port | int | (required) | <port> | Порт вышестоящего сервера. |
uuid | string | (required) | <UUID> | UUID пользователя, принимаемый сервером. |
alterId | int | 0 | 0 | <int> | Совместимость с устаревшим MD5-AEAD. Для современного режима «только AEAD» оставьте 0. |
cipher | string | auto | auto | aes-128-gcm | chacha20-poly1305 | none | zero | Симметричный шифр. Название mihomo для `security`. |
udp | bool | false | true | false | Разрешить ретрансляцию UDP-пакетов через этот исходящий. |
network | string | tcp | tcp | ws | http | h2 | grpc | mekya | mkcp | Нижележащий транспорт. `mekya` и `mkcp` (псевдоним `kcp`) берут свои настройки из `mekya-opts` / `mkcp-opts`. |
tls | bool | false | true | false | Обернуть поток в TLS. |
alpn | []string | [] | h2 | http/1.1 | Список ALPN, предлагаемый при TLS-рукопожатии. |
skip-cert-verify | bool | false | true | false | Отключить проверку TLS-сертификата (только для тестов). |
name-cert-verify | string | (unset) | <hostname> | Проверять сертификат сервера по этому имени хоста вместо SNI. |
fingerprint | string | (unset) | <SHA256 hex> | Закрепить TLS-сертификат сервера за этим отпечатком SHA-256. |
certificate | string | (unset) | <PEM file path> | Клиентский сертификат (mTLS). |
private-key | string | (unset) | <key file path> | Закрытый ключ, соответствующий `certificate`. |
servername | string | (unset) | <SNI> | Переопределить TLS SNI. |
ech-opts | ECHOptions | (disabled) | ECHOptions | Конфигурация Encrypted Client Hello. |
shadow-tls-opts | ShadowTLSOptions | (disabled) | ShadowTLSOptions | Блок маскировки Shadow-TLS (`{ password, version }`). На каждый прокси можно включить только один блок TLS-маскировки. |
restls-opts | RestlsOptions | (disabled) | RestlsOptions | Блок маскировки Restls (`{ password, version-hint, restls-script }`). На каждый прокси можно включить только один блок TLS-маскировки. |
jls-opts | JLSOptions | (disabled) | JLSOptions | Блок маскировки JLS (`{ username, password }`). На каждый прокси можно включить только один блок TLS-маскировки. |
reality-opts | RealityOptions | (disabled) | RealityOptions | Клиентская конфигурация REALITY. |
tlsmirror-opts | TLSMirrorOptions | (disabled) | TLSMirrorOptions | Блок маскировки TLSMirror, включается заданием его `primary-key`; несёт собственный блок подопций. На каждый прокси можно включить только один блок TLS-маскировки. |
mekya-opts | MekyaOptions | (unset) | MekyaOptions | Настройки для `network: mekya` (V2Ray-совместимый Mekya, KCP поверх HTTP-запросов); несёт собственный блок подопций (`url`, `h2-pool-size`, `kcp`, ...). |
mkcp-opts | MKCPOptions | (unset) | MKCPOptions | Настройки для `network: mkcp` (V2Ray-совместимый mKCP поверх UDP); несёт собственный блок подопций (`mtu`, `tti`, `seed`, `header`, ...). |
http-opts | HTTPOptions | (unset) | HTTPOptions | Настройки для `network: http`. |
h2-opts | HTTP2Options | (unset) | HTTP2Options | Настройки для `network: h2`. |
grpc-opts | GrpcOptions | (unset) | GrpcOptions | Настройки для `network: grpc`. |
ws-opts | WSOptions | (unset) | WSOptions | Настройки для `network: ws`. |
packet-addr | bool | false | true | false | Использовать устаревшую кодировку UDP packet-addr. |
xudp | bool | false | true | false | Использовать кодировку xudp для UDP-пакетов (современный вариант по умолчанию). Взаимоисключимо с packet-addr. |
packet-encoding | string | (use udp/xudp flags) | packetaddr | xudp | Явный селектор кодировки пакетов; при установке переопределяет булевы флаги. |
global-padding | bool | false | true | false | Дополнять все записи до одинаковой длины. Сервер должен использовать ту же настройку. |
authenticated-length | bool | false | true | false | Использовать фрейминг authenticated-length. Сервер должен использовать ту же настройку. |
client-fingerprint | string | (global) | chrome | firefox | safari | ios | edge | random | randomized | Отпечаток client-hello uTLS. |
Исходный код: adapter/outbound/vmess.go:53-89 · зафиксировано на v1.19.29 (e26714a)
ws-opts
| Поле | Тип | По умолчанию | Допустимые значения | Описание |
|---|---|---|---|---|
path | string | / | /<path> | Путь WebSocket. |
headers | map[string]string | {} | {<header>: <value>} | Дополнительные HTTP-заголовки в запросе апгрейда. |
max-early-data | int | 0 | <bytes> | Максимум байтов ранних данных, буферизуемых до завершения WS-рукопожатия. |
early-data-header-name | string | (unset) | <header name> | Заголовок для передачи ранних данных в кодировке base64, когда их ожидает сервер. |
v2ray-http-upgrade | bool | false | true | false | Использовать транспорт HTTP-upgrade в стиле V2Ray вместо настоящего WebSocket. |
v2ray-http-upgrade-fast-open | bool | false | true | false | Отправлять полезную нагрузку клиента вместе с запросом HTTP-upgrade, экономя один RTT. |
Исходный код: adapter/outbound/vmess.go:165-172 · зафиксировано на v1.19.29 (e26714a)
grpc-opts
| Поле | Тип | По умолчанию | Допустимые значения | Описание |
|---|---|---|---|---|
grpc-service-name | string | (required) | <name> | Путь имени gRPC-сервиса. |
grpc-user-agent | string | (unset) | <UA string> | Переопределить User-Agent gRPC-клиента. |
ping-interval | int | 0 | <seconds> | Интервал кадров HTTP/2 PING. 0 отключает. |
max-connections | int | 0 | <int> | Максимум одновременных gRPC-каналов (разветвление mux). |
min-streams | int | 0 | <int> | Минимум потоков на канал до выделения нового канала. |
max-streams | int | 0 | <int> | Максимум потоков на канал. |
Исходный код: adapter/outbound/vmess.go:156-163 · зафиксировано на v1.19.29 (e26714a)
Входящий
Запись в listeners: с type: vmess. Встраивает BaseOption (listen, port).
| Поле | Тип | По умолчанию | Допустимые значения | Описание |
|---|---|---|---|---|
users | []VmessUser | (required) | <VmessUser array> | Принимаемые клиенты. |
ws-path | string | (unset) | /<path> | Путь WebSocket, обслуживаемый этим слушателем. |
grpc-service-name | string | (unset) | <name> | Имя gRPC-сервиса, принимаемое этим слушателем. |
certificate | string | (unset) | <PEM file path> | Серверный TLS-сертификат. |
private-key | string | (unset) | <key file path> | Закрытый TLS-ключ. |
client-auth-type | string | (none) | no-client-cert | request-client-cert | require-any-client-cert | verify-client-cert-if-given | require-and-verify-client-cert | Режим аутентификации клиента mTLS. |
client-auth-cert | string | (unset) | <PEM file path> | Набор CA, принимаемых как корневые для клиентов. |
ech-key | string | (unset) | <ECH config> | Материал Encrypted Client Hello. |
shadow-tls | ShadowTLS | (disabled) | ShadowTLS | Серверный блок маскировки Shadow-TLS (`{ enable, version, password, users, handshake, ... }`). |
res-tls | ResTLS | (disabled) | ResTLS | Серверный блок маскировки Restls (`{ enable, dest, password, ... }`); неаутентифицированные клиенты ретранслируются на `dest`. |
jls-config | JLSConfig | (disabled) | JLSConfig | Серверный блок маскировки JLS (`{ enable, users, sni, dest, ... }`); неаутентифицированные клиенты ретранслируются на `dest`. |
reality-config | RealityConfig | (disabled) | RealityConfig | Серверная конфигурация REALITY. |
tlsmirror-config | TLSMirrorConfig | (disabled) | TLSMirrorConfig | Серверный блок маскировки TLSMirror, включается заданием его `primary-key`; несёт собственный блок подопций (`dest`, `proxy`, ...). |
mekya-config | MekyaConfig | (disabled) | MekyaConfig | Серверный блок (`enable` плюс подопции), принимающий V2Ray-совместимый транспорт Mekya. Несовместим с `mkcp-config`, `ws-path` и `grpc-service-name`. |
mkcp-config | MKCPConfig | (disabled) | MKCPConfig | Серверный блок (`enable` плюс подопции), принимающий V2Ray-совместимый транспорт mKCP поверх UDP. |
mux-option | MuxOption | (disabled) | MuxOption | Настройки мультиплексирования (sing-style mux). |
Исходный код: listener/inbound/vmess.go:12-30 · зафиксировано на v1.19.29 (e26714a)
users[]
| Поле | Тип | По умолчанию | Допустимые значения | Описание |
|---|---|---|---|---|
username | string | (unset) | <string> | Отображаемое имя. |
uuid | string | (required) | <UUID> | UUID пользователя. |
alterId | int | 0 | 0 | <int> | Совместимость с устаревшим MD5-AEAD. |
Исходный код: listener/inbound/vmess.go:32-36 · зафиксировано на v1.19.29 (e26714a)
Примеры
Исходящий — VMess поверх WebSocket с TLS:
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:
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:
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)
