Trojan — mihomo
mihomo поддерживает Trojan с обеих сторон. Исходящий работает с транспортами tcp, ws и grpc с обёртками TLS, REALITY и ECH, а также с совместимым с trojan-go слоем ss-opts, добавляющим внутренний шифр Shadowsocks поверх парольного рукопожатия Trojan.
Исходящий
Запись в proxies: с type: trojan. Встраивает BasicOption (общие поля исходящих).
| Поле | Тип | По умолчанию | Допустимые значения | Описание |
|---|---|---|---|---|
name | string | (required) | <string> | Уникальное имя прокси. |
server | string | (required) | <host> | Имя хоста или IP вышестоящего сервера. |
port | int | (required) | <port> | Порт вышестоящего сервера. |
password | string | (required) | <string> | Пароль Trojan. |
alpn | []string | [] | h2 | http/1.1 | Список ALPN, предлагаемый при TLS-рукопожатии. |
sni | string | (server name) | <SNI> | TLS Server Name Indication. По умолчанию — значение `server`. |
skip-cert-verify | bool | false | true | false | Отключить проверку TLS (только для тестов). |
name-cert-verify | string | (unset) | <hostname> | Проверять сертификат сервера по этому имени хоста вместо SNI. |
fingerprint | string | (unset) | <SHA256 hex> | Закрепить TLS-сертификат сервера за этим отпечатком. |
certificate | string | (unset) | <PEM file path> | Клиентский сертификат (mTLS). |
private-key | string | (unset) | <key file path> | Закрытый ключ, соответствующий `certificate`. |
udp | bool | false | true | false | Разрешить ретрансляцию UDP-пакетов через этот исходящий. |
network | string | tcp | tcp | ws | grpc | Нижележащий транспорт. |
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. |
grpc-opts | GrpcOptions | (unset) | GrpcOptions | Настройки для `network: grpc`. |
ws-opts | WSOptions | (unset) | WSOptions | Настройки для `network: ws`. |
ss-opts | TrojanSSOption | (disabled) | TrojanSSOption | Необязательный слой Shadowsocks-over-Trojan (в стиле trojan-go). |
client-fingerprint | string | (global) | chrome | firefox | safari | ios | edge | random | randomized | Отпечаток client-hello uTLS. |
Исходный код: adapter/outbound/trojan.go:45-69 · зафиксировано на v1.19.29 (e26714a)
ss-opts
| Поле | Тип | По умолчанию | Допустимые значения | Описание |
|---|---|---|---|---|
enabled | bool | false | true | false | Обернуть поток Trojan дополнительным слоем Shadowsocks. |
method | string | (unset) | aes-128-gcm | aes-256-gcm | chacha20-ietf-poly1305 | AEAD-шифр Shadowsocks, используемый для внутреннего слоя. |
password | string | (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-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. |
allow-insecure | bool | false | true | false | Пропустить проверку клиентского TLS-сертификата на слушателе (только для тестирования). |
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. |
mux-option | MuxOption | (disabled) | MuxOption | Настройки мультиплексирования (sing-style mux). |
ss-option | TrojanSSOption | (disabled) | TrojanSSOption | Слой совместимости Shadowsocks-over-Trojan (должен совпадать с `ss-opts` исходящего). |
Исходный код: listener/inbound/trojan.go:12-29 · зафиксировано на v1.19.29 (e26714a)
users[]
| Поле | Тип | По умолчанию | Допустимые значения | Описание |
|---|---|---|---|---|
username | string | (unset) | <string> | Отображаемое имя. |
password | string | (required) | <string> | Пароль Trojan. |
Исходный код: listener/inbound/trojan.go:31-34 · зафиксировано на v1.19.29 (e26714a)
Примеры
Исходящий — обычный Trojan с TLS:
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:
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:
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)
