Skip to content

Shadowsocks — mihomo

mihomo поддерживает Shadowsocks с обеих сторон, с богатой экосистемой плагинов, оборачивающих протокол в obfs, WebSocket (v2ray-plugin / gost-plugin), Shadow-TLS, Restls, JLS или KCP. Конфигурация плагина задаётся в типизированной YAML-карте plugin-opts.

Исходящий

Запись в proxies: с type: ss. Встраивает BasicOption.

ПолеТипПо умолчаниюДопустимые значенияОписание
namestring(required)<string>Уникальное имя прокси.
serverstring(required)<host>Имя хоста или IP вышестоящего сервера.
portint(required)<port>Порт вышестоящего сервера.
passwordstring(required)<string> | <base64 key>Пароль сервера (AEAD) или ключ EIH (SS-2022).
cipherstring(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.
udpboolfalsetrue | falseРазрешить ретрансляцию UDP-пакетов через этот исходящий.
pluginstring(unset)obfs | v2ray-plugin | gost-plugin | shadow-tls | restls | jls | kcptunПлагин обфускации / транспорта, оборачивающий поток. У каждого плагина своя схема `plugin-opts` (описана ниже).
plugin-optsmap[string]any{}<plugin-specific YAML map>Конфигурация, специфичная для плагина. Схема зависит от `plugin` — см. подразделы ниже.
udp-over-tcpboolfalsetrue | falseОборачивать UDP внутрь TCP-потока.
udp-over-tcp-versionint21 | 2Версия фрейминга UoT.
client-fingerprintstring(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).

ПолеТипПо умолчаниюДопустимые значенияОписание
modestringtlstls | httpРежим obfs. `tls` имитирует TLS Client Hello; `http` имитирует обычный HTTP-запрос.
hoststring(unset)<host>Имя хоста прикрытия, используемое в полезной нагрузке obfs.

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

plugin-opts — когда plugin: v2ray-plugin

Оборачивает поток в WebSocket-рукопожатие. TLS опционален.

ПолеТипПо умолчаниюДопустимые значенияОписание
modestring(required)websocketПока поддерживается только `websocket`.
hoststring(unset)<host>Заголовок Host, отправляемый при WS-рукопожатии.
pathstring//<path>Путь WebSocket.
tlsboolfalsetrue | falseОбернуть WS-рукопожатие в TLS.
ech-optsECHOptions
fingerprintstring(unset)<SHA256 hex>Закрепить отпечаток TLS-сертификата сервера.
certificatestring(unset)<PEM file path>Клиентский сертификат (mTLS).
private-keystring(unset)<key file path>Закрытый ключ, соответствующий `certificate`.
headersmap[string]string{}{<header>: <value>}Дополнительные HTTP-заголовки в запросе апгрейда.
skip-cert-verifyboolfalsetrue | falseОтключить проверку TLS.
name-cert-verifystring(unset)<hostname>Проверять сертификат сервера по этому имени хоста вместо SNI.
muxboolfalsetrue | falseВключить smux поверх WS-потока.
v2ray-http-upgradeboolfalsetrue | falseИспользовать V2Ray HTTP-upgrade вместо стандартного WebSocket.
v2ray-http-upgrade-fast-openboolfalsetrue | falseОтправлять полезную нагрузку вместе с запросом HTTP-upgrade.

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

plugin-opts — когда plugin: shadow-tls

Добавляет Shadow-TLS-рукопожатие перед потоком Shadowsocks.

ПолеТипПо умолчаниюДопустимые значенияОписание
passwordstring(unset)<string>Пароль Shadow-TLS v2/v3.
hoststring(required)<host>Имя хоста прикрытия для TLS-рукопожатия.
fingerprintstring(unset)<SHA256 hex>Закрепить TLS-сертификат сервера прикрытия.
certificatestring(unset)<PEM file path>Клиентский сертификат.
private-keystring(unset)<key file path>Закрытый ключ.
skip-cert-verifyboolfalsetrue | falseОтключить проверку сертификата (только для тестов).
name-cert-verifystring(unset)<hostname>Проверять сертификат сервера по этому имени хоста вместо SNI.
versionint31 | 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-рукопожатие.

ПолеТипПо умолчаниюДопустимые значенияОписание
hoststring(required)<host>Маскировочное имя хоста, предъявляемое как SNI JLS-рукопожатия.
usernamestring(required)<string>Имя пользователя JLS.
passwordstring(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.

ПолеТипПо умолчаниюДопустимые значенияОписание
passwordstring(required)<string> | <base64 key>Пароль сервера или ключ SS-2022.
cipherstring(required)<cipher>Тот же набор шифров, что и у исходящего.
udpboolfalsetrue | falseПринимать UDP-пакеты.
mux-optionMuxOption(disabled)MuxOptionМультиплексирование в стиле sing.
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`.
kcp-tunKcpTun(disabled)KcpTunНеобязательный входящий транспорт KCP.
simple-obfsSimpleObfs(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 на слушателе — внешний бинарник плагина не нужен.

ПолеТипПо умолчаниюДопустимые значенияОписание
enableboolfalsetrue | falseВключить simple-obfs на слушателе.
modestringtlshttp | tlsРежим obfs. `tls` имитирует TLS Client Hello; `http` имитирует обычный HTTP-запрос.

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

Примеры

Обычный исходящий SS:

yaml
proxies:
  - name: ss-aead
    type: ss
    server: example.com
    port: 8388
    password: <password>
    cipher: aes-256-gcm
    udp: true

Исходящий SS-2022 с UDP-over-TCP:

yaml
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: 2

SS поверх v2ray-plugin (WebSocket + TLS):

yaml
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: /ss

SS, прикрытый Shadow-TLS v3:

yaml
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:

yaml
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)

Core Tutorial от Argsment