Trojan-Go на Debian 12: пошаговая установка
Trojan-Go — протокол, который прячет ваш VPN-трафик внутри обычного TLS-соединения на 443-м порту, так что снаружи он неотличим от захода на HTTPS-сайт. Это удобно там, где DPI режет OpenVPN и WireGuard по сигнатурам, но требует аккуратной настройки: без реального домена и сертификата маскировка не сработает. Ниже — рабочая установка на чистый Debian 12, с конфигом, systemd-юнитом и проверкой, что сервер действительно выглядит как обычный сайт.
Содержание
Обсудить статью, задать вопрос или начать новую тему
Есть вопрос по этой статье, идея для обсуждения или просто хотите поделиться опытом? Сообщество MAATRIX ждёт. Для общения, пожалуйста, зарегистрируйтесь в нашем личном кабинете.
Перейти в сообщество →Что такое Trojan-Go и когда его стоит выбирать
Trojan-Go — реализация протокола Trojan на Go от разработчика p4gefau1t, с поддержкой мультиплексирования (mux), WebSocket-транспорта и маршрутизации по geosite/geoip. Идея протокола простая: клиент подключается к серверу по стандартному TLS, как браузер к HTTPS-сайту, а сервер по паролю в первом байте отличает «своего» клиента от случайного сканера DPI и перенаправляет его трафик дальше, в интернет. Случайному наблюдателю, включая DPI, соединение выглядит как обычный TLS-хендшейк к легитимному домену.
Важный нюанс, который стоит проговорить честно: сам проект trojan-go давно не получает активных релизов — последняя стабильная версия вышла в 2021 году, и с тех пор разработка практически остановлена. Протокол по-прежнему работает и пробивает многие виды блокировок, но если вы начинаете с нуля и не привязаны конкретно к Trojan, разумно параллельно посмотреть на Xray с VLESS и XTLS — эта связка активно поддерживается и по маскировке решает ту же задачу, местами лучше. Trojan-Go имеет смысл, если вам нужна именно классическая простота Trojan-протокола, готовые клиенты под все платформы или совместимость с уже существующей инфраструктурой на этом протоколе.
Подготовка сервера: домен, DNS и порты
Маскировка под HTTPS работает только при наличии настоящего домена с валидным сертификатом — без него клиенты будут получать предупреждения о сертификате, а DPI-системы легко отличат самоподписанный TLS от нормального. Если домена ещё нет, привяжите его к IP сервера через A-запись; процесс подробно описан в статье про настройку домена и DNS на Debian 12.
Понадобятся:
- Debian 12 с правами root или sudo;
- домен, A-запись которого указывает на IP сервера;
- открытые порты 80 и 443 (80 нужен временно для выпуска сертификата).
Проверьте, что домен резолвится на нужный IP, прежде чем идти дальше:
dig +short ваш-домен.ru
Результат должен совпадать с IP сервера. Если DNS ещё не обновился, подождите — TTL записи может занимать от нескольких минут до пары часов.
Обновите систему и поставьте базовые утилиты:
apt update && apt upgrade -y
apt install -y curl wget unzip socat cron
Арендуйте сервер под свои задачи!
Разверните VPS MAATRIX за пару минут: NVMe, AMD EPYC, root-доступ, локации UK, США, Франция и РФ. Оплата картой РФ и по СБП.
Арендовать серверУстановка Trojan-Go на Debian 12
Готовых пакетов в репозиториях Debian нет, поэтому берём бинарник напрямую со страницы релизов проекта на GitHub. На момент написания последний стабильный релиз — v0.10.6; перед установкой стоит заглянуть на страницу Releases репозитория p4gefau1t/trojan-go и убедиться, что используете актуальную для себя версию — новых официальных релизов давно не выходило, но зеркала и форки иногда публикуют пересборки.
cd /tmp
wget https://github.com/p4gefau1t/trojan-go/releases/download/v0.10.6/trojan-go-linux-amd64.zip
unzip trojan-go-linux-amd64.zip -d trojan-go
sudo mv trojan-go/trojan-go /usr/local/bin/trojan-go
sudo chmod +x /usr/local/bin/trojan-go
Проверьте, что бинарник запускается:
trojan-go --version
Создайте рабочие каталоги — для конфига и логов:
sudo mkdir -p /usr/local/etc/trojan-go
sudo mkdir -p /var/log/trojan-go
TLS-сертификат и маскировка под HTTPS
Для сертификата проще всего взять acme.sh — он не требует отдельного веб-сервера и умеет выпускать сертификаты Let's Encrypt в автономном режиме.
curl https://get.acme.sh | sh -s email=ваш-email@example.com
source ~/.bashrc
Временно освободите 80-й порт (если на сервере уже что-то слушает его — остановите), затем выпустите сертификат:
~/.acme.sh/acme.sh --issue -d ваш-домен.ru --standalone --keylength ec-256
Скопируйте сертификат и ключ в рабочую директорию Trojan-Go:
mkdir -p /usr/local/etc/trojan-go/cert
~/.acme.sh/acme.sh --install-cert -d ваш-домен.ru --ecc \
--key-file /usr/local/etc/trojan-go/cert/privkey.pem \
--fullchain-file /usr/local/etc/trojan-go/cert/fullchain.pem \
--reloadcmd "systemctl restart trojan-go"
Флаг --reloadcmd важен: acme.sh ставит автопродление в cron, и при каждом обновлении сертификата сервис Trojan-Go будет перезапускаться сам, без вашего участия.
Второй элемент маскировки — fallback-сайт. Trojan-Go умеет проксировать «нераспознанный» TLS-трафик (без правильного пароля Trojan) на локальный веб-сервер, чтобы сканер DPI, зашедший на ваш домен напрямую, увидел обычную страницу, а не отказ в соединении. Проще всего поднять для этого лёгкий nginx с любой статичной страницей на порту 80 — конкретные шаги настройки firewall под эту схему описаны в статье про настройку faervola на Debian 12.
Конфигурация: config.json и systemd
Создайте основной конфиг сервера:
nano /usr/local/etc/trojan-go/config.json
Минимально рабочий вариант:
{
"run_type": "server",
"local_addr": "0.0.0.0",
"local_port": 443,
"remote_addr": "127.0.0.1",
"remote_port": 80,
"password": [
"замените-на-длинный-случайный-пароль"
],
"ssl": {
"cert": "/usr/local/etc/trojan-go/cert/fullchain.pem",
"key": "/usr/local/etc/trojan-go/cert/privkey.pem",
"sni": "ваш-домен.ru"
},
"mux": {
"enabled": true,
"concurrency": 8
}
}
Ключевые поля:
| Параметр | Назначение |
|---|---|
local_port | порт, на котором Trojan-Go слушает входящие TLS-соединения (обычно 443) |
remote_addr/remote_port | куда отправлять трафик без верного пароля Trojan — адрес fallback-сайта |
password | список паролей клиентов, можно указать несколько для разных пользователей |
ssl.sni | домен, под который выдан сертификат — должен совпадать с A-записью |
mux.enabled | мультиплексирование соединений, снижает накладные расходы на множестве мелких запросов |
Пароль генерируйте не руками, а случайной строкой:
openssl rand -base64 24
Создайте systemd-юнит для автозапуска:
nano /etc/systemd/system/trojan-go.service
[Unit]
Description=Trojan-Go Service
After=network.target
[Service]
Type=simple
User=root
ExecStart=/usr/local/bin/trojan-go -config /usr/local/etc/trojan-go/config.json
Restart=on-failure
RestartSec=5s
[Install]
WantedBy=multi-user.target
Примените и запустите:
systemctl daemon-reload
systemctl enable trojan-go
systemctl start trojan-go
systemctl status trojan-go
В логах не должно быть ошибок вида bind: address already in use (обычно значит, что 443-й порт занят чем-то ещё, например включённым тестовым nginx) или ошибок чтения сертификата — они чаще всего означают опечатку в пути к файлам .pem.
Firewall и проверка, что маскировка работает
Оставьте открытыми только нужные порты. Если используете ufw:
ufw allow 22/tcp
ufw allow 443/tcp
ufw allow 80/tcp
ufw enable
Порт 80 нужен и дальше — для продления сертификата и для fallback-сайта. Остальные сервисные порты закрывайте по умолчанию.
Проверьте, что сервис слушает 443:
ss -tlnp | grep 443
Теперь ключевая проверка маскировки: зайдите на домен обычным браузером или curl, не указывая пароль Trojan — вы должны увидеть fallback-страницу, а не ошибку соединения или редирект на сам Trojan:
curl -v https://ваш-домен.ru
Если вместо страницы приходит отказ в соединении — DPI-анализ на этом домене мгновенно отличит его от обычного сайта, и часть смысла в маскировке теряется. Проверьте, что remote_addr/remote_port в конфиге действительно указывают на живой веб-сервер.
Подключение клиента и проверка работы
Клиенту нужны: адрес сервера, порт 443, пароль из конфига и SNI, совпадающий с доменом. Формат ссылки:
trojan://пароль@ваш-домен.ru:443?sni=ваш-домен.ru#мой-сервер
Такую ссылку принимают большинство современных клиентов — v2rayN и NekoRay на Windows, Shadowrocket на iOS, v2rayNG на Android, Qv2ray с плагином trojan-go на Linux/macOS. Импортируйте ссылку или введите параметры вручную, отключите «allow insecure» (небезопасный TLS без проверки сертификата) — если сертификат от Let's Encrypt настроен верно, эта опция не нужна и её включение только снижает защиту.
После подключения проверьте реальный внешний IP на клиенте (например, через любой сервис проверки IP) — он должен показать IP вашего сервера, а не домашний. Если соединение устанавливается, но трафик не идёт — почти всегда причина в remote_addr/remote_port, указывающих не туда, либо в том, что fallback-сайт и сам Trojan-Go конфликтуют за один порт.
Если позже понадобится сравнить Trojan с более активно развиваемыми протоколами на том же принципе маскировки, у нас есть отдельный разбор Shadowsocks против VLESS — многие соображения по выбору переносятся и на пару Trojan/VLESS-REALITY.
Арендуйте сервер под свои задачи!
Разверните VPS MAATRIX за пару минут: NVMe, AMD EPYC, root-доступ, локации UK, США, Франция и РФ. Оплата картой РФ и по СБП.
Арендовать серверНужны сами нейросети для контента?
Генерируйте изображения, видео и озвучку нейросетями на falapi.io — десятки моделей в одном окне. Оплата картой РФ и по СБП.
Частые вопросы
Trojan-Go и Trojan (оригинальный, на C++) — это одно и то же?
Нет, это два разных проекта с похожим протоколом. Trojan-Go написан на Go, имеет встроенный mux и WebSocket-транспорт, конфиг чуть отличается по синтаксису. Клиенты, поддерживающие протокол Trojan, обычно совместимы с обоими.
Обязательно ли поднимать отдельный nginx для fallback-страницы?
Нет, можно направить remote_addr/remote_port на любой уже работающий на сервере веб-сервис, лишь бы он отвечал на HTTP-запросы правдоподобно. Главное — не оставлять этот адрес пустым или недоступным.
Можно ли использовать самоподписанный сертификат вместо Let's Encrypt?
Технически да, но тогда теряется весь смысл маскировки: DPI и любой внешний наблюдатель легко отличит самоподписанный сертификат от настоящего, и соединение будет выделяться на фоне обычного HTTPS-трафика.
Trojan-Go режется провайдерами так же, как OpenVPN?
На практике Trojan-Go в среднем сложнее выявить сигнатурным анализом, потому что трафик неотличим от TLS 1.3 к обычному сайту. Но гарантий здесь никто не даёт — эффективность блокировок и обхода меняется со временем и зависит от конкретного провайдера.
Стоит ли использовать Trojan-Go на новом сервере в 2026 году, если проект не обновляется?
Если вам важна активная поддержка и новые фичи — лучше смотреть на Xray с VLESS-REALITY. Если нужна проверенная временем простая схема и вас устраивает нынешняя функциональность — Trojan-Go по-прежнему рабочий вариант, просто не ждите новых релизов от апстрима.
Обсудить статью, задать вопрос или начать новую тему
Есть вопрос по этой статье, идея для обсуждения или просто хотите поделиться опытом? Сообщество MAATRIX ждёт. Для общения, пожалуйста, зарегистрируйтесь в нашем личном кабинете.
Перейти в сообщество →