← К библиотеке
Протоколы Устарело

Trojan: конфиг (и почему это устаревает)

⚠ Протокол устарел и почти не используется. Оставлено для справки — как основу ставить не рекомендую.

Trojan держу как резерв другого «вида» — на случай, если VLESS-паттерн начали фингерпринтить. Он прикидывается обычным HTTPS-сайтом и при «тыке» отдаёт настоящую страницу. Ниже два рабочих конфига и честно про то, почему я не делаю его основным. Впиши данные в конструктор сверху.

Где место Trojan

Сразу рамка, чтобы не было завышенных ожиданий. Trojan — это резерв, а не основной канал под РФ. Его смысл в том, что он другого протокольного «вида»: если у клиента начали фингерпринтить именно VLESS-паттерн, Trojan под ту же волну может не попасть — снаружи он выглядит как обычный HTTPS-сайт. При «тыке» браузером отдаёт настоящую страницу через fallback, а проксирует только клиентов с верным паролем.

Но голый Trojan+TLS светит SNI твоего домена ровно так же, как честный VLESS+TLS, — и режется по списку доменов. Поэтому если и брать Trojan под DPI, то в связке с Reality. Ниже оба варианта.

Вариант A — Trojan + TLS (свой домен, есть fallback на сайт)

Честный TLS на твоём сертификате, с fallback на реальную страницу. Сначала серт:

bash
apt -y install certbot
certbot certonly --standalone -d your-domain.com -m admin@your-domain.com --agree-tos --non-interactive

Конфиг-профиль целиком:

config.json
{
  "log": { "loglevel": "none" },
  "inbounds": [
    {
      "tag": "trojan-tls",
      "listen": "0.0.0.0",
      "port": 443,
      "protocol": "trojan",
      "settings": {
        "clients": [{ "password": "СИЛЬНЫЙ_ПАРОЛЬ" }],
        "fallbacks": [{ "dest": "8080" }]
      },
      "sniffing": { "enabled": true, "destOverride": ["http", "tls", "quic"] },
      "streamSettings": {
        "network": "raw",
        "security": "tls",
        "tlsSettings": {
          "serverName": "your-domain.com",
          "alpn": ["h2", "http/1.1"],
          "certificates": [
            {
              "certificateFile": "/etc/letsencrypt/live/your-domain.com/fullchain.pem",
              "keyFile": "/etc/letsencrypt/live/your-domain.com/privkey.pem"
            }
          ]
        }
      }
    }
  ],
  "outbounds": [
    { "tag": "DIRECT", "protocol": "freedom" },
    { "tag": "BLOCK",  "protocol": "blackhole" }
  ],
  "routing": { "rules": [
    { "ip": ["geoip:private"], "outboundTag": "BLOCK" },
    { "domain": ["geosite:category-ads-all"], "outboundTag": "BLOCK" },
    { "protocol": ["bittorrent"], "outboundTag": "BLOCK" }
  ]}
}

fallbacks → dest 8080 — «левый» трафик без верного пароля уходит на реальный сайт/nginx на :8080, ткнёшься браузером — увидишь нормальную страницу. В панели clients можно оставить пустым (панель наполнит), пароль тут показан для наглядности.

Вариант B — Trojan + Reality (без своего домена/серта)

Стелс надёжнее — Reality маскирует под чужой донор, свой серт не нужен. Ключи:

bash
xray x25519          # privateKey → в конфиг
openssl rand -hex 8  # shortId
config.json
{
  "log": { "loglevel": "none" },
  "inbounds": [
    {
      "tag": "trojan-reality",
      "listen": "0.0.0.0",
      "port": 443,
      "protocol": "trojan",
      "settings": { "clients": [{ "password": "СИЛЬНЫЙ_ПАРОЛЬ" }] },
      "sniffing": { "enabled": true, "destOverride": ["http", "tls", "quic"] },
      "streamSettings": {
        "network": "raw",
        "security": "reality",
        "realitySettings": {
          "show": false,
          "target": "your-donor.de:443",
          "serverNames": ["your-donor.de"],
          "privateKey": "PRIVATE_KEY_X25519",
          "shortIds": ["REALITY_SHORT_ID"]
        }
      }
    }
  ],
  "outbounds": [
    { "tag": "DIRECT", "protocol": "freedom" },
    { "tag": "BLOCK",  "protocol": "blackhole" }
  ],
  "routing": { "rules": [
    { "ip": ["geoip:private"], "outboundTag": "BLOCK" },
    { "domain": ["geosite:category-ads-all"], "outboundTag": "BLOCK" },
    { "protocol": ["bittorrent"], "outboundTag": "BLOCK" }
  ]}
}

Host в панели

Host
Password     : СИЛЬНЫЙ_ПАРОЛЬ
Address      : your-domain.com   (или IP/домен ноды)
Port         : 443
SNI / Host   : your-domain.com   (Вариант B — your-donor.de)
publicKey    : REALITY_PUBLIC_KEY  (только Вариант B)
shortId      : REALITY_SHORT_ID    (только Вариант B)
fingerprint  : firefox

Почему это устаревает

Честная часть. Trojan — уходящая натура, и вот почему я не строю на нём сервис:

  • Голый Trojan+TLS светит SNI — та же уязвимость, что у честного VLESS+TLS, режется по списку доменов. Без Reality под жёстким РФ-DPI он заметен.
  • Reality-обвязка спасает, но тогда проще взять VLESS+Reality — тот же стелс, более развитая экосистема, активная поддержка. Trojan оправдан только как «другой вид» для разнообразия протоколов на ноде.
  • Пароль делай длинным, без пробелов (openssl rand -hex 16), одинаковым на сервере и хосте. Это единственный секрет Trojan — слабый пароль убивает всю схему.

Итог: Trojan держи как резервный протокол другого «вида» на случай точечного фингерпринта VLESS, но основной канал строй на VLESS+Reality. Механику Reality, которая и тут делает основную работу, разбирал в теории про Reality.

Следующий гайд Shadowsocks: почему это уже не вариант → Не понравилась статья или что-то непонятно? Напишите мне — помогу или поправлю. @notrealvpn →
Материал носит образовательный характер и посвящён инженерии сетевой инфраструктуры. Вы отвечаете за соблюдение законов своей юрисдикции.