Trojan — это протокол прокси, который прячется внутри TLS, того же шифрования, что защищает сайты по HTTPS. Устройство открывает обычное TLS-соединение с сервером, как правило на порту 443, и передает внутри него пароль и адрес, к которому нужно подключиться. Если пароль неверный, сервер ведет себя как обычный сайт, поэтому со стороны протокол Trojan выглядит как повседневный просмотр сайтов по HTTPS.

В этой статье разберем, что такое Trojan, как он работает, какие у него транспорты и как он сочетается с REALITY, его сильные и слабые стороны и как читать ссылку trojan://. Готовы настроить? См. как настроить Trojan на iPhone.

Что такое протокол Trojan?

Несмотря на название, Trojan не имеет отношения к вредоносным программам. Название отсылает к троянскому коню: трафик прокси путешествует внутри чего-то безобидного и привычного.

Trojan не изобретает собственное шифрование. Он полагается на TLS и добавляет поверх очень небольшой заголовок: хеш пароля, команду и адрес назначения. Поэтому протокол простой, а шифрование в нем — тот же хорошо изученный TLS, которым пользуются банки и браузеры.

Главная цель — не выделяться. Сегодня большая часть трафика в интернете — это HTTPS на порту 443. Сервер Trojan работает на этом порту с настоящим доменом и сертификатом, а все, кто не является правильным клиентом Trojan, получают в ответ настоящую веб-страницу.

Немного истории

Первая реализация, trojan-gfw, была написана на C++ и появилась примерно в 2019 году. Ее спецификация опубликована на странице протокола проекта. Затем появилась переписанная на Go версия trojan-go, в которую добавили транспорт WebSocket и мультиплексирование. Сегодня Trojan встроен в большинство мультипротокольных серверов и клиентов, включая Xray, sing-box и Mihomo, а эти проекты добавили новые транспорты и поддержку REALITY.

Как работает Trojan

  1. Рукопожатие TLS. Клиент подключается к серверу, обычно на порт 443, и начинает TLS с именем сервера (SNI), например trojan.example.com. Сервер предъявляет действительный сертификат для этого имени.
  2. Запрос Trojan. Внутри зашифрованного соединения клиент отправляет хеш SHA-224 от пароля, команду (connect или UDP associate) и адрес назначения, например example.org:443.
  3. Проверка. Сервер сравнивает хеш с паролями своих пользователей.
  4. Передача или fallback. Если хеш совпал, сервер подключается к адресу назначения и передает данные в обе стороны. Если нет, сервер отдает все соединение резервному веб-серверу (fallback), и посетитель видит обычный сайт.
  5. UDP. UDP-пакеты передаются в виде кадров внутри того же TLS-соединения.
iPhone ──TLS (SNI trojan.example.com)──▶ Trojan server ──▶ example.org
                                          │
                     wrong password ──────┴──▶ ordinary website (fallback)

Именно fallback отличает Trojan от Shadowsocks. Проба, подключившаяся к серверу, получает обычную веб-страницу, а не оборванное соединение.

Транспорты: только TLS, WebSocket и gRPC

Обычный Trojan работает напрямую поверх TLS. Большинство серверов также предлагают транспорт, который передает поток Trojan внутри другого протокола:

  • WebSocket работает внутри обычного HTTPS-запроса. CDN и обратные прокси понимают WebSocket, поэтому сервер можно спрятать за CDN и не раскрывать его настоящий IP-адрес.
  • gRPC работает поверх HTTP/2 и тоже проходит через многие CDN и обратные прокси.
  • HTTP/2 и HTTP Upgrade — похожие варианты, которые используют некоторые серверы.

Транспорты добавляют накладные расходы и параметры, которые нужно указать правильно, например путь или имя сервиса. Используйте транспорт, только если сервер на него настроен.

Trojan с REALITY

Классическому серверу Trojan нужны собственный домен и сертификат. REALITY, созданный в проекте Xray, избавляет от этого. Сервер заимствует рукопожатие TLS настоящего постороннего сайта. Клиенты, которые знают публичный ключ сервера и short ID, получают доступ к прокси. Всех остальных сервер перенаправляет на настоящий сайт.

Обычно REALITY используют вместе с VLESS, но серверы Trojan тоже его поддерживают. Подробнее — в статье Что такое VLESS + REALITY.

Сильные и слабые стороны

Сильные стороны

  • Выглядит как обычный HTTPS на порту 443.
  • Отвечает на пробы настоящим сайтом, а не молчанием.
  • Использует стандартный TLS, а не собственную криптографию.
  • Прост в реализации, поэтому широко поддерживается.
  • Передает и UDP, и TCP.

Слабые стороны

  • Нужны домен и действительный сертификат, если не использовать REALITY.
  • Рукопожатие TLS у клиента может отличаться от браузерного. Клиенты предлагают параметр отпечатка браузера, чтобы его повторить, но это лишь имитация.
  • Исследователи показали, что TLS внутри TLS — например, когда вы открываете HTTPS-сайты через Trojan, — может оставлять закономерности в размерах пакетов и их времени.
  • Неверный пароль не вызывает ошибку, а лишь показывает резервный сайт, поэтому ошибки сложнее заметить.
  • UDP внутри TCP-соединения страдает при потере пакетов, и это заметно в играх и звонках.

Trojan, Shadowsocks, VLESS и VMess: сравнение

Trojan Shadowsocks VLESS VMess
Шифрование TLS Собственные шифры TLS или REALITY Собственное, TLS по желанию
Выглядит как HTTPS Случайные байты HTTPS Случайные байты или HTTPS с TLS
Нужен сертификат Да, или REALITY Нет Да, или REALITY Только с TLS
UDP Да Да Да Да
Учетные данные Пароль Пароль или ключ UUID UUID

Для более подробного сравнения прочитайте Что такое Shadowsocks, VMess или VLESS и Сравнение протоколов прокси.

Как выглядит ссылка trojan://

Провайдеры делятся серверами Trojan в виде ссылок trojan://, часто как QR-коды:

trojan://password@host:port?parameters#name
  • password — пароль сервера в процентной кодировке.
  • host и port — адрес и порт сервера (443, если порт не указан).
  • parameters задают TLS и транспорт: sni — имя сервера, type — транспорт (tcp, ws, grpc), host и path — для WebSocket, serviceName — для gRPC, а security=reality вместе с pbk и sid — для REALITY.
  • name — название, которое покажет приложение.

Несколько примеров с паролем secret:

trojan://secret@trojan.example.com:443?sni=trojan.example.com#Basic
trojan://secret@trojan.example.com:443?security=tls&type=ws&host=cdn.example.com&path=%2Fws#WebSocket
trojan://secret@trojan.example.com:443?security=tls&type=grpc&serviceName=TrojanGun#gRPC
trojan://secret@trojan.example.com:443?security=reality&sni=www.example.com&pbk=Z84J2IelR9ch3k8VtlVhhs5ycBUlXA7wHBWcBrjqnAw&sid=0123abcd&fp=chrome#REALITY

Все параметры, которые читает Potatso, перечислены в справке по Trojan.

Trojan на iPhone

Встроенной поддержки Trojan в iOS нет, поэтому нужно приложение-клиент. Potatso — бесплатный прокси-клиент для iPhone и iPad: он импортирует ссылки trojan:// и trojan-go://, QR-коды и подписки Clash и поддерживает WebSocket, gRPC, HTTP/2, HTTP Upgrade и REALITY. Пошаговая инструкция: Как настроить Trojan на iPhone.

Частые вопросы

Протокол Trojan — это вирус?
Нет. Trojan — это протокол прокси, а не вредоносная программа. Он назван в честь троянского коня, потому что прячет трафик прокси внутри обычного на вид HTTPS-соединения, а не потому, что вредит устройству.
Нужны ли для Trojan домен и сертификат?
Классическому серверу Trojan нужны доменное имя и действительный сертификат TLS, потому что соединение — это настоящий TLS. Сервер Trojan с REALITY вместо этого заимствует рукопожатие TLS другого сайта, поэтому собственный сертификат ему не нужен.
Какой порт использует Trojan?
Обычно 443 — стандартный порт HTTPS, чтобы соединение выглядело как обычный веб-трафик. Подойдет любой порт, если сервер на него настроен, а ссылки trojan:// без порта используют 443.
Поддерживает ли Trojan UDP?
Да. Trojan передает UDP внутри того же TLS-соединения, что и TCP. В Clash-совместимых клиентах, включая Potatso, UDP для серверов Trojan по умолчанию выключен, так что включите его, если ваш сервер ретранслирует UDP.
Trojan лучше, чем Shadowsocks?
Зависит от сети. Trojan выглядит как HTTPS и отвечает на пробы как настоящий сайт, а Shadowsocks проще, не требует сертификата и дает меньше накладных расходов. Многие провайдеры предлагают оба протокола, так что можно попробовать каждый.

Другие языки: English · 简体中文 · 繁體中文 · 日本語