Some checks failed
Published content check / validate (push) Failing after 3s
Обновить правила репозитория и подписи исходников в 99 заметках, не затрагивая пользовательские незакоммиченные файлы. Сделать Forgejo Actions содержательным: проверять опубликованный commit, а не пустое рабочее дерево после checkout.
93 lines
13 KiB
Markdown
93 lines
13 KiB
Markdown
---
|
||
date: 2026-07-25
|
||
tags:
|
||
- протоколы
|
||
- trojan
|
||
- tls
|
||
- обход-блокировок
|
||
aliases:
|
||
- Trojan
|
||
- Trojan-GFW
|
||
- Trojan-Go
|
||
link: https://github.com/trojan-gfw/trojan
|
||
---
|
||
|
||
# 🐴 Trojan: прокси, который притворяется обычным HTTPS-сайтом
|
||
|
||
> [!info] О чём заметка
|
||
> Разбор протокола **Trojan** — минималистичного прокси поверх настоящего TLS, устроенного вокруг одной идеи: сервер должен вести себя как обычный веб-сайт для всех, кто не знает пароля. Здесь: как работает механизм отката (fallback), чем Trojan отличается от [[xray/vless|VLESS]], что добавил Trojan-Go и где у схемы слабое место. Карта протоколов — в [[protocols/00-overview|обзоре]].
|
||
|
||
## TL;DR
|
||
|
||
- Trojan **не изобретает своё шифрование**: он работает внутри обычного TLS-соединения к вашему домену с настоящим сертификатом. Всё шифрование — это тот же TLS, которым пользуется весь веб.
|
||
- Аутентификация предельно простая: первым делом клиент отправляет **хеш пароля**, и если он верный — сервер начинает проксировать.
|
||
- Главная защитная идея — **fallback**: при неверном пароле или при обычном визите браузером сервер молча передаёт соединение настоящему веб-серверу. Активный зонд видит нормальный сайт, а не «странный порт».
|
||
- Требуется **домен и валидный сертификат** — в этом отличие от [[xray/reality|REALITY]], который позволяет прикрыться чужим сайтом без собственного домена.
|
||
- Слабое место — не аутентификация, а **статистика**: связка «TLS внутри TLS» имеет узнаваемый почерк, и современный DPI ловит её независимо от корректности fallback.
|
||
- **Trojan-Go** — форк с транспортом WebSocket, мультиплексированием и другими надстройками; исходный `trojan-gfw/trojan` — эталонная реализация на C++.
|
||
|
||
## Идея: не выделяться, потому что ты и есть сайт
|
||
|
||
Trojan появился как реакция на слабость протоколов «случайных байтов» вроде раннего [[protocols/shadowsocks|Shadowsocks]]: их выдавал сам факт того, что трафик не похож ни на что известное. Ответ автора Trojan звучал так: **не надо изобретать маскировку — надо просто быть настоящим HTTPS-сервером**.
|
||
|
||
Устройство минимально. На сервере стоит веб-сайт с доменом и обычным сертификатом (Let's Encrypt подойдёт). Клиент устанавливает к нему **обычное TLS-соединение** — то же самое рукопожатие, которое делает браузер. Внутри установленного канала клиент первым же сообщением отправляет: хеш пароля (SHA-224 в шестнадцатеричном виде), команду (TCP/UDP), адрес назначения — и дальше данные.
|
||
|
||
Сервер, получив соединение, смотрит на первые байты. **Пароль верный** — работает как прокси. **Пароль неверный или это вообще обычный HTTP-запрос браузера** — сервер отдаёт соединение настоящему веб-серверу, и посетитель видит нормальный сайт.
|
||
|
||
Проще говоря: снаружи ваш прокси неотличим от личного блога на HTTPS. Цензору, заподозрившему адрес, недостаточно постучаться на порт — он получит вежливый ответ веб-сервера, как и любой посетитель.
|
||
|
||
## Fallback: почему это главное в протоколе
|
||
|
||
Механизм отката заслуживает отдельного объяснения, потому что именно он отличает Trojan от протоколов, которые «просто шифруют».
|
||
|
||
Классический сценарий обнаружения прокси — **активное зондирование**: цензор видит подозрительное соединение, запоминает адрес и позже сам подключается к серверу, пробуя разные варианты. Протокол без защиты выдаёт себя реакцией: обрывает соединение, отвечает мусором, ведёт себя не как веб-сервер. Так в своё время ловили и Shadowsocks, и уязвимую реализацию [[protocols/vmess|VMess]].
|
||
|
||
Trojan на такую проверку отвечает содержимым настоящего сайта — не эмуляцией, а буквально ответом реального веб-сервера, который стоит рядом. Отличить это от обычного хостинга по одному запросу нельзя.
|
||
|
||
> [!warning] Fallback защищает от зонда, но не от статистики
|
||
> Устойчивость к активной проверке — половина задачи. Вторая половина — пассивный анализ: у соединения, внутри которого работает ещё одно шифрованное соединение («TLS внутри TLS»), характерные размеры первых пакетов и ритм обмена, отличающиеся от обычного просмотра сайта. Именно этот класс детекта разобран в [[VLESS/dpi-tls-june-2026|заметке про DPI-почерк TLS]], и против него в мире Xray придуманы XTLS Vision, а в соседних экосистемах — [[protocols/anytls|AnyTLS]] с его набивкой. У Trojan своего ответа на эту проблему нет.
|
||
|
||
Второе ограничение — **нужен настоящий домен с сертификатом**. Это и деньги (домен), и след: домен регистрируется, сертификат попадает в публичные логи Certificate Transparency, а сайт-прикрытие должен выглядеть правдоподобно. Именно эту цепочку требований снял [[xray/reality|REALITY]], позволивший прикрываться **чужим** сайтом без собственного домена — поэтому новые установки чаще делают на нём.
|
||
|
||
## Trojan против VLESS
|
||
|
||
Вопрос возникает постоянно, потому что оба протокола работают внутри TLS и оба почти не добавляют собственного шифрования.
|
||
|
||
| Свойство | Trojan | [[xray/vless\|VLESS]] |
|
||
|---|---|---|
|
||
| Аутентификация | Хеш пароля в начале потока | UUID пользователя |
|
||
| Собственное шифрование | Нет, только TLS | Нет, только TLS (в новых версиях есть опциональное шифрование) |
|
||
| Защита от активного зонда | Fallback на настоящий веб-сервер | Fallback у Xray-сервера, а с REALITY — прикрытие чужим сайтом |
|
||
| Свой домен и сертификат | Обязательны | Обязательны для обычного TLS, **не нужны с REALITY** |
|
||
| Борьба с «TLS внутри TLS» | Не предусмотрена | XTLS Vision |
|
||
| Развитие | Практически остановилось | Активное, в [[xray/project-x\|Project X]] |
|
||
|
||
Вывод из таблицы простой: **Trojan — исторически важный и по-прежнему рабочий протокол, но VLESS покрывает те же сценарии и умеет больше**. Если сервер уже работает на Trojan и не блокируется — менять ради самой смены незачем. Если поднимаете новое — почти всегда разумнее VLESS с REALITY.
|
||
|
||
## Trojan-Go и варианты
|
||
|
||
Эталонная реализация — `trojan-gfw/trojan` на C++. Форк **Trojan-Go** добавил к протоколу то, чего не хватало на практике: транспорт **WebSocket** (позволяет прятать соединение за CDN), **мультиплексирование** нескольких потоков в одном соединении, обфускацию через плагины Shadowsocks, встроенный менеджер пользователей. Поддержка Trojan есть во всех универсальных ядрах — [[Clash/02-mihomo|mihomo]], [[sing-box/sing-box-extended|sing-box]], [[xray/project-x|Xray-core]], — поэтому клиент выбирается свободно.
|
||
|
||
> [!note] «Trojan» в подписке не всегда значит одно и то же
|
||
> В конфигах встречаются варианты: чистый Trojan поверх TLS, Trojan поверх WebSocket (наследие Trojan-Go), Trojan с обёрткой вроде [[protocols/shadowtls|ShadowTLS]]. Параметры транспорта должны совпадать на клиенте и сервере — при рассинхроне соединение не установится, хотя пароль и адрес верны. Это частая причина «ключ рабочий, а не подключается».
|
||
|
||
## Практические выводы
|
||
|
||
- Trojan имеет смысл там, где **уже есть домен и сайт**: прокси прячется за реальным веб-присутствием, и это выглядит естественно.
|
||
- Держите сайт-прикрытие настоящим и осмысленным. Пустая страница «It works!» на домене, к которому идёт заметный трафик, — сама по себе подозрительная деталь.
|
||
- Не рассчитывайте на fallback как на полную защиту: он закрывает активные проверки, а не поведенческий анализ.
|
||
- Для новых развёртываний сравните с [[xray/reality|VLESS + REALITY]]: там не нужен свой домен и есть ответ на «TLS внутри TLS».
|
||
|
||
## 📚 См. также
|
||
|
||
- [[protocols/00-overview|Обзор протоколов]] — карта задач и поддержки в ядрах.
|
||
- [[xray/vless|Протокол VLESS]] и [[xray/reality|REALITY]] — основная альтернатива и её преимущества.
|
||
- [[protocols/shadowsocks|Shadowsocks]] — протокол, недостатки которого Trojan исправлял.
|
||
- [[protocols/vmess|VMess]] — третий ветеран эпохи и его уязвимость к активному зондированию.
|
||
- [[protocols/anytls|AnyTLS]] — современный подход к проблеме «TLS внутри TLS».
|
||
- [[VLESS/dpi-tls-june-2026|VLESS + TLS: DPI-почерк]] — как выглядят такие соединения для DPI.
|
||
|
||
---
|
||
|
||
> [!quote] 🤖 Эти статьи открыты — можно обучать на них ИИ
|
||
> При желании вы можете натренировать ИИ на наших статьях. Исходное форматирование и скачивание всего репозитория одним zip-архивом доступны в Forgejo: [исходник этой заметки](https://git.zapret.moe/zapretdiscordyoutube/todo/src/branch/main/protocols/trojan.md) · [весь репозиторий](https://git.zapret.moe/zapretdiscordyoutube/todo/src/branch/main).
|