Skip to content

Trojan — Xray-core

Trojan — туннель, выглядящий как TLS, с парольным рукопожатием. Реализация в Xray-core соответствует исходной спецификации Trojan и не поддерживает расширение XTLS flow — поле flow всё ещё разбирается ради совместимости, но любое непустое значение приводит к жёсткой ошибке (infra/conf/trojan.go:73, 128).

Исходящий

settings для исходящего с "protocol": "trojan":

ПолеТипПо умолчаниюДопустимые значенияОписание
address*Address(unset)<host>Упрощённая форма — имя хоста или IP сервера.
portuint16(required with address)<port>Порт сервера.
levelbyte0<byte>Уровень пользователя (упрощённая форма).
emailstring(unset)<string>Идентификатор пользователя, отображаемый в статистике.
passwordstring(required with address)<string>Общий пароль для рукопожатия Trojan.
flowstring(must be empty)Удалённая возможность. Любое непустое значение приводит к отклонению конфигурации при запуске.
servers[]*TrojanServerTarget(use simplified shape)[TrojanServerTarget]Полная форма. Должна содержать ровно один сервер; для нескольких серверов нужны несколько исходящих + балансировщик.

Исходный код: infra/conf/trojan.go:31-39 · зафиксировано на v26.7.28 (5ca6f4b)

servers[]

ПолеТипПо умолчаниюДопустимые значенияОписание
address*Address(required)<host>Имя хоста или IP сервера.
portuint16(required)<port>Порт сервера.
levelbyte0<byte>Уровень пользователя.
emailstring(unset)<string>Идентификатор пользователя.
passwordstring(required)<string>Пароль Trojan.
flowstring(must be empty)Удалено; непустое значение отклоняется.

Исходный код: infra/conf/trojan.go:21-28 · зафиксировано на v26.7.28 (5ca6f4b)

Упрощённая форма vs. servers

Исходящий принимает либо упрощённую верхнеуровневую форму (address, port, password, ...), либо полную форму servers с ровно одним элементом. Для многосерверных схем используйте несколько исходящих Trojan плюс балансировщик маршрутизации.

Входящий

settings для входящего с "protocol": "trojan":

ПолеТипПо умолчаниюДопустимые значенияОписание
users[]*TrojanUserConfig[TrojanUserConfig] | …Список учётных записей входящего; та же форма объекта, что и у `clients`. `users` — более новое имя, появившееся в свежих версиях Xray и принимаемое наряду с `clients`.
clients[]*TrojanUserConfig(required)[TrojanUserConfig]Список принимаемых пользователей.
fallbacks[]*TrojanInboundFallback[][TrojanInboundFallback]Резервные назначения, к которым обращаются, когда входящий TLS-обёрнутый трафик не похож на Trojan.

Исходный код: infra/conf/trojan.go:114-118 · зафиксировано на v26.7.28 (5ca6f4b)

clients[]

ПолеТипПо умолчаниюДопустимые значенияОписание
passwordstring(required)<string>Пароль Trojan.
levelbyte0<byte>Уровень политики для этого пользователя.
emailstring(unset)<string>Метка в выводе статистики / журналов.
flowstring(must be empty)Удалено; непустое значение отклоняется.

Исходный код: infra/conf/trojan.go:106-111 · зафиксировано на v26.7.28 (5ca6f4b)

fallbacks[]

ПолеТипПо умолчаниюДопустимые значенияОписание
namestring(unset)<TLS server name>Сопоставляется с SNI входящего TLS; пустое значение совпадает с любым.
alpnstring(unset)h2 | http/1.1 | Сопоставляется с согласованным ALPN; пустое значение совпадает с любым.
pathstring(unset)/<path>Префикс HTTP-пути. Если непустой, должен начинаться с `/`.
typestring(auto)tcp | unix | serveПротокол бэкенда. Если опущен, выводится из `dest`.
destjson.RawMessage(required)<host:port> | <port> | <unix path>Цель пересылки. Голое целое число = порт на localhost.
xveruint6400 | 1 | 2Версия PROXY-протокола. 0 — отключено.

Исходный код: infra/conf/trojan.go:96-103 · зафиксировано на v26.7.28 (5ca6f4b)

Цепочка fallback у Trojan повторяет VLESS: совпадения проверяются по порядку на первом байте TLS-обёрнутого потока, ключи — (name, alpn, path).

Примеры

Минимальный входящий с одним пользователем и TLS:

json
{
  "inbounds": [
    {
      "tag": "trojan-in",
      "listen": "0.0.0.0",
      "port": 443,
      "protocol": "trojan",
      "settings": {
        "clients": [
          { "password": "<password>", "email": "alice" }
        ]
      },
      "streamSettings": { "network": "tcp", "security": "tls" }
    }
  ]
}

Упрощённый исходящий:

json
{
  "outbounds": [
    {
      "tag": "trojan-out",
      "protocol": "trojan",
      "settings": {
        "address": "example.com",
        "port": 443,
        "password": "<password>",
        "email": "alice"
      },
      "streamSettings": {
        "network": "ws",
        "security": "tls",
        "wsSettings": { "path": "/tj" }
      }
    }
  ]
}

Примечания

  • flow у Trojan — удалённая возможность в Xray-core. Поле структуры сохранено для обратно совместимого разбора, но любое непустое значение вызывает при запуске PrintRemovedFeatureError("Flow for Trojan"). Среда выполнения также печатает баннер об устаревании с рекомендацией «VLESS with Flow & Seed» (infra/conf/trojan.go:42, 120).
  • password обязателен. Исходящий с пустым паролем не проходит сборку (infra/conf/trojan.go:69-71).
  • fallbacks работают в точности как fallback у VLESS — та же форма полей и тот же автоматический вывод type из dest.

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

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

Исходный код: infra/conf/trojan.go:21-118 · v26.7.28 (5ca6f4b)

Core Tutorial от Argsment