Shadowsocks — mihomo
mihomo поддерживает Shadowsocks с обеих сторон, с богатой экосистемой плагинов, оборачивающих протокол в obfs, WebSocket (v2ray-plugin / gost-plugin), Shadow-TLS, Restls, JLS или KCP. Конфигурация плагина задаётся в типизированной YAML-карте plugin-opts.
Исходящий
Запись в proxies: с type: ss. Встраивает BasicOption.
| Поле | Тип | По умолчанию | Допустимые значения | Описание |
|---|---|---|---|---|
name | string | (required) | <string> | Уникальное имя прокси. |
server | string | (required) | <host> | Имя хоста или IP вышестоящего сервера. |
port | int | (required) | <port> | Порт вышестоящего сервера. |
password | string | (required) | <string> | <base64 key> | Пароль сервера (AEAD) или ключ EIH (SS-2022). |
cipher | string | (required) | aes-128-gcm | aes-256-gcm | chacha20-ietf-poly1305 | xchacha20-ietf-poly1305 | 2022-blake3-aes-128-gcm | 2022-blake3-aes-256-gcm | 2022-blake3-chacha20-poly1305 | none | Название mihomo для шифра / схемы выведения ключа Shadowsocks. |
udp | bool | false | true | false | Разрешить ретрансляцию UDP-пакетов через этот исходящий. |
plugin | string | (unset) | obfs | v2ray-plugin | gost-plugin | shadow-tls | restls | jls | kcptun | Плагин обфускации / транспорта, оборачивающий поток. У каждого плагина своя схема `plugin-opts` (описана ниже). |
plugin-opts | map[string]any | {} | <plugin-specific YAML map> | Конфигурация, специфичная для плагина. Схема зависит от `plugin` — см. подразделы ниже. |
udp-over-tcp | bool | false | true | false | Оборачивать UDP внутрь TCP-потока. |
udp-over-tcp-version | int | 2 | 1 | 2 | Версия фрейминга UoT. |
client-fingerprint | string | (global) | chrome | firefox | safari | ios | edge | random | randomized | Отпечаток client-hello uTLS, применяемый, когда плагин использует TLS. |
Исходный код: adapter/outbound/shadowsocks.go:43-56 · зафиксировано на v1.19.29 (e26714a)
plugin-opts — когда plugin: obfs
Оборачивает поток в simple-obfs (в форме TLS или HTTP).
| Поле | Тип | По умолчанию | Допустимые значения | Описание |
|---|---|---|---|---|
mode | string | tls | tls | http | Режим obfs. `tls` имитирует TLS Client Hello; `http` имитирует обычный HTTP-запрос. |
host | string | (unset) | <host> | Имя хоста прикрытия, используемое в полезной нагрузке obfs. |
Исходный код: adapter/outbound/shadowsocks.go:58-61 · зафиксировано на v1.19.29 (e26714a)
plugin-opts — когда plugin: v2ray-plugin
Оборачивает поток в WebSocket-рукопожатие. TLS опционален.
| Поле | Тип | По умолчанию | Допустимые значения | Описание |
|---|---|---|---|---|
mode | string | (required) | websocket | Пока поддерживается только `websocket`. |
host | string | (unset) | <host> | Заголовок Host, отправляемый при WS-рукопожатии. |
path | string | / | /<path> | Путь WebSocket. |
tls | bool | false | true | false | Обернуть WS-рукопожатие в TLS. |
ech-opts | ECHOptions | — | — | |
fingerprint | string | (unset) | <SHA256 hex> | Закрепить отпечаток TLS-сертификата сервера. |
certificate | string | (unset) | <PEM file path> | Клиентский сертификат (mTLS). |
private-key | string | (unset) | <key file path> | Закрытый ключ, соответствующий `certificate`. |
headers | map[string]string | {} | {<header>: <value>} | Дополнительные HTTP-заголовки в запросе апгрейда. |
skip-cert-verify | bool | false | true | false | Отключить проверку TLS. |
name-cert-verify | string | (unset) | <hostname> | Проверять сертификат сервера по этому имени хоста вместо SNI. |
mux | bool | false | true | false | Включить smux поверх WS-потока. |
v2ray-http-upgrade | bool | false | true | false | Использовать V2Ray HTTP-upgrade вместо стандартного WebSocket. |
v2ray-http-upgrade-fast-open | bool | false | true | false | Отправлять полезную нагрузку вместе с запросом HTTP-upgrade. |
Исходный код: adapter/outbound/shadowsocks.go:63-78 · зафиксировано на v1.19.29 (e26714a)
plugin-opts — когда plugin: shadow-tls
Добавляет Shadow-TLS-рукопожатие перед потоком Shadowsocks.
| Поле | Тип | По умолчанию | Допустимые значения | Описание |
|---|---|---|---|---|
password | string | (unset) | <string> | Пароль Shadow-TLS v2/v3. |
host | string | (required) | <host> | Имя хоста прикрытия для TLS-рукопожатия. |
fingerprint | string | (unset) | <SHA256 hex> | Закрепить TLS-сертификат сервера прикрытия. |
certificate | string | (unset) | <PEM file path> | Клиентский сертификат. |
private-key | string | (unset) | <key file path> | Закрытый ключ. |
skip-cert-verify | bool | false | true | false | Отключить проверку сертификата (только для тестов). |
name-cert-verify | string | (unset) | <hostname> | Проверять сертификат сервера по этому имени хоста вместо SNI. |
version | int | 3 | 1 | 2 | 3 | Версия протокола Shadow-TLS. v3 — текущая версия для производственного использования. |
alpn | []string | [] | h2 | http/1.1 | Список ALPN, предлагаемый при TLS-рукопожатии прикрытия. |
Исходный код: adapter/outbound/shadowsocks.go:95-105 · зафиксировано на v1.19.29 (e26714a)
plugin-opts — когда plugin: jls
Оборачивает поток в маскирующее JLS-рукопожатие.
| Поле | Тип | По умолчанию | Допустимые значения | Описание |
|---|---|---|---|---|
host | string | (required) | <host> | Маскировочное имя хоста, предъявляемое как SNI JLS-рукопожатия. |
username | string | (required) | <string> | Имя пользователя JLS. |
password | string | (required) | <string> | Пароль JLS. |
alpn | []string | [] | h2 | http/1.1 | Список ALPN, предлагаемый при JLS-рукопожатии. |
Исходный код: adapter/outbound/shadowsocks.go:118-123 · зафиксировано на v1.19.29 (e26714a)
Остальные варианты плагинов (gost-plugin, restls, kcptun) имеют собственные схемы в plugin-opts. Их структуры (gostObfsOption, restlsOption, kcpTunOption) находятся в том же исходном файле; полный список полей см. в извлечённых данных.
Входящий
Запись в listeners: с type: ss. Встраивает BaseOption.
| Поле | Тип | По умолчанию | Допустимые значения | Описание |
|---|---|---|---|---|
password | string | (required) | <string> | <base64 key> | Пароль сервера или ключ SS-2022. |
cipher | string | (required) | <cipher> | Тот же набор шифров, что и у исходящего. |
udp | bool | false | true | false | Принимать UDP-пакеты. |
mux-option | MuxOption | (disabled) | MuxOption | Мультиплексирование в стиле sing. |
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`. |
kcp-tun | KcpTun | (disabled) | KcpTun | Необязательный входящий транспорт KCP. |
simple-obfs | SimpleObfs | (disabled) | SimpleObfs | Настройки simple-obfs (obfs-local): `{ enable, mode }`, где `mode` — `http` или `tls`. |
Исходный код: listener/inbound/shadowsocks.go:12-23 · зафиксировано на v1.19.29 (e26714a)
simple-obfs
Встроенная обёртка simple-obfs на слушателе — внешний бинарник плагина не нужен.
| Поле | Тип | По умолчанию | Допустимые значения | Описание |
|---|---|---|---|---|
enable | bool | false | true | false | Включить simple-obfs на слушателе. |
mode | string | tls | http | tls | Режим obfs. `tls` имитирует TLS Client Hello; `http` имитирует обычный HTTP-запрос. |
Исходный код: listener/inbound/shadowsocks.go:25-28 · зафиксировано на v1.19.29 (e26714a)
Примеры
Обычный исходящий SS:
proxies:
- name: ss-aead
type: ss
server: example.com
port: 8388
password: <password>
cipher: aes-256-gcm
udp: trueИсходящий SS-2022 с UDP-over-TCP:
proxies:
- name: ss22
type: ss
server: example.com
port: 8388
password: <base64 16-byte key>
cipher: 2022-blake3-aes-128-gcm
udp-over-tcp: true
udp-over-tcp-version: 2SS поверх v2ray-plugin (WebSocket + TLS):
proxies:
- name: ss-v2ray
type: ss
server: example.com
port: 443
password: <password>
cipher: aes-256-gcm
udp: true
plugin: v2ray-plugin
plugin-opts:
mode: websocket
tls: true
host: example.com
path: /ssSS, прикрытый Shadow-TLS v3:
proxies:
- name: ss-stls
type: ss
server: example.com
port: 443
password: <ss password>
cipher: aes-256-gcm
plugin: shadow-tls
plugin-opts:
password: <stls password>
host: www.cloudflare.com
version: 3Входящий в listeners:
listeners:
- name: ss-in
type: ss
listen: 0.0.0.0
port: 8388
password: <password>
cipher: aes-256-gcm
udp: trueПримечания
- Исходящий mihomo принимает
plugin-optsкак типизированную YAML-карту, декодируемую в одну из структур конкретного плагина. Теги на этих структурах используютobfs:вместоproxy:— это внутреннее соглашение mihomo, не затрагивающее пользователя; см., например,simpleObfsOptionвadapter/outbound/shadowsocks.go:58-61. plugin: obfs— это названиеsimple-obfsв mihomo; передайтеmode: tlsдля формы под TLS иmode: http— для формы под HTTP.- Входящий слушатель mihomo пока не поддерживает многопользовательский
users[]— чтобы разместить несколько пользователей SS-2022 на одном порту, определите по одному слушателю на пользователя.
Сравнение с другими ядрами
- Xray использует
method(а неcipher) и не поддерживает UDP-over-TCP (его прежние поляuot/uotVersionудалены в v26.7.x). Системы плагинов у него нет — вместо этого оборачивайте полезную нагрузку Shadowsocks в другой транспортstreamSettings. См. Shadowsocks — Xray-core. - sing-box использует
method, поддерживает форму ретрансляцииdestinations[]для SS-2022 и представляет UoT в объектной формеudp_over_tcp: {enabled, version}. Он также принимает внешние бинарники плагинов черезplugin/plugin_opts. См. Shadowsocks — sing-box.
Исходный код: adapter/outbound/shadowsocks.go:43-105 · v1.19.29 (e26714a)
