Skip to content

Trojan — mihomo

mihomo 双端支持 Trojan。出站可走 tcpwsgrpc 传输,并支持 TLS、REALITY、ECH 包装;额外提供 trojan-go 兼容的 ss-opts 层,可在 Trojan 密码握手之上再叠加一层 Shadowsocks 加密。

出站

proxies:type: trojan 条目。内嵌 BasicOption(通用出站字段)。

字段类型默认值允许值描述
namestring(required)<string>唯一的代理名。
serverstring(required)<host>上游服务器主机名或 IP。
portint(required)<port>上游服务器端口。
passwordstring(required)<string>Trojan 密码。
alpn[]string[]h2 | http/1.1TLS 握手时宣告的 ALPN 列表。
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)ECHOptionsEncrypted Client Hello 配置。
shadow-tls-optsShadowTLSOptions(disabled)ShadowTLSOptionsShadow-TLS 伪装块(`{ password, version }`)。每个代理最多只能启用一个 TLS 伪装块。
restls-optsRestlsOptions(disabled)RestlsOptionsRestls 伪装块(`{ password, version-hint, restls-script }`)。每个代理最多只能启用一个 TLS 伪装块。
jls-optsJLSOptions(disabled)JLSOptionsJLS 伪装块(`{ username, password }`)。每个代理最多只能启用一个 TLS 伪装块。
reality-optsRealityOptions(disabled)RealityOptionsREALITY 客户端配置。
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 | randomizeduTLS ClientHello 指纹。

源码: 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-poly1305内层使用的 Shadowsocks AEAD 加密。
passwordstring(unset)<string>内层 Shadowsocks 的密码(与外层 Trojan 密码相互独立)。

源码: adapter/outbound/trojan.go:72-76 · 锚定版本 v1.19.29 (e26714a)

入站

listeners:type: trojan 条目。内嵌 BaseOptionlistenport)。

字段类型默认值允许值描述
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-certmTLS 客户端鉴权模式。
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)RealityConfigREALITY 服务端配置。
mux-optionMuxOption(disabled)MuxOption多路复用设置(sing 风格 mux)。
ss-optionTrojanSSOption(disabled)TrojanSSOptionShadowsocks-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)

示例

出站 —— TLS 之上的普通 Trojan:

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

出站 —— WebSocket 之上启用 trojan-go ss-opts 的 Trojan:

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 完全一致enabledmethodpassword),否则入站拒绝客户端。
  • mihomo 没有 Xray 的 fallbacks[] 或 sing-box 的 fallback_for_alpn 等价物。需要 HTTP 回落时,请在 mihomo 之前用独立反向代理终止 TLS。
  • 出站的 client-fingerprint 是按代理的 uTLS 覆盖。全局默认为 global-client-fingerprint
  • shadow-tls-optsrestls-optsjls-optsreality-opts 是互斥的 TLS 伪装模式 —— 最多启用一个。入站对应的 shadow-tlsres-tlsjls-config 同样互斥。

跨内核说明

  • Xray 入站使用 clients[]、支持列表形式 fallbacks[] 链,且拒绝任何非空 flow。参见 Trojan — Xray-core
  • sing-box 入站使用 users[]name / password),并把 fallback 列表替换为单个默认 fallback 加按 ALPN 索引的 fallback_for_alpn 映射。参见 Trojan — sing-box

源码: adapter/outbound/trojan.go:45-76 · v1.19.29 (e26714a)

由 Argsment 出品的 Core Tutorial