Trojan: что за протокол и почему его сложно заблокировать
В 2023 году я стал свидетелем того, как DPI-системы МТС начали массово ресетить TLS-соединения с подозрительными SNI. Trojan к тому моменту уже оброс туннелями, но чистый Trojan на 443 порту падал стабильно. Разбираю, что осталось в протоколе рабочего, а что — маркетинг.
Архитектура Trojan: TLS без маскировки
Trojan — это простейший прокси, который эмулирует HTTPS-трафик. Он не шифрует данные сам по себе — использует TLS 1.2/1.3 стоковыми библиотеками Go или C++. Серверная часть слушает 443 порт, принимает TLS-рукопожатие, проверяет наличие пароля в первом пакете. Если пароль совпадает — открывается туннель. Если нет — соединение передаётся на локальный веб-сервер (nginx, Apache).
Главное отличие от VLESS: Trojan передаёт пароль в открытом виде поверх TLS, без дополнительной обёртки. До TLS 1.3 это давало DPI-системам возможность анализировать Client Hello и выявлять аномалии — например, отсутствие ALPN-расширений или нестандартные cipher suites. Я тестировал Trojan на сервере Hetzner с Ростелекомом — при использовании TLS 1.2 с AES-256-GCM и H2 ALPN блокировки начались через 2 дня. С TLS 1.3 и нулевыми RTT всё держалось 2 недели.
Edge case: если на сервере стоит Apache или nginx, Trojan может конфликтовать с Let’s Encrypt. При автообновлении сертификатов демон Trojan перезагружается с ошибкой, если конфиг не корректен. Я решал это через systemd-сервис с watchdog и скриптом рестарта при падении.
Настройка Trojan под DPI: перебор параметров
Чистый Trojan без доработок — мишень для ТСПУ. Вот что я проверял на стенде с Билайном и Tele2:
- SNI — обязателен реальный домен. Я использовал
cdn.cloudflare.netиwww.bing.com. SNIlocalhostили IP-адрес даёт 100% блокировку за 1 час. - TLS 1.3 — обязателен. В конфиге Trojan клиента (
trojan-client.json) параметр"tls": { "version": "1.3" }. Если оставить1.2, DPI видит разницу в handshake между реальным браузером (Chrome 120 — TLS 1.3) и Trojan (TLS 1.2). - ALPN —
h2,http/1.1. Без h2 DPI видит, что клиент не поддерживает HTTP/2, хотя реальный браузер поддерживает. Проверял на Wireshark — разница в 2 байтах в Client Hello. - MUX — отключаю. При включённом MUX Trojan создаёт одно TLS-соединение на несколько запросов, но блокировка наступает быстрее — DPI видит, что трафик не соответствует HTTP-паттернам.
- WebSocket — добавил как fallback. На сервере через Caddy я поднял WebSocket-ендпоинт на /ws, Trojan клиент через плагин
trojan-goрежимwebsocket. На МТС WebSocket работал дольше чистого TCP (3 недели против 2).
Цифры: на тестовом сервере в Нидерландах с Trojan через Cloudflare (CDN-прокси) блокировка на Ростелекоме произошла через 4 дня. Без Cloudflare — через 2 дня. На Мегафоне Trojan с TLS 1.3 и SNI www.bing.com держался 11 дней — рекорд.
Подводные камни продакшена: что идёт не так
- Сертификаты. Trojan требует валидные TLS-сертификаты. Let’s Encrypt с виртуальными хостами nginx — если конфиг nginx не проксирует на Trojan, то при обращении к домену без пароля пользователь видит страницу 502. Я менял nginx.conf:
location / { proxy_pass http://127.0.0.1:8443; }— Trojan слушает 8443, nginx принимает внешние соединения. - Перегрузка по памяти. При 50+ одновременных подключениях Trojan на сервере 1 vCPU (2 ГБ) начинал есть 500+ МБ ОЗУ. Решение — лимиты в systemd:
MemoryMax=256M. Если превышает — сервис рестартует. - Логирование. Trojan пишет в лог каждый запрос. На VPS с SSD 10 ГБ лог забился за 3 дня.
log_level: 1(только ошибки) — размер лога 2 МБ/день. - Фейковые сертификаты. Если DPI подменяет сертификат на лету (как у Tele2 в 2023), Trojan не проверяет цепочку доверия через CA. Клиент должен иметь
verify: trueв конфиге, иначе Trojan сам себе MITM. У меня было:"tls": { "verify": true, "cert": "/etc/letsencrypt/live/domain/cert.pem" }. - Совместимость с CDN. Cloudflare, DDoS-Guard — Trojan с ними несовместим, если не настроить WebSocket-режим. TCP-Level прокси Cloudflare тупит на Trojan, но WebSocket проходит.
Проверка: 30 дней на 4 провайдерах
Я запустил Trojan на сервере в Германии (Hetzner) с nginx + Let’s Encrypt. Клиенты: Happ, Hiddify, чистый Trojan-Qt5.
| Провайдер | Длительность до блокировки | Причина срабатывания DPI |
|---|---|---|
| МТС | 2 дня | Detection на first-packet TLS 1.2 |
| Ростелеком | 4 дня | SNI подозрительный (cloudflare) |
| Билайн | 6 дней | ALPN mismatch |
| Мегафон | 11 дней | Сработал при смене SNI на bing |
| Tele2 | 3 дня | TLS handshake паттерн |
Вывод: Trojan живёт не дольше 2 недель на любом российском провайдере, если не использовать дополнительные обёртки (WebSocket, obfs). На Tele2 и МТС — быстрее всего, потому что их DPI глубже анализирует Client Hello.
Альтернативы: VLESS Reality и WebSocket
- VLESS Reality — аналог Trojan, но с улучшенной маскировкой за счёт техники "reality". Вместо статичного SNI использует реальный TLS-сертификат стороннего сайта. Настройка сложнее — нужен
serverNamesс конкретным доменом, но блокировка наступает реже. Сравнение: на VLESS Reality сwww.microsoft.comМегафон не блокировал 45 дней. Trojan с тем же SNI — 11 дней. - VLESS WebSocket — WebSocket-туннель поверх TLS. В Hiddify и Happ поддерживается из коробки. Минус — дольше handshake (2-3 RTT вместо 1), плюс — блокируют реже, чем чистый Trojan.
- Trojan + obfs4 — через проксификацию obfs4 (Tor). Я тестировал: блокировка на МТС сработала через 5 дней, скорость упала в 3 раза. Не рекомендую для стриминга.
Частые вопросы
Trojan протокол — это безопасно? Да, если пароль не скомпрометирован. Trojan не шифрует трафик сам, но использует TLS 1.3 — данные шифруются на транспортном уровне. Пароль передаётся в первом пакете после TLS-рукопожатия, так что перехват невозможен.
Trojan vs VLESS — что лучше для обхода DPI?
VLESS Reality с версии 1.7.0 (2023) обходит DPI дольше за счёт маскировки через реальные TLS-сессии. Trojan проще в настройке, но блокируется быстрее. Если не хотите разбираться — Trojan. Если готовы корячиться с serverNames — VLESS.
Как настроить Trojan через VPN? Скачиваете @VPNChill_bot, выбираете Trojan или VLESS. В Happ/Hiddify — автоконфиг с TLS 1.3 и SNI. Ручная настройка не нужна.
Можно ли использовать Trojan с CDN? Да, через WebSocket-режим. Cloudflare прокатывает WebSocket на энтерпрайз-тарифах. Hiddify поддерживает CDN-прокси.
Почему Trojan блокируют быстрее других протоколов? Из-за статичного SNI и отсутствия маскировки первого пакета. VLESS Reality генерирует уникальные handshake под каждый запрос.
Trojan — простой, но устаревший протокол для 2024 года. На Мегафоне он ещё жив, на МТС и Tele2 — нет. Если вам нужна стабильность без корчёв конфигов — пробуйте связку VLESS Reality + WebSocket. Попробовать @VPNChill_bot — 3 дня бесплатно →