Trojan — Xray-core
Trojan 是带密码握手的 TLS 形态隧道。Xray-core 的实现遵循原始 Trojan 规范,不支持 XTLS 的 flow 扩展 —— 出于兼容性 flow 字段仍可 被解析,但任何非空值都会触发硬错误(infra/conf/trojan.go:73, 128)。
出站
"protocol": "trojan" 出站的 settings:
| 字段 | 类型 | 默认值 | 允许值 | 描述 |
|---|---|---|---|---|
address | *Address | (unset) | <host> | 简化形式 —— 服务器主机名或 IP。 |
port | uint16 | (required with address) | <port> | 服务器端口。 |
level | byte | 0 | <byte> | 用户等级(简化形式)。 |
email | string | (unset) | <string> | 统计中显示的用户标识。 |
password | string | (required with address) | <string> | Trojan 握手用的共享密码。 |
flow | string | (must be empty) | — | 已移除特性。任何非空值都会在启动时拒绝。 |
servers | []*TrojanServerTarget | (use simplified shape) | [TrojanServerTarget] | 完整形式。必须恰好一个服务器;多服务器场景请使用多个出站加负载均衡器。 |
源码: infra/conf/trojan.go:31-39 · 锚定版本 v26.6.1 (94ffd50)
servers[]
| 字段 | 类型 | 默认值 | 允许值 | 描述 |
|---|---|---|---|---|
address | *Address | (required) | <host> | 服务器主机名或 IP。 |
port | uint16 | (required) | <port> | 服务器端口。 |
level | byte | 0 | <byte> | 用户等级。 |
email | string | (unset) | <string> | 用户标识。 |
password | string | (required) | <string> | Trojan 密码。 |
flow | string | (must be empty) | — | 已移除;非空值会被拒绝。 |
源码: infra/conf/trojan.go:21-28 · 锚定版本 v26.6.1 (94ffd50)
简化形式 vs. servers
出站接受 要么 简化的顶层形式(address、port、password ……),要么 完整的 servers 形式且恰好一个条目。多服务器场景 请使用多个 Trojan 出站配合路由负载均衡器。
入站
"protocol": "trojan" 入站的 settings:
| 字段 | 类型 | 默认值 | 允许值 | 描述 |
|---|---|---|---|---|
users | []*TrojanUserConfig | — | [TrojanUserConfig] | … | 入站账户列表;对象形状与 `clients` 相同。`users` 是近期 Xray 引入的较新名称,与 `clients` 一并接受。 |
clients | []*TrojanUserConfig | (required) | [TrojanUserConfig] | 可接受的用户列表。 |
fallbacks | []*TrojanInboundFallback | [] | [TrojanInboundFallback] | TLS 包裹的传入流量不像 Trojan 时使用的备用目标。 |
源码: infra/conf/trojan.go:114-118 · 锚定版本 v26.6.1 (94ffd50)
clients[]
| 字段 | 类型 | 默认值 | 允许值 | 描述 |
|---|---|---|---|---|
password | string | (required) | <string> | Trojan 密码。 |
level | byte | 0 | <byte> | 该用户的策略等级。 |
email | string | (unset) | <string> | 统计 / 日志中显示的标签。 |
flow | string | (must be empty) | — | 已移除;非空值会被拒绝。 |
源码: infra/conf/trojan.go:106-111 · 锚定版本 v26.6.1 (94ffd50)
fallbacks[]
| 字段 | 类型 | 默认值 | 允许值 | 描述 |
|---|---|---|---|---|
name | string | (unset) | <TLS server name> | 匹配传入的 TLS SNI;空值匹配任意。 |
alpn | string | (unset) | h2 | http/1.1 | | 匹配协商出的 ALPN;空值匹配任意。 |
path | string | (unset) | /<path> | HTTP 路径前缀。非空时必须以 `/` 开头。 |
type | string | (auto) | tcp | unix | serve | 后端协议。省略时由 `dest` 推断。 |
dest | json.RawMessage | (required) | <host:port> | <port> | <unix path> | 转发目标。纯整数 = localhost 上的端口。 |
xver | uint64 | 0 | 0 | 1 | 2 | PROXY 协议版本。0 关闭。 |
源码: infra/conf/trojan.go:96-103 · 锚定版本 v26.6.1 (94ffd50)
Trojan 的 fallback 链与 VLESS 镜像一致:在 TLS 包裹流的首字节上按 顺序匹配,键为 (name, alpn, path)。
示例
最小入站,单用户启用 TLS:
{
"inbounds": [
{
"tag": "trojan-in",
"listen": "0.0.0.0",
"port": 443,
"protocol": "trojan",
"settings": {
"clients": [
{ "password": "<password>", "email": "alice" }
]
},
"streamSettings": { "network": "tcp", "security": "tls" }
}
]
}简化出站:
{
"outbounds": [
{
"tag": "trojan-out",
"protocol": "trojan",
"settings": {
"address": "example.com",
"port": 443,
"password": "<password>",
"email": "alice"
},
"streamSettings": {
"network": "ws",
"security": "tls",
"wsSettings": { "path": "/tj" }
}
}
]
}说明
- Trojan 的
flow在 Xray-core 中是 已移除特性。结构体字段仍存在 以保持兼容性解析,但传入任何非空值都会触发PrintRemovedFeatureError("Flow for Trojan")启动错误。运行时还会 打印推荐 "VLESS with Flow & Seed" 的弃用横幅 (infra/conf/trojan.go:42, 120)。 password必填。空 password 的出站会构建失败 (infra/conf/trojan.go:69-71)。fallbacks与 VLESS 的 fallbacks 完全一致 —— 字段形状相同,type从dest推断的逻辑也相同。
跨内核说明
- sing-box 使用
users[](含name/password)替代clients[],并把 Xray 的 fallback 链拆成两个独立选项:单个fallback目标 + 按 ALPN 索引的fallback_for_alpn。参见 Trojan — sing-box。 - mihomo 采用标准的单一 proxy 对象形态,还额外暴露了用于 trojan-go 客户端的 Shadowsocks-over-Trojan 兼容层(
ss-opts)。 参见 Trojan — mihomo。
源码: infra/conf/trojan.go:21-118 · v26.6.1 (94ffd50)
