1. Зачем свой прокси
Публичные MTProto-прокси из интернета — удобны, но непредсказуемы: они падают без предупреждения, перегружаются, а иногда собирают метаданные. Собственный прокси на VPS лишён этих проблем:
🔒 Приватность
Только вы контролируете сервер. Никаких третьих сторон, никакой телеметрии.
⚡ Скорость
Публичные прокси перегружены. Ваш — только для вас и тех, кому вы дали ссылку.
🛡️ Надёжность
Не исчезнет завтра. Работает, пока работает ваш VPS.
👥 Для всей семьи
Поделитесь ссылкой с друзьями — прокси выдержит сотни пользователей.
2. Как работает mtg и FakeTLS
mtg (github.com/9seconds/mtg) — неофициальная реализация MTProto-прокси на Go от независимого разработчика. Официальный прокси Telegram (TelegramMessenger/MTProxy) написан на C и не обновлялся с 2018 года — он не поддерживает FakeTLS. mtg широко используется сообществом и де-факто стал стандартом для самостоятельного развёртывания MTProto-прокси.
Поддерживает режим FakeTLS: при подключении клиент и прокси имитируют TLS-хендшейк с SNI-именем легитимного сайта (например, google.com). Для систем глубокой инспекции пакетов (DPI) соединение выглядит как обычный HTTPS к google.com — отличить невозможно без мониторинга IP-адресов конечных серверов.
Секрет — строка, которая авторизует клиентов и содержит имя домена для маскировки. Секрет в формате ee... (начинается с ee) — это FakeTLS-режим. Простой hex-секрет (без ee) — обычный MTProto без маскировки, хуже проходит DPI.
Выбор домена для маскировки
Домен в секрете — только имя хоста для TLS-хендшейка, реального соединения с ним нет. Используйте крупные популярные сайты: google.com, cloudflare.com, microsoft.com. Их TLS-трафик точно не блокируется ни одним провайдером.
3. Требования
| Параметр | Минимум | Примечание |
|---|---|---|
| ОС | Ubuntu 22.04 / 20.04 | Или любой Debian-based |
| CPU / RAM | 1 vCPU / 512 МБ | mtg потребляет ~20–50 МБ RAM |
| Трафик | 100 ГБ/мес | При 50 активных пользователях |
| Порт | 443 (рекомендуется) | Или любой другой открытый порт |
| Расположение VPS | За пределами РФ | Нидерланды, Германия, Финляндия |
| Docker или Go 1.21+ | Для Docker-способа | Или только wget для бинарника |
Конфликт порта 443 с Nginx
Если на VPS уже работает Nginx или Apache на порту 443 — используйте порт 8443 вместо 443. Он тоже хорошо проходит через корпоративные сети и редко блокируется. Всё что описано ниже — просто замените 443 на 8443.
4. Способ 1: Docker (рекомендуется)
Docker-способ проще всего: не нужно следить за версиями, обновления делаются одной командой. Используем образ от автора mtg: nineseconds/mtg:2.
Шаг 1: установить Docker
curl -fsSL https://get.docker.com | sudo sh
sudo systemctl enable --now dockerПроверьте что Docker работает:
docker --versionШаг 2: сгенерировать секрет
Секрет — ваш «пароль» прокси. Команда ниже генерирует FakeTLS-секрет с маскировкой под google.com. Запустите один раз и сохраните вывод.
docker run --rm nineseconds/mtg:2 generate-secret --hex google.comВывод будет одной строкой, примерно такой (ваш секрет будет другим):
ee4a7b3f1c8d2e9a5f6c0b4d8e1a3f7b2c676f6f676c652e636f6dСекрет начинается с ee — признак FakeTLS-режима. Последние символы (676f6f676c652e636f6d) — hex-кодировка домена google.com. Итого ~54 символа.
Шаг 3: создать конфигурацию
sudo mkdir -p /etc/mtgСоздайте файл конфига, подставив ваш секрет из шага 2:
secret = "ВАШ_СЕКРЕТ_ИЗ_ШАГА_2"
bind-to = "0.0.0.0:443"Быстрый способ создать файл сразу с секретом (замените ВАШ_СЕКРЕТ):
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В колонке STATUS должно быть Up N seconds.
Флаг --restart unless-stopped
Контейнер автоматически перезапустится после перезагрузки VPS и при падении. Флаг unless-stopped отличается от always тем, что не запускается, если вы вручную остановили контейнер командой docker stop mtg.
5. Способ 2: бинарник + systemd
Если Docker не нужен или не установлен — скачайте готовый бинарник и настройте systemd-сервис. Не нужно ничего компилировать.
Шаг 1: скачать бинарник
VERSION=2.2.1
wget -O /tmp/mtg.tar.gz "https://github.com/9seconds/mtg/releases/download/v${VERSION}/mtg-${VERSION}-linux-amd64.tar.gz"
tar -xf /tmp/mtg.tar.gz -C /tmp --strip-components=1
sudo install -m 755 /tmp/mtg /usr/local/bin/mtg
rm /tmp/mtg.tar.gz /tmp/mtgmtg --helpШаг 2: сгенерировать секрет
mtg generate-secret --hex google.comШаг 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.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В выводе должно быть Active: active (running).
LimitNOFILE
Параметр LimitNOFILE=65536 увеличивает лимит открытых файловых дескрипторов. Каждое соединение потребляет 2 дескриптора (клиент ↔ mtg и mtg ↔ Telegram). Без этого параметра при 500+ пользователях могут возникнуть ошибки «too many open files».
6. Спонсорский канал (adtag)
Telegram позволяет операторам MTProto-прокси привязать спонсорский канал: пользователи, подключённые через прокси, видят продвигаемый канал с меткой «Прокси-спонсор». Управляется через бот @MTProxybot.
mtg v2 не поддерживает adtag
Функция adtag есть только в официальном C-реализации Telegram — TelegramMessenger/MTProxy. В mtg v2 эта возможность отсутствует: соответствующего параметра в конфиге нет. Если спонсорский канал нужен — придётся использовать официальный MTProxy вместо mtg.
Официальный MTProxy с adtag
Официальный MTProxy написан на C, последнее обновление — 2018 год, но adtag в нём работает. Установка через Docker:
Шаг 1. Запустите контейнер без TAG — контейнер автоматически сгенерирует SECRET и выведет tg://-ссылку в логи:
docker run -d --name mtproxy --restart unless-stopped -p 443:443 -v proxy-config:/data telegrammessenger/proxy:latest
# Посмотреть логи — там будет tg://-ссылка с секретом
docker logs mtproxyШаг 2. В @MTProxybot: команда /newproxy → отправьте боту tg://-ссылку из логов → бот зарегистрирует прокси и выдаст TAG (adtag).
Шаг 3. Перезапустите контейнер с TAG:
docker stop mtproxy && docker rm mtproxy
docker run -d --name mtproxy --restart unless-stopped -p 443:443 -v proxy-config:/data -e TAG=ВАШ_TAG_ИЗ_MTPROXYBOT telegrammessenger/proxy:latestФлаг -v proxy-config:/data обязателен — в нём сохраняется SECRET между перезапусками, поэтому tg://-ссылка остаётся прежней.
Сравнение: mtg vs официальный MTProxy
| Параметр | mtg v2 | Официальный MTProxy |
|---|---|---|
| FakeTLS | ✅ есть | ❌ нет |
| Adtag (спонсор) | ❌ нет | ✅ есть |
| Поддержка | Последний релиз 2022 | Не обновлялся с 2018 |
| Установка | Просто | Просто (Docker) |
7. Настройка UFW
Если на сервере включён фаервол UFW — откройте порт прокси. Если UFW не используется, пропустите этот шаг.
sudo ufw allow 443/tcp
sudo ufw statusЕсли используете порт 8443 вместо 443 — замените в команде выше.
Docker и UFW
Docker пробрасывает порты напрямую через iptables, обходя UFW. Это значит, что при использовании Docker-способа порт 443 будет доступен снаружи даже без правила UFW. Тем не менее, добавить правило UFW рекомендуется — для единообразия и документирования открытых портов.
8. Ссылка для подключения
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 определяется автоматически через ifconfig.co. Ищите поле tme_url в блоке ipv4:
{
"ipv4": {
"ip": "1.2.3.4",
"port": 443,
"tg_url": "tg://proxy?server=1.2.3.4&port=443&secret=7iBa...",
"tg_qrcode": "https://api.qrserver.com/...",
"tme_url": "https://t.me/proxy?server=1.2.3.4&port=443&secret=7iBa...",
"tme_qrcode": "https://api.qrserver.com/..."
},
"secret": { "hex": "ee...", "base64": "7iBa..." }
}Скопируйте значение tme_url — ссылка вида https://t.me/proxy?... работает на всех платформах. Секрет в URL отображается в base64-формате (7iBa...) — это то же самое, что hex-секрет ee..., просто другая кодировка. Telegram принимает оба формата.
Ссылка вручную
Если команда access показала неправильный IP или не сработала — составьте ссылку вручную:
https://t.me/proxy?server=IP_ВАШЕГО_VPS&port=443&secret=ВАШ_СЕКРЕТУзнать внешний IP VPS: curl -4 ifconfig.me
9. Подключение в Telegram
Самый простой способ — перейти по ссылке https://t.me/proxy?... с устройства, где открыт Telegram. Он автоматически откроет приложение с готовым диалогом добавления прокси.
Способ 1 (проще): нажмите на ссылку t.me/proxy?... → Telegram откроется с кнопкой Подключить.
Способ 2 (вручную): Настройки → Данные и память → Настройка прокси → Добавить прокси → MTProto → ввести сервер, порт, секрет.
Способ 1 (проще): откройте ссылку t.me/proxy?... в браузере → нажмите Открыть в Telegram → Подключить.
Способ 2 (вручную): Настройки → Данные и хранилище → Прокси → Добавить прокси → MTProto → ввести сервер, порт, секрет.
Способ 1 (проще): вставьте ссылку tg://proxy?... в адресную строку браузера → браузер откроет Telegram с диалогом добавления.
Способ 2 (вручную): Настройки → Продвинутые настройки → Тип соединения → Использовать прокси → Добавить прокси → MTProto → ввести данные.
Проверка что прокси работает
После подключения в настройках прокси Telegram покажет статус «Подключено» и задержку в миллисекундах. Нормальная задержка — 30–150 мс. Если статус «Не удаётся подключиться» — проверьте что порт открыт в UFW и контейнер/сервис запущен.
10. Мониторинг и обновление
Просмотр логов
docker logs -f mtgdocker logs --tail 50 mtgsudo journalctl -u mtg -fsudo journalctl -u mtg --since todayВ логах mtg нет ничего лишнего — только служебные сообщения о запуске и остановке. Это сделано намеренно: логи не должны содержать информацию о пользователях.
Обновление 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 (бинарник)
VERSION=2.2.1 # замените на актуальную версию
wget -O /tmp/mtg.tar.gz "https://github.com/9seconds/mtg/releases/download/v${VERSION}/mtg-${VERSION}-linux-amd64.tar.gz"
tar -xf /tmp/mtg.tar.gz -C /tmp --strip-components=1
sudo systemctl stop mtg
sudo install -m 755 /tmp/mtg /usr/local/bin/mtg
sudo systemctl start mtg
rm /tmp/mtg.tar.gz /tmp/mtgДиагностика подключения
Если Telegram не может подключиться — проверьте порт снаружи с другого компьютера:
nc -zv IP_ВАШЕГО_VPS 443Если nc не установлен: sudo apt install -y netcat-openbsd. Успешный вывод: Connection to IP 443 port [tcp/https] succeeded!