1. Зачем свой прокси
Публичные MTProto-прокси из интернета — удобны, но непредсказуемы: они падают без предупреждения, перегружаются, а иногда собирают метаданные. Собственный прокси на VPS лишён этих проблем при условии, что вы попадаете в его реалистичный сценарий применения (см. блок-предупреждение в начале статьи).
🔒 Приватность
Только вы контролируете сервер. Никаких третьих сторон, никакой телеметрии.
⚡ Скорость
Публичные прокси перегружены. Ваш — только для вас и тех, кому вы дали ссылку.
🛡️ Под вашим контролем
Публичный прокси выключают без предупреждения. Свой — вы выключаете сами.
👥 Для всей семьи
Поделитесь ссылкой с близкими: по нагрузке прокси тянет сотни клиентов.
2. Как работает mtg и FakeTLS
mtg (github.com/9seconds/mtg) — неофициальная реализация MTProto-прокси на Go от независимого разработчика. Актуальная версия — 2.2.8 (7 апреля 2026). Официальный прокси Telegram (TelegramMessenger/MTProxy) написан на C, тоже умеет FakeTLS и до сих пор получает коммиты (последние — август 2026), но релизов у него так и не было с 2018 года, а его официальный Docker-образ собран криво (см. раздел 11). Кроме mtg есть ещё активные реализации — прежде всего telemt на Rust: она умеет то же плюс спонсорский канал и несколько пользователей. Мы берём mtg: минимальный конфиг из двух строк, готовые бинарники и образ, встроенная самопроверка.
Поддерживает режим FakeTLS: при подключении клиент и прокси имитируют TLS-хендшейк с SNI-именем легитимного сайта. Для DPI, который смотрит на сигнатуру протокола, соединение выглядит как обычный HTTPS к этому сайту. Есть и вторая линия — доппельгангер: mtg умеет подстраивать задержки и размеры TLS-записей под статистику настоящего сайта. По умолчанию эта подсистема простаивает: ей нужен список адресов для замера (шаг 6 раздела 4). Но полной невидимости FakeTLS не даёт: российский ТСПУ с весны 2026 ловит его по отпечатку клиентского приветствия и по статистике потока (см. раздел 10), корпоративные NGFW умеют то же в меньших масштабах.
Секрет — строка, которая авторизует клиентов и содержит имя домена для маскировки. Секрет в формате ee... (начинается с ee) — это FakeTLS-режим. Простой hex-секрет (без ee) — старый MTProto без маскировки: mtg v2 такие секреты не принимает и с ними не запускается.
Выбор домена для маскировки
Домен в секрете — это не просто имя в TLS-хендшейке. mtg умеет domain fronting: если клиент не прошёл проверку секрета (чужой запрос, скан, повтор старого), mtg открывает настоящее соединение с этим доменом и байт в байт отдаёт его ответ. Значит, домен должен быть реально доступен с вашего VPS по 443 порту, иначе защита от сканирования не работает.
Брать google.com или microsoft.com — плохая идея, хотя так написано в половине инструкций: цензору достаточно одного DNS-запроса, чтобы увидеть, что ваш IP не принадлежит сетям Google. Автор mtg советует обратное: домен должен иметь отношение к вашему адресу. Минимальный вариант — сайт вашего же хостера, он хотя бы в одной сети с вашим IP. В BEST_PRACTICES (март 2026) он идёт дальше: правильный вариант — свой домен, направленный на IP этого VPS, с настоящим сайтом и сертификатом за mtg. Встроенная проверка mtg doctor (раздел 4) прямо сверяет, резолвится ли домен из секрета в IP сервера.
Учтите: если домен указывает на этот же VPS, а mtg занял 443, то фолбэк замкнётся на сам прокси. Веб-сервер в такой схеме сажают на отдельный порт и указывают его в конфиге: [domain-fronting] → ip = "127.0.0.1", port = 8080.
3. Требования
| Параметр | Минимум | Примечание |
|---|---|---|
| ОС | Ubuntu 22.04 / 20.04 | Или любой Debian-based |
| CPU / RAM | 1 vCPU / 512 МБ | mtg: ~20–50 МБ idle, до 100–150 МБ под нагрузкой |
| Трафик | 100 ГБ/мес | Около 50 активных пользователей: 1–2 ГБ на человека |
| Порт | 443 (рекомендуется) | Или любой другой открытый порт |
| Расположение VPS | За пределами РФ | Нидерланды, Германия, Финляндия — ближайшие площадки |
| Docker или wget/curl | Docker — для способа 1 | wget/curl — для способа 2 (бинарник) |
Если сервера ещё нет
VPN: от 1 ГБ RAM, 1 ядра и 10 ГБ SSD · Европа
Прокси только пересылает пакеты, и мощность здесь ничего не решает. Жёсткое требование одно: не российский дата-центр.
В каталоге под эти требования подходит 50 тарифов, самый дешёвый за 490 ₽/мес (HostKey, 1 ГБ, 40 ГБ SSD).
4. Способ 1: Docker (рекомендуется)
Docker-способ проще всего: не нужно следить за версиями, обновления делаются одной командой. Используем образ от автора mtg: nineseconds/mtg:2.
Перед началом: проверьте что порт 443 свободен
sudo ss -tlnp | grep ':443 'Если вывод пустой — порт свободен, продолжайте. Если что-то слушает (Nginx, Apache, Caddy и т. п.) — используйте порт 8443 вместо 443 во всех командах ниже, иначе контейнер уйдёт в перезапуск с ошибкой address already in use.
Шаг 1: установить Docker
curl -fsSL https://get.docker.com | sudo shПроверьте что Docker работает:
docker --versionШаг 2: сгенерировать секрет
Секрет — ваш «пароль» прокси, и в нём же зашит домен для маскировки. Подставьте свой домен по правилам из раздела 2 (минимум — сайт вашего же хостера, не google.com), запустите один раз и сохраните вывод.
FRONT_DOMAIN=example.com
docker run --rm nineseconds/mtg:2 generate-secret --hex "$FRONT_DOMAIN"Вывод будет одной строкой, примерно такой (ваш секрет будет другим):
ee2ae24a08127d98ca953e5e11345e23ba6578616d706c652e636f6dСекрет начинается с ee — признак FakeTLS-режима. Дальше 32 символа случайного ключа, а хвост (6578616d706c652e636f6d) — hex-кодировка домена example.com. Длина зависит от домена: 34 символа плюс по два на каждый его символ.
Шаг 3: создать конфигурацию
Создайте директорию и файл конфига одной командой. Замените ВАШ_СЕКРЕТ на значение из шага 2:
sudo mkdir -p /etc/mtg
sudo tee /etc/mtg/config.toml << 'EOF'
secret = "ВАШ_СЕКРЕТ"
bind-to = "0.0.0.0:443"
EOFШаг 4: запустить контейнер
docker run -d \
--name mtg \
--restart unless-stopped \
-v /etc/mtg/config.toml:/config.toml \
-p 443:443 \
nineseconds/mtg:2Убедитесь что контейнер запустился:
docker ps --filter name=mtg
docker logs mtgВ колонке STATUS должно быть Up N seconds. При нормальном старте docker logs mtg не выводит ничего — это не ошибка, mtg молчит, пока всё в порядке. Если в статусе Restarting — в логах будет причина: чаще всего это занятый порт или неправильный формат секрета.
Флаг --restart unless-stopped
Контейнер автоматически перезапустится после перезагрузки VPS и при падении. Флаг unless-stopped отличается от always тем, что не запускается, если вы вручную остановили контейнер командой docker stop mtg.
Шаг 5: проверить конфигурацию
У mtg есть встроенная самопроверка — она делает то, что иначе пришлось бы выяснять по симптомам: сверяет часы, пробует достучаться до дата-центров Telegram и до домена маскировки.
docker run --rm \
-v /etc/mtg/config.toml:/config.toml \
nineseconds/mtg:2 doctor /config.tomlКак читать вывод
- Time skewness — часы сервера. Если тут ❌, MTProto-хендшейк будет разваливаться; лечится
timedatectl set-ntp true. - Native network connectivity — доступность дата-центров Telegram. Одиночный ❌ на
DC 203— это CDN-кластер (91.105.192.100:443): переписка через прокси работать будет, а медиа из CDN может не грузиться; причина обычно в маршрутизации хостера. На отсутствие IPv6 не грешите — у каждого DC mtg пробует и IPv4, и IPv6 и засчитывает первый успешный адрес. - Fronting domain connectivity — домен из секрета должен быть достижим, иначе не заработает domain fronting.
- SNI-DNS match — самый строгий пункт: домен должен резолвиться в IP этого сервера. ❌ здесь ожидаем у всех, кроме тех, кто направил на VPS собственный домен; это не поломка, а напоминание, насколько маскировка правдоподобна.
Шаг 6 (необязательно): доппельгангер
FakeTLS прячет сигнатуру протокола, но не ритм трафика. За ритм отвечает отдельная подсистема: mtg ходит по указанным HTTPS-адресам, замеряет паузы между пакетами и подгоняет под них свои. Без списка адресов ей нечего замерять, поэтому в минимальном конфиге её нет. Допишите в конец конфига два-три адреса того же домена, что в секрете, — лучше «тяжёлых», вроде картинки или скрипта:
sudo tee -a /etc/mtg/config.toml << 'EOF'
[defense.doppelganger]
urls = [
"https://example.com/",
"https://example.com/static/main.js",
]
EOFПерезапустите прокси: docker restart mtg (для способа 2 — sudo systemctl restart mtg). Первый обход mtg делает сразу после старта, дальше — раз в 6 часов; статистику он начинает применять, набрав около сотни замеров. От отпечатка клиента это не спасает, но против анализа по размерам пакетов и таймингам — единственное, что в mtg есть.
5. Способ 2: бинарник + systemd
Если Docker не нужен или не установлен — скачайте готовый бинарник и настройте systemd-сервис. Не нужно ничего компилировать.
Шаг 1: скачать бинарник
Скачайте последний релиз с github.com/9seconds/mtg/releases/latest. На сентябрь 2026 актуальная версия — 2.2.8 (вышла 7 апреля 2026). Замените VERSION на номер последнего релиза, если вышел новее (например, 2.2.9):
VERSION=2.2.8
ARCH=linux-amd64
cd /tmp
wget "https://github.com/9seconds/mtg/releases/download/v${VERSION}/mtg-${VERSION}-${ARCH}.tar.gz"
tar -xf "mtg-${VERSION}-${ARCH}.tar.gz"
sudo install -m 755 "mtg-${VERSION}-${ARCH}/mtg" /usr/local/bin/mtg
rm -rf "mtg-${VERSION}-${ARCH}" "mtg-${VERSION}-${ARCH}.tar.gz"mtg --versionШаг 2: сгенерировать секрет
FRONT_DOMAIN=example.com
mtg generate-secret --hex "$FRONT_DOMAIN"Шаг 3: создать конфиг
sudo mkdir -p /etc/mtg
sudo tee /etc/mtg/config.toml << 'EOF'
secret = "ВАШ_СЕКРЕТ"
bind-to = "0.0.0.0:443"
EOFШаг 4: создать systemd-сервис
sudo tee /etc/systemd/system/mtg.service << 'EOF'
[Unit]
Description=MTG MTProto Proxy
After=network-online.target
Wants=network-online.target
[Service]
Type=simple
ExecStart=/usr/local/bin/mtg run /etc/mtg/config.toml
Restart=on-failure
RestartSec=5
LimitNOFILE=65536
[Install]
WantedBy=multi-user.target
EOFsudo systemctl daemon-reload
sudo systemctl enable --now mtgsudo systemctl status mtg
mtg doctor /etc/mtg/config.tomlВ выводе должно быть Active: active (running). Как читать результат doctor — описано в разделе 4, там же — необязательный шаг 6 про доппельгангер.
LimitNOFILE
Параметр LimitNOFILE=65536 увеличивает лимит открытых файловых дескрипторов. Каждое соединение потребляет 2 дескриптора (клиент ↔ mtg и mtg ↔ Telegram). Без этого параметра при 500+ пользователях могут возникнуть ошибки «too many open files».
6. Настройка UFW
Если на сервере включён фаервол UFW — откройте порт прокси. Если UFW не используется, пропустите этот шаг.
sudo ufw allow 443/tcp
sudo ufw statusЕсли используете порт 8443 вместо 443 — замените в команде выше.
Что делать с UFW в зависимости от способа установки
- Docker-способ: правило UFW не обязательно (Docker сам пробрасывает порт через iptables в обход UFW), но лучше добавить — для единообразия и документирования открытых портов.
- Бинарник + systemd: правило UFW обязательно, иначе 443 снаружи будет закрыт.
Важно: UFW работает внутри VPS. Если ваш провайдер использует отдельный сетевой firewall на уровне панели (Hetzner, Selectel, AWS, Vultr и др.) — там порт тоже надо открыть. Подробнее — в разделе «Если не подключается».
7. Ссылка для подключения
mtg умеет автоматически определить внешний IP и сформировать готовую ссылку.
Docker-способ
docker run --rm \
-v /etc/mtg/config.toml:/config.toml \
nineseconds/mtg:2 access /config.tomlБинарник-способ
mtg access /etc/mtg/config.tomlВывод — JSON. IP определяется автоматически через внешний сервис. Ищите поле tme_url в блоке ipv4:
{
"ipv4": {
"ip": "1.2.3.4",
"port": 443,
"tg_url": "tg://proxy?port=443&secret=7iBa...&server=1.2.3.4",
"tg_qrcode": "https://api.qrserver.com/...",
"tme_url": "https://t.me/proxy?port=443&secret=7iBa...&server=1.2.3.4",
"tme_qrcode": "https://api.qrserver.com/..."
},
"secret": { "hex": "ee...", "base64": "7iBa..." }
}Скопируйте значение tme_url — ссылка вида https://t.me/proxy?... работает на всех платформах.
Почему секрет в ссылке выглядит иначе
В URL секрет приведён в base64 (7iBa...), а в конфиге mtg — в hex (ee...). Это одно и то же значение в разных кодировках. Telegram принимает оба формата, специально конвертировать ничего не нужно.
Ссылка вручную
Если команда access показала неправильный IP или не сработала — составьте ссылку вручную:
https://t.me/proxy?server=IP_ВАШЕГО_VPS&port=443&secret=ВАШ_СЕКРЕТУзнать внешний IP VPS: curl -4 ifconfig.me
8. Подключение в Telegram
Самый простой способ — перейти по ссылке https://t.me/proxy?... с устройства, где открыт Telegram. Он автоматически откроет приложение с готовым диалогом добавления прокси.
Нажмите на ссылку t.me/proxy?... — Telegram откроется с кнопкой Подключить.
Ввести вручную
Настройки → Данные и память → Настройки прокси → Добавить прокси → MTProto → ввести сервер, порт, секрет.
Откройте ссылку t.me/proxy?... в браузере → Открыть в Telegram → Подключить.
Ввести вручную
Настройки → Данные и память → Прокси → Добавить прокси → MTProto → ввести сервер, порт, секрет.
Откройте ссылку https://t.me/proxy?... в браузере — откроется страница t.me с кнопкой Open in Telegram, после нажатия клиент покажет диалог добавления прокси.
Ввести вручную
Настройки → Продвинутые настройки → Тип соединения → Использовать пользовательский прокси → Добавить прокси → MTProto → ввести данные.
Проверка что прокси работает
После подключения в настройках прокси Telegram покажет статус «Подключено» и задержку в миллисекундах. Нормальная задержка — 30–150 мс. Если статус «Не удаётся подключиться» — проверьте что порт открыт в UFW и контейнер/сервис запущен.
9. Мониторинг и обновление
Просмотр логов
docker logs -f mtgdocker logs --tail 50 mtgsudo journalctl -u mtg -fsudo journalctl -u mtg --since todayВ логах обычно пусто: уровень по умолчанию — только предупреждения и ошибки. Это сделано намеренно, логи не должны содержать информацию о пользователях. Так что молчаливый journalctl — хороший знак, а не признак того, что мониторинг не работает.
Обновление mtg (Docker)
docker pull nineseconds/mtg:2
docker stop mtg
docker rm mtg
docker run -d \
--name mtg \
--restart unless-stopped \
-v /etc/mtg/config.toml:/config.toml \
-p 443:443 \
nineseconds/mtg:2Обновление mtg (бинарник)
Подставьте свежую версию из релизов на GitHub:
VERSION=2.2.8
ARCH=linux-amd64
cd /tmp
wget "https://github.com/9seconds/mtg/releases/download/v${VERSION}/mtg-${VERSION}-${ARCH}.tar.gz"
tar -xf "mtg-${VERSION}-${ARCH}.tar.gz"
sudo systemctl stop mtg
sudo install -m 755 "mtg-${VERSION}-${ARCH}/mtg" /usr/local/bin/mtg
sudo systemctl start mtg
rm -rf "mtg-${VERSION}-${ARCH}" "mtg-${VERSION}-${ARCH}.tar.gz"10. Если не подключается
В 90% случаев «прокси не работает» дело не в mtg, а в одной из пяти причин ниже. Проверяйте по порядку.
1. Firewall в панели провайдера
Это причина номер один. У Hetzner Cloud, Selectel, Yandex Cloud, AWS, DigitalOcean, Vultr и многих других есть отдельный сетевой firewall на уровне панели управления — он работает до того, как трафик достигнет UFW внутри ОС. Правило ufw allow 443/tcp на VPS его не открывает. Зайдите в панель провайдера → Firewall / Security Groups / Правила сети → добавьте входящее правило TCP 443 из 0.0.0.0/0.
Проверить доступность порта снаружи (с домашнего компьютера или другого сервера):
nc -zv IP_ВАШЕГО_VPS 443Test-NetConnection -ComputerName IP_ВАШЕГО_VPS -Port 443Успешный вывод nc: Connection to IP 443 port [tcp/https] succeeded!. PowerShell должен показать TcpTestSucceeded : True. Если видите Connection refused / TcpTestSucceeded : False с быстрым ответом — сервис на VPS не запущен. Если Connection timed out / долгое зависание — блокирует firewall (скорее всего в панели провайдера).
2. Блокировка в РФ (ТСПУ) — хронология 2026
Как менялась детекция в 2026 году
- 1 апреля — массовое падение MTProto-прокси по всей стране. По разбору на Хабре от 3 апреля, ТСПУ стал ловить не сервер, а клиента: характерные особенности TLS-приветствия, которое шлёт сам Telegram, — то, что принято называть отпечатком JA3/JA4. Оно отличается от браузерного, и правило било по нему независимо от того, под какой домен маскируется прокси.
- Конец мая — вторая волна, отказы почти одновременно у всех операторов. Здесь добавился статистический анализ: распределение размеров пакетов, тайминги, симметричность и время жизни соединения. По замерам Теплицы 27–31 мая из 27 проверенных конфигураций работали три; нестандартные порты преимущества не давали.
- Лето — устойчивого отката назад не случилось. Отдельные прокси продолжают жить, но это уже не «настроил и забыл», а лотерея с горизонтом в часы или дни.
Что реально влияет, а что нет
- Не помогает: перебор портов и поиск «незасвеченного» домена для секрета. Оба параметра описывают, как выглядит сервер, а детекция с апреля смотрит на отпечаток клиента и на статистику потока. Домен по правилам из раздела 2 выбирать всё равно нужно — но он защищает от сканирования и ручной проверки, а не от ТСПУ.
- Может дать фору: свежий IP, не принадлежащий популярным у обходчиков подсетям, и небольшое число пользователей — сотня клиентов с одинаковым отпечатком на одном адресе видна сама по себе. Плюс заполненный
[defense.doppelganger](шаг 6 раздела 4) — единственная настройка mtg, которая вообще что-то делает против анализа статистики. - План Б обязателен — VLESS+Reality или AmneziaWG (см. блок наверху статьи).
Если задача — устойчиво иметь Telegram из РФ, MTProto-прокси в 2026 — не основной инструмент, а резервный. Основной — VLESS Reality.
3. Порт 443 уже занят другим сервисом
Если вы пропустили проверку в начале раздела 4 — контейнер уйдёт в перезапуск, systemd-сервис упадёт с bind: address already in use. Проверьте, что слушает порт:
sudo ss -tlnp | grep ':443 'Вариант 1 — остановить конфликтующий сервис.
Вариант 2 — сменить порт mtg на 8443. Отредактируйте конфиг:
sudo sed -i 's|bind-to = "0.0.0.0:443"|bind-to = "0.0.0.0:8443"|' /etc/mtg/config.tomlПересоздайте контейнер с новым пробросом порта (Docker-способ):
docker stop mtg && docker rm mtg
docker run -d \
--name mtg \
--restart unless-stopped \
-v /etc/mtg/config.toml:/config.toml \
-p 8443:8443 \
nineseconds/mtg:2Или перезапустите systemd-сервис (бинарник-способ):
sudo systemctl restart mtgНе забудьте открыть новый порт в firewall VPS и в панели провайдера, а также перегенерировать ссылку подключения (в ней теперь &port=8443).
4. VPS за NAT (серый IP)
У некоторых дешёвых тарифов VPS нет публичного IPv4 — вы получаете только «серый» адрес за NAT провайдера. curl -4 ifconfig.me в таком случае вернёт адрес NAT-шлюза, а порт снаружи не проброшен. Сверьте:
ip -4 addr show scope global | grep inet
curl -4 ifconfig.meЕсли IP на сетевом интерфейсе начинается с 10., 172.16–31. или 192.168., а ifconfig.me показывает другой адрес — у вас NAT. Либо попросите провайдера выдать «белый» IP, либо смените тариф.
5. У клиента нет IPv4
Встречается редко, но чинится. В ссылке на прокси стоит IPv4-адрес сервера, и клиент в IPv6-only сети (такие бывают у мобильных операторов) до него не дотянется. Лечится в два действия: прокси начинает слушать оба стека, а такому пользователю вы даёте вторую ссылку — с IPv6-адресом.
Сначала проверьте, есть ли у вашего VPS публичный IPv6:
ip -6 addr show scope globalЕсли вывод пустой — у сервера нет IPv6, этот пункт не применим. Если адреса есть — действуйте по своему способу установки.
Способ 1 (Docker): на проброшенный порт (-p 443:443) IPv6-клиент рассчитывать не может: для этого в демоне должны быть включены ipv6 и ip6tables, а по умолчанию их нет. Плюс mtg внутри контейнера слушает только 0.0.0.0:443. Надёжный способ — убрать прослойку Docker через --network host и слушать сразу оба стека:
sudo sed -i 's|bind-to = "0.0.0.0:443"|bind-to = "[::]:443"|' /etc/mtg/config.toml
docker stop mtg && docker rm mtg
docker run -d \
--name mtg \
--restart unless-stopped \
--network host \
-v /etc/mtg/config.toml:/config.toml \
nineseconds/mtg:2--network host отключает сетевую изоляцию контейнера — для MTProto-прокси это безопасно, потому что mtg слушает только заданный порт. Флаг -p с host-network не используется. Перед пересозданием убедитесь, что порт 443 на хосте свободен (sudo ss -tlnp | grep ':443 ').
Способ 2 (бинарник + systemd): меняете конфиг и перезапускаете сервис.
sudo sed -i 's|bind-to = "0.0.0.0:443"|bind-to = "[::]:443"|' /etc/mtg/config.toml
sudo systemctl restart mtgНа Linux сокет [::] по умолчанию принимает и IPv4 тоже (net.ipv6.bindv6only = 0), так что старые ссылки продолжат работать.
Осталось забрать вторую ссылку: mtg access выведет теперь и блок ipv6 — его tme_url и отправляйте тем, у кого IPv4 нет. Для Docker к команде из раздела 7 допишите --network host: иначе временный контейнер не увидит IPv6 хоста и блока в выводе не будет.
Быстрый чек-лист
11. Спонсорский канал и другие реализации
Telegram позволяет операторам MTProto-прокси привязать спонсорский канал: пользователи, подключённые через прокси, видят продвигаемый канал с меткой «Прокси-спонсор». Тег выдаёт бот @MTProxybot. Личному прокси это не нужно — поэтому раздел и стоит последним.
mtg v2 не поддерживает adtag
Автор убрал функцию из второй версии намеренно: adtag работает только через middle-прокси Telegram, а это лишний код, меньшая скорость и требование публичного IP. Параметра в конфиге просто нет. Остаются три варианта: замороженная mtg v1, официальный MTProxy на C и telemt на Rust.
Почему не официальный образ Telegram
Инструкции в интернете обычно предлагают образ telegrammessenger/proxy. Мы его проверили 3 сентября 2026 — в таком виде он не решает задачу:
- Тег
:2.0betaпересобран 1 апреля 2026, но в образе нет пакетаiproute2. Стартовый скрипт вызываетip route get, получаетip: command not foundи падает с Cannot determine internal IP address. Контейнер не поднимается вообще. - Тег
:latest(сборка февраля 2020) запускается, но это старый бинарник. - Главное: FakeTLS в официальном образе не включается ни на одном теге. Режим
eeв MTProxy живёт за ключом-D <домен>, а стартовый скрипт образа его не передаёт — без него сервер отвергает TLS-подключения и остаются только классический иdd-режимы, то есть ровно то, что ТСПУ ловит первым. - Заодно: переменная
SECRETу образа принимает строго 32 hex-символа. Популярный совет «передайте туда ee-секрет с доменом» приводит к Bad secret format и выходу с ошибкой.
Хотите именно официальный MTProxy — его собирают из исходников (make, зависимости libssl-dev и zlib1g-dev) и запускают с ключами -D домен, -S секрет и -P тег. Способ рабочий, но это отдельная история на полстатьи. Ниже — короткий путь.
telemt: adtag и FakeTLS сразу
telemt — реализация на Rust, которую в своём README рекомендует сам автор mtg. Умеет всё то же, что mtg, плюс спонсорский канал, несколько пользователей с отдельными секретами и HTTP-API для выдачи ссылок. Актуальная версия на сентябрь 2026 — 3.5.5.
telemt — замена mtg, а не дополнение к нему: порт 443 займёт кто-то один. Если mtg уже стоит, сначала уберите его — docker rm -f mtg для способа 1 или sudo systemctl disable --now mtg для способа 2. Правило фаервола менять не нужно: порт тот же.
Шаг 1. Скачать бинарник. Обратите внимание на выбор сборки:
ARCH=$(uname -m)
LIBC=$(ldd --version 2>&1 | grep -iq musl && echo musl || echo gnu)
cd /tmp
wget -qO- "https://github.com/telemt/telemt/releases/latest/download/telemt-${ARCH}-linux-${LIBC}.tar.gz" | tar -xz
sudo install -m 755 telemt /usr/local/bin/telemt
rm -f /tmp/telemt
telemt --versionСборке gnu нужен glibc 2.34 и новее. На Ubuntu 22.04 это так, а на Ubuntu 20.04 она не запустится — команда выше определит систему как gnu, и вы получите version GLIBC_2.34 not found. Лечится подстановкой LIBC=musl вручную: статическая сборка работает везде.
Шаг 2. Сгенерировать секрет — здесь это обычные 16 байт без домена, домен задаётся отдельным полем конфига:
openssl rand -hex 16Шаг 3. Зарегистрировать прокси в @MTProxybot и получить тег: команда /newproxy, затем адрес в виде IP_VPS:443, затем тот же секрет из шага 2. В ответ придёт TAG — 32 hex-символа.
Шаг 4. Создать конфиг. Подставьте свои секрет, тег и домен маскировки:
sudo mkdir -p /etc/telemt
sudo tee /etc/telemt/telemt.toml << 'EOF'
[general]
use_middle_proxy = true
ad_tag = "ВАШ_TAG_ИЗ_MTPROXYBOT"
log_level = "normal"
[general.modes]
classic = false
secure = false
tls = true
[general.links]
show = "*"
[server]
port = 443
[server.api]
enabled = true
listen = "127.0.0.1:9091"
whitelist = ["127.0.0.1/32", "::1/128"]
[[server.listeners]]
ip = "0.0.0.0"
[censorship]
tls_domain = "example.com"
mask = true
tls_emulation = true
tls_front_dir = "tlsfront"
[access.users]
alice = "ВАШ_СЕКРЕТ_32_HEX"
EOFclassic и secure выключены намеренно: это старые режимы без маскировки, оставлять их — значит держать открытой самую заметную для DPI дверь. Домен в tls_domain подбирается по тем же правилам, что и для mtg (раздел 2), и его смена делает старые ссылки нерабочими.
Шаг 5. Завести пользователя и systemd-сервис:
sudo useradd -d /opt/telemt -m -r -U telemt
sudo chown -R telemt:telemt /etc/telemt
sudo tee /etc/systemd/system/telemt.service << 'EOF'
[Unit]
Description=Telemt MTProto Proxy
After=network-online.target
Wants=network-online.target
[Service]
Type=simple
User=telemt
Group=telemt
WorkingDirectory=/opt/telemt
ExecStart=/usr/local/bin/telemt /etc/telemt/telemt.toml
Restart=on-failure
RestartSec=5
LimitNOFILE=65536
AmbientCapabilities=CAP_NET_BIND_SERVICE
CapabilityBoundingSet=CAP_NET_BIND_SERVICE
NoNewPrivileges=true
[Install]
WantedBy=multi-user.target
EOF
sudo systemctl daemon-reload
sudo systemctl enable --now telemt
sudo systemctl status telemtAmbientCapabilities=CAP_NET_BIND_SERVICE нужен потому, что сервис работает не от root, а порт 443 — привилегированный.
Шаг 6. Забрать ссылку. Составлять её руками не надо — telemt отдаёт готовую через локальный API:
curl -s http://127.0.0.1:9091/v1/users | grep -o 'tg://[^"]*'Спонсорский канал требует публичного IP
В режиме use_middle_proxy = true прокси соединяется с middle-серверами Telegram, и они проверяют, что он доступен снаружи по своему адресу. За NAT или без проброшенного порта пул middle-серверов не поднимется — в логах будет All ME servers for DC failed at init. Без adtag это поле можно выключить, и прокси пойдёт к дата-центрам напрямую.
Что выбрать
| Параметр | mtg v2 | telemt | Официальный MTProxy |
|---|---|---|---|
| FakeTLS | ✅ из коробки | ✅ из коробки | ⚠️ только с ключом -D при сборке из исходников |
| Adtag (спонсор) | ❌ нет | ✅ есть | ✅ есть |
| Несколько секретов | ❌ один | ✅ по пользователям | ✅ несколько ключей -S |
| Язык / поддержка | Go, последний релиз — апрель 2026 | Rust, релизы почти еженедельно | C, коммиты есть, релизов нет с 2018 |
| Установка | Docker или бинарник | Бинарник, Docker Compose | Сборка из исходников; готовый образ нерабочий |