Skip to content

Trojan — mihomo

mihomo поддерживает Trojan с обеих сторон. Исходящий работает с транспортами tcp, ws и grpc с обёртками TLS, REALITY и ECH, а также с совместимым с trojan-go слоем ss-opts, добавляющим внутренний шифр Shadowsocks поверх парольного рукопожатия Trojan.

Исходящий

Запись в proxies: с type: trojan. Встраивает BasicOption (общие поля исходящих).

ПолеТипПо умолчаниюДопустимые значенияОписание
namestring(required)<string>Уникальное имя прокси.
serverstring(required)<host>Имя хоста или IP вышестоящего сервера.
portint(required)<port>Порт вышестоящего сервера.
passwordstring(required)<string>Пароль Trojan.
alpn[]string[]h2 | http/1.1Список ALPN, предлагаемый при TLS-рукопожатии.
snistring(server name)<SNI>TLS Server Name Indication. По умолчанию — значение `server`.
skip-cert-verifyboolfalsetrue | falseОтключить проверку TLS (только для тестов).
name-cert-verifystring(unset)<hostname>Проверять сертификат сервера по этому имени хоста вместо SNI.
fingerprintstring(unset)<SHA256 hex>Закрепить TLS-сертификат сервера за этим отпечатком.
certificatestring(unset)<PEM file path>Клиентский сертификат (mTLS).
private-keystring(unset)<key file path>Закрытый ключ, соответствующий `certificate`.
udpboolfalsetrue | falseРазрешить ретрансляцию UDP-пакетов через этот исходящий.
networkstringtcptcp | ws | grpcНижележащий транспорт.
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.
grpc-optsGrpcOptions(unset)GrpcOptionsНастройки для `network: grpc`.
ws-optsWSOptions(unset)WSOptionsНастройки для `network: ws`.
ss-optsTrojanSSOption(disabled)TrojanSSOptionНеобязательный слой Shadowsocks-over-Trojan (в стиле trojan-go).
client-fingerprintstring(global)chrome | firefox | safari | ios | edge | random | randomizedОтпечаток client-hello uTLS.

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

ss-opts

ПолеТипПо умолчаниюДопустимые значенияОписание
enabledboolfalsetrue | falseОбернуть поток Trojan дополнительным слоем Shadowsocks.
methodstring(unset)aes-128-gcm | aes-256-gcm | chacha20-ietf-poly1305AEAD-шифр Shadowsocks, используемый для внутреннего слоя.
passwordstring(unset)<string>Пароль внутреннего слоя Shadowsocks (отдельный от внешнего пароля Trojan).

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

Входящий

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

ПолеТипПо умолчаниюДопустимые значенияОписание
users[]TrojanUser(required)[TrojanUser]Принимаемые клиенты.
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.
allow-insecureboolfalsetrue | falseПропустить проверку клиентского TLS-сертификата на слушателе (только для тестирования).
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.
mux-optionMuxOption(disabled)MuxOptionНастройки мультиплексирования (sing-style mux).
ss-optionTrojanSSOption(disabled)TrojanSSOptionСлой совместимости Shadowsocks-over-Trojan (должен совпадать с `ss-opts` исходящего).

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

users[]

ПолеТипПо умолчаниюДопустимые значенияОписание
usernamestring(unset)<string>Отображаемое имя.
passwordstring(required)<string>Пароль Trojan.

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

Примеры

Исходящий — обычный Trojan с TLS:

yaml
proxies:
  - name: trojan-srv
    type: trojan
    server: example.com
    port: 443
    password: <password>
    sni: example.com
    udp: true
    alpn: [h2, http/1.1]

Исходящий — Trojan поверх WebSocket с trojan-go ss-opts:

yaml
proxies:
  - name: trojan-go
    type: trojan
    server: example.com
    port: 443
    password: <outer-password>
    udp: true
    network: ws
    sni: example.com
    ws-opts:
      path: /tj
    ss-opts:
      enabled: true
      method: aes-128-gcm
      password: <inner-password>

Входящий в listeners:

yaml
listeners:
  - name: trojan-in
    type: trojan
    listen: 0.0.0.0
    port: 443
    users:
      - username: alice
        password: <password>
    certificate: /etc/mihomo/server.crt
    private-key: /etc/mihomo/server.key

Примечания

  • ss-opts реализует приём trojan-go: Shadowsocks AEAD укладывается внутрь потока Trojan. Внешний пароль Trojan аутентифицирует рукопожатие; внутренний ключ Shadowsocks шифрует полезную нагрузку. Блок ss-option входящего должен в точности совпадать с ss-opts исходящего (enabled, method, password), иначе входящий отклоняет клиента.
  • У mihomo нет аналога fallbacks[] из Xray или fallback_for_alpn из sing-box. Для поведения HTTP-fallback терминируйте TLS перед mihomo отдельным обратным прокси.
  • client-fingerprint исходящего — переопределение uTLS на уровне отдельного прокси. Глобальное значение по умолчанию — global-client-fingerprint.
  • shadow-tls-opts, restls-opts, jls-opts и reality-opts — взаимоисключающие режимы TLS-маскировки: включайте не более одного. Входящие аналоги shadow-tls, res-tls и jls-config также взаимоисключающи.

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

  • Xray использует clients[] для пользователей входящего, поддерживает цепочку fallbacks[] в форме списка и отклоняет любое непустое значение flow. См. Trojan — Xray-core.
  • sing-box использует users[] (name/password) и заменяет список fallback единственным fallback по умолчанию плюс картой fallback_for_alpn по ALPN. См. Trojan — sing-box.

Исходный код: adapter/outbound/trojan.go:45-76 · v1.19.29 (e26714a)

Core Tutorial от Argsment