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
- Рукопожатие TLS. Клиент подключается к серверу, обычно на порт 443, и начинает TLS с именем сервера (SNI), например
trojan.example.com. Сервер предъявляет действительный сертификат для этого имени. - Запрос Trojan. Внутри зашифрованного соединения клиент отправляет хеш SHA-224 от пароля, команду (connect или UDP associate) и адрес назначения, например
example.org:443. - Проверка. Сервер сравнивает хеш с паролями своих пользователей.
- Передача или fallback. Если хеш совпал, сервер подключается к адресу назначения и передает данные в обе стороны. Если нет, сервер отдает все соединение резервному веб-серверу (fallback), и посетитель видит обычный сайт.
- 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 проще, не требует сертификата и дает меньше накладных расходов. Многие провайдеры предлагают оба протокола, так что можно попробовать каждый.