Установка MTProto Proxy (mtg) на Linux-сервере
📡 Установка MTProto Proxy (mtg) на Linux-сервере
Полная пошаговая инструкция для новичков. Проверено на Ubuntu/Debian с mtg v2.2.4.
Что это и зачем
mtg — это легковесный MTProto-прокси для Telegram. Его задача — дать пользователям доступ к Telegram, встраивая прокси прямо в настройки приложения (без необходимости запускать VPN).
Как это работает
┌──────────────┐ MTProto FakeTLS ┌──────────────┐ ┌──────────────┐ │ Telegram │ ──────────────────────────► │ Ваш │ ──────► │ Telegram │ │ клиент │ маскируется под обычный │ сервер │ │ серверы │ │ │ HTTPS-трафик к google.com │ (mtg) │ │ │ └──────────────┘ └──────────────┘ └──────────────┘
FakeTLS — технология маскировки. Для стороннего наблюдателя трафик выглядит как обычное HTTPS-соединение к google.com (или другому указанному домену). На самом деле внутри передаётся зашифрованный трафик Telegram.
Требования
| Требование | Описание |
|---|---|
| Сервер | VPS/VDS с Linux (Ubuntu 20.04+, Debian 11+, CentOS 8+) |
| Доступ | SSH-доступ с правами root
|
| Порт | Свободный порт (рекомендуется 443 или 8443)
|
| Доступ к Telegram | Сервер должен иметь прямой доступ к серверам Telegram (т.е. сервер не в стране с блокировкой) |
| Архитектура | amd64 (x86_64) — стандарт для большинства VPS
|
⚠️ Внимание: MTProto-прокси нужно размещать на сервере, с которого Telegram доступен напрямую (например, сервер в Европе, США и т.д.). Поднимать его на сервере внутри РФ бессмысленно — Telegram всё равно будет недоступен.
Установка mtg
Шаг 1: Подключитесь к серверу по SSH
ssh root@ВАШ_IP_СЕРВЕРА
Шаг 2: Скачайте последнюю версию mtg
# Скачиваем архив с GitHub
curl -sL https://github.com/9seconds/mtg/releases/download/v2.2.4/mtg-2.2.4-linux-amd64.tar.gz -o /tmp/mtg.tar.gz
💡 Совет: Актуальную версию всегда можно проверить на странице релизов: https://github.com/9seconds/mtg/releases
Если у вас ARM-сервер (например, Oracle Cloud Free Tier), скачивайте файл mtg-X.X.X-linux-arm64.tar.gz
Шаг 3: Распакуйте архив
# Распаковываем
tar -xzf /tmp/mtg.tar.gz -C /tmp/
Шаг 4: Установите бинарник
# Перемещаем бинарник в системную директорию
mv /tmp/mtg-2.2.4-linux-amd64/mtg /usr/local/bin/mtg
# Даём права на исполнение
chmod +x /usr/local/bin/mtg
Шаг 5: Проверьте установку
mtg --version
Ожидаемый результат:
2.2.4 (go1.26.1: 2026-03-24T08:59:03Z ...)
✅ Если видите версию — mtg установлен успешно!
Шаг 6: Очистите временные файлы
rm -rf /tmp/mtg.tar.gz /tmp/mtg-2.2.4-linux-amd64/
Генерация секрета
Секрет — это уникальный ключ, который нужен для подключения клиентов к вашему прокси. Он же определяет домен для маскировки (FakeTLS).
Генерация в hex-формате
mtg generate-secret --hex google.com
Пример вывода:
ee1234567890abcdef1234567890abcdef676f6f676c652e636f6d
Генерация в base64-формате
mtg generate-secret google.com
⚠️ Внимание: Сохраните секрет! Он понадобится для конфигурации сервера и для подключения клиентов Telegram. Если потеряете — можно сгенерировать новый, но придётся обновить настройки у всех клиентов.
Какой домен выбрать для маскировки?
Домен после команды — это сайт, под который маскируется трафик. Правила выбора:
| ✅ Хороший выбор | ❌ Плохой выбор | Почему |
|---|---|---|
google.com
|
ya.ru
|
Российский домен не должен "жить" на европейском IP |
www.microsoft.com
|
vk.com
|
Аналогично — геолокационное несоответствие |
cloudflare.com
|
localhost
|
Несуществующий/локальный домен подозрителен |
www.amazon.com
|
telegram.org
|
Очевидно связан с Telegram |
Правило: выбирайте крупный международный сайт, который территориально соответствует расположению вашего сервера.
Создание конфигурации
mtg v2 использует конфигурационный файл в формате TOML.
Рекомендуемый конфиг
cat > /etc/mtg.toml << 'EOF'
# Ваш секрет (замените на свой!)
secret = "ee1234567890abcdef1234567890abcdef676f6f676c652e636f6d"
# Адрес и порт для прослушивания
# 0.0.0.0 означает "все сетевые интерфейсы"
bind-to = "0.0.0.0:8443"
# Принудительно использовать только IPv4
# (IPv6 часто вызывает проблемы на VPS — зависания, таймауты)
prefer-ip = "only-ipv4"
# Разрешить подключение к неизвестным DC (нужно для загрузки медиа)
allow-fallback-on-unknown-dc = true
# Автоматически обновлять список адресов Telegram DC
auto-update = true
# Таймауты (уменьшены для быстрого переключения между DC)
[network.timeout]
tcp = "3s"
http = "5s"
idle = "5m"
# Защита от replay-атак (рекомендуется оставить включённой)
[defense.anti-replay]
enabled = true
max-size = "1mib"
error-rate = 0.001
EOF
⚠️ Внимание: Не забудьте заменить значение secret на ваш настоящий секрет, сгенерированный на предыдущем шаге!
💡 Важно о структуре TOML: Все глобальные параметры (secret, bind-to, prefer-ip и т.д.) должны находиться до секций [...]. Если параметр окажется после [defense.anti-replay] — он будет проигнорирован!
⚠️ Типичное наложение проблем: На практике часто возникают две проблемы одновременно:
1. IPv6 на VPS работает нестабильно → mtg зависает на попытках подключения к DC через IPv6 → медиа не загружается.
2. ТСПУ замедляет международные MTProto-соединения → подключение занимает 10–40 секунд.
Симптомы обеих проблем похожи. Решение: prefer-ip = "only-ipv4" (пункт 1) + SSH-туннель через РФ-сервер (пункт 2, см. раздел ниже).
Выбор порта
| Порт | Плюсы | Минусы |
|---|---|---|
443
|
Максимальная маскировка (стандартный HTTPS-порт) | Может быть занят другим сервисом (nginx, 3X-UI и т.д.) |
8443
|
Альтернативный HTTPS-порт, редко занят | Чуть менее «стандартный», но вполне нормальный |
3128
|
Порт из примера mtg | Ассоциируется с прокси (Squid), может насторожить DPI |
Рекомендация: если порт 443 свободен — используйте его. Если занят — используйте 8443.
Проверка, занят ли порт
ss -tlnp | grep :443
Если ничего не вывело — порт свободен. Если вывело процесс — порт занят, используйте другой.
Первый запуск и проверка
Запуск в режиме отладки (для первого раза)
Добавьте временно debug = true в начало конфига:
# Открываем конфиг
nano /etc/mtg.toml
Добавьте первой строкой:
debug = true
Запустите:
mtg run /etc/mtg.toml
Что вы увидите:
- Если всё ОК — mtg начнёт выводить отладочные сообщения и будет ждать подключений
- Если ошибка — mtg покажет описание проблемы и завершится
Проверка что порт слушается (в другом терминале)
ss -tlnp | grep 8443
Ожидаемый вывод:
LISTEN 0 4096 0.0.0.0:8443 0.0.0.0:* users:(("mtg",pid=12345,fd=3))
✅ Если видите строку с mtg — прокси запущен и слушает!
Остановка после проверки
Нажмите Ctrl+C в терминале, где запущен mtg.
💡 Совет: После успешной проверки уберите строку debug = true из конфига — в рабочем режиме отладка не нужна, она создаёт лишнюю нагрузку.
Настройка автозапуска (systemd)
Чтобы mtg запускался автоматически при загрузке сервера и перезапускался при падении:
Шаг 1: Создайте файл сервиса
cat > /etc/systemd/system/mtg.service << 'EOF'
[Unit]
Description=MTProto Proxy (mtg)
Documentation=https://github.com/9seconds/mtg
After=network.target
[Service]
Type=simple
ExecStart=/usr/local/bin/mtg run /etc/mtg.toml
Restart=always
RestartSec=5
[Install]
WantedBy=multi-user.target
EOF
Шаг 2: Примените и запустите
# Перечитать конфигурацию systemd
systemctl daemon-reload
# Включить автозапуск при загрузке системы
systemctl enable mtg
# Запустить прямо сейчас
systemctl start mtg
Шаг 3: Проверьте статус
systemctl status mtg
Ожидаемый вывод:
● mtg.service - MTProto Proxy (mtg)
Loaded: loaded (/etc/systemd/system/mtg.service; enabled)
Active: active (running) since ...
✅ Статус active (running) — всё работает!
Полезные команды управления
| Команда | Описание |
|---|---|
systemctl start mtg
|
Запустить |
systemctl stop mtg
|
Остановить |
systemctl restart mtg
|
Перезапустить |
systemctl status mtg
|
Проверить статус |
journalctl -u mtg -f
|
Смотреть логи в реальном времени |
journalctl -u mtg --since "1 hour ago"
|
Логи за последний час |
Настройка файрвола
Не забудьте открыть порт, на котором работает mtg!
UFW (Ubuntu)
ufw allow 8443/tcp
ufw status
iptables
iptables -A INPUT -p tcp --dport 8443 -j ACCEPT
# Чтобы сохранить правило после перезагрузки:
apt install iptables-persistent -y
netfilter-persistent save
firewalld (CentOS/Fedora)
firewall-cmd --permanent --add-port=8443/tcp
firewall-cmd --reload
⚠️ Внимание: Если у вашего хостинга есть внешний файрвол (Security Groups, Cloud Firewall), откройте порт и там! Это частая причина, почему прокси «не работает» — порт закрыт на уровне провайдера.
Подключение клиентов Telegram
Способ 1: Ссылка для быстрого подключения (рекомендуется)
Сформируйте ссылку и отправьте её пользователям:
tg://proxy?server=IP_СЕРВЕРА&port=8443&secret=ВАШ_СЕКРЕТ
Пример:
tg://proxy?server=185.100.200.50&port=8443&secret=ee1234567890abcdef1234567890abcdef676f6f676c652e636f6d
Или в формате HTTPS (открывается в браузере):
https://t.me/proxy?server=185.100.200.50&port=8443&secret=ee1234567890abcdef1234567890abcdef676f6f676c652e636f6d
Пользователь открывает ссылку → Telegram предлагает подключить прокси → нажимает «Подключить» → готово! 🎉
Способ 2: Ручная настройка
Android
Настройки → Данные и память → Тип прокси → Добавить прокси ├── Тип: MTProto ├── Сервер: IP вашего сервера ├── Порт: 8443 └── Секрет: ваш секрет
iOS
Настройки → Данные и память → Прокси → Добавить прокси ├── Тип: MTProto ├── Сервер: IP вашего сервера ├── Порт: 8443 └── Секрет: ваш секрет
Telegram Desktop (ПК)
Настройки → Продвинутые настройки → Тип подключения → Использовать свой прокси → Добавить прокси ├── Тип: MTPROTO ├── Хост: IP вашего сервера ├── Порт: 8443 └── Секрет: ваш секрет
Проверка подключения
После добавления прокси рядом с ним появится индикатор:
- 🟢 Доступен + время пинга — работает!
- 🔴 Недоступен — см. раздел диагностики
Диагностика проблем
Встроенная диагностика mtg
В v2.2.4 есть команда mtg doctor:
mtg doctor /etc/mtg.toml
Она проверит:
- Корректность конфигурации
- Сетевую доступность серверов Telegram
- Доступность домена фронтинга
- Соответствие SNI и DNS
Частые проблемы и решения
| Проблема | Причина | Решение |
|---|---|---|
| Telegram показывает 🔴 «Недоступен» | Порт закрыт файрволом | Откройте порт: ufw allow 8443/tcp
|
bind: address already in use
|
Порт занят другим процессом | grep :8443 |
mtg: command not found
|
Бинарник не в PATH | Проверьте: ls -la /usr/local/bin/mtg
|
| Прокси работал, но перестал | Процесс упал и не перезапустился | Настройте systemd (см. раздел выше) |
| Работает с сервера, не работает из РФ | ТСПУ заблокировал IP или протокол | Смените порт на 443; если не помогает — нужна дополнительная обфускация |
Проверка из командной строки
# Проверить что процесс запущен
ps aux | grep mtg
# Проверить что порт слушается
ss -tlnp | grep 8443
# Посмотреть логи
journalctl -u mtg --no-pager -n 50
Продвинутые настройки
Полный конфиг с пояснениями
# Режим отладки (true = подробные логи, false = тишина)
# Включайте только при диагностике!
debug = false
# Ваш секрет (FakeTLS)
secret = "ваш_секрет"
# Адрес:порт для прослушивания
bind-to = "0.0.0.0:8443"
# Принудительно использовать только IPv4
# Рекомендуется: IPv6 на многих VPS работает нестабильно
# Варианты: "prefer-ipv4", "prefer-ipv6", "only-ipv4", "only-ipv6"
prefer-ip = "only-ipv4"
# Разрешить подключение к неизвестным DC (критично для загрузки медиа)
allow-fallback-on-unknown-dc = true
# Автоматически обновлять список DC Telegram
# (без этого mtg использует захардкоженный список, который может устареть)
auto-update = true
# Максимум одновременных подключений
concurrency = 8192
# Допуск расхождения времени (для FakeTLS проверки)
tolerate-time-skewness = "5s"
# DNS-резолвер (DNS-over-HTTPS через Cloudflare)
[network]
dns = "https://1.1.1.1"
# Таймауты (уменьшены для быстрого переключения при недоступности DC)
[network.timeout]
tcp = "3s"
http = "5s"
idle = "5m"
# Защита от replay-атак
[defense.anti-replay]
enabled = true
max-size = "1mib"
error-rate = 0.001
# Блокировка подозрительных IP (ботнеты, сканеры)
[defense.blocklist]
enabled = true
download-concurrency = 2
urls = [
"https://iplists.firehol.org/files/firehol_level1.netset",
]
update-each = "24h"
Запуск через Docker (альтернативный способ)
Если предпочитаете Docker:
docker run -d \
--name mtg \
--restart always \
-p 8443:3128 \
nineseconds/mtg:2 \
run /config.toml
🔗 SSH-туннель через промежуточный сервер (РФ → Европа)
Если ТСПУ (DPI) блокирует или замедляет прямое MTProto-подключение к европейскому серверу, можно проложить SSH-туннель через промежуточный сервер в РФ. Клиенты Telegram по-прежнему просто вводят прокси в настройках — никакого дополнительного ПО не требуется.
Почему это нужно
ТСПУ умеет распознавать MTProto FakeTLS на международных каналах и троттлить (замедлять) или обрывать соединения. Симптомы:
- Подключение к прокси занимает минуты
- Чаты загружаются, но медиа (фото, видео, файлы) — нет
- Порт доступен (
Test-NetConnectionпроходит), но Telegram не подключается
При этом трафик внутри РФ (Клиент → РФ-сервер) не подвергается такому же анализу. SSH-туннель между серверами шифрует трафик и делает его невидимым для ТСПУ.
Схема работы
Внутри РФ Зашифрованный SSH
┌──────────┐ MTProto FakeTLS ┌──────────┐ ┌──────────────┐ ┌──────────┐
│ 📱 │ ───────────────────► │ 🇷🇺 РФ │ ──► │ 🇪🇺 Европа │ ──► │ ☁️ │
│ Telegram │ ТСПУ не трогает │ Сервер │ SSH │ Сервер (mtg) │ │ Telegram │
│ клиент │ внутренний трафик │ (туннель)│ │ │ │ серверы │
└──────────┘ └──────────┘ └──────────────┘ └──────────┘
порт 9443 порт 8443
Требования
| Компонент | Описание |
|---|---|
| РФ-сервер | VPS в России с SSH-доступом (может быть тот же, где стоит 3X-UI) |
| EU-сервер | Сервер в Европе, где уже работает mtg |
| SSH между серверами | РФ-сервер должен иметь SSH-доступ к EU-серверу |
| autossh | Утилита для автоматического переподключения SSH-туннеля |
Шаг 1: Настройка SSH-ключей (без пароля)
На РФ-сервере выполните:
# Сгенерировать ключ (если ещё нет)
ssh-keygen -t ed25519 -N "" -f ~/.ssh/id_ed25519
# Скопировать публичный ключ на EU-сервер
# (потребуется ввести пароль EU-сервера один раз)
ssh-copy-id root@IP_EU_СЕРВЕРА
# Проверить что вход без пароля работает
ssh root@IP_EU_СЕРВЕРА "echo OK"
Если в ответ получили OK — ключи настроены правильно.
Шаг 2: Установка autossh
На РФ-сервере:
apt install autossh -y
autossh — обёртка над SSH, которая автоматически переподключается при обрыве соединения.
Шаг 3: Запуск туннеля (ручной тест)
autossh -M 0 -N -f \
-o "ServerAliveInterval=30" \
-o "ServerAliveCountMax=3" \
-L 0.0.0.0:9443:127.0.0.1:8443 \
root@IP_EU_СЕРВЕРА
| Параметр | Назначение |
|---|---|
-M 0
|
Отключить мониторинг-порт autossh (используем ServerAlive) |
-N
|
Не выполнять команды на удалённом сервере (только туннель) |
-f
|
Уйти в фоновый режим |
ServerAliveInterval=30
|
Проверять соединение каждые 30 секунд |
ServerAliveCountMax=3
|
Переподключиться после 3 неудачных проверок (90 сек) |
-L 0.0.0.0:9443:127.0.0.1:8443
|
Слушать порт 9443 на РФ-сервере → пробрасывать на 127.0.0.1:8443 EU-сервера |
Проверьте:
ss -tlnp | grep 9443
Должно показать ssh на порту 9443.
Шаг 4: Автозапуск через systemd
Чтобы туннель переживал перезагрузки РФ-сервера, создайте сервис:
cat > /etc/systemd/system/mtg-tunnel.service << 'EOF'
[Unit]
Description=SSH Tunnel for MTProto Proxy (mtg)
After=network-online.target
Wants=network-online.target
[Service]
Type=simple
Environment="AUTOSSH_GATETIME=0"
ExecStart=/usr/bin/autossh -M 0 -N \
-o "ServerAliveInterval=30" \
-o "ServerAliveCountMax=3" \
-o "ExitOnForwardFailure=yes" \
-o "StrictHostKeyChecking=no" \
-L 0.0.0.0:9443:127.0.0.1:8443 \
root@IP_EU_СЕРВЕРА
Restart=always
RestartSec=10
[Install]
WantedBy=multi-user.target
EOF
# Остановить ручной autossh (если запущен)
pkill autossh 2>/dev/null
pkill -f "ssh.*9443" 2>/dev/null
# Включить и запустить сервис
systemctl daemon-reload
systemctl enable mtg-tunnel
systemctl start mtg-tunnel
Проверка:
systemctl status mtg-tunnel
ss -tlnp | grep 9443
Шаг 5: Открыть порт на РФ-сервере
ufw allow 9443/tcp
Шаг 6: Оптимальный конфиг mtg на EU-сервере
Для стабильной работы через туннель рекомендуется следующий конфиг:
secret = "ВАШ_СЕКРЕТ"
bind-to = "0.0.0.0:8443"
prefer-ip = "only-ipv4"
allow-fallback-on-unknown-dc = true
auto-update = true
[network.timeout]
tcp = "3s"
http = "5s"
idle = "5m"
[defense.anti-replay]
enabled = true
max-size = "1mib"
error-rate = 0.001
| Параметр | Зачем |
|---|---|
prefer-ip = "only-ipv4"
|
Полностью исключить IPv6 (частая причина зависаний) |
allow-fallback-on-unknown-dc = true
|
Не отклонять соединения к неизвестным DC (нужно для медиа) |
auto-update = true
|
Автоматически обновлять список адресов Telegram DC |
tcp = "3s"
|
Быстрый переход к следующему DC при недоступности (уменьшает задержку подключения) |
Шаг 7: Подключение клиентов Telegram
Клиенты подключаются к РФ-серверу (не к EU!):
tg://proxy?server=IP_РФ_СЕРВЕРА&port=9443&secret=ВАШ_СЕКРЕТ
Или вручную в настройках Telegram:
| Поле | Значение |
|---|---|
| Тип | MTProto |
| Сервер | IP вашего РФ-сервера |
| Порт | 9443 |
| Секрет | тот же секрет, что сгенерирован для mtg |
Управление туннелем
| Команда (на РФ-сервере) | Описание |
|---|---|
systemctl status mtg-tunnel
|
Проверить статус туннеля |
systemctl restart mtg-tunnel
|
Перезапустить туннель |
| grep 9443 | Проверить, слушается ли порт |
journalctl -u mtg-tunnel -f
|
Логи туннеля в реальном времени |
Увеличение лимита SSH-сессий на EU-сервере
Если более 10 клиентов подключаются одновременно, увеличьте лимит на EU-сервере:
# Проверить текущий лимит
grep MaxSessions /etc/ssh/sshd_config
# Установить высокий лимит
echo "MaxSessions 100" >> /etc/ssh/sshd_config
systemctl reload sshd
Диагностика проблем с туннелем
| Проблема | Причина | Решение |
|---|---|---|
| Порт 9443 не слушается | autossh не запущен или SSH-соединение не установлено | systemctl restart mtg-tunnel и проверьте логи
|
Permission denied (publickey)
|
SSH-ключ не установлен на EU-сервер | Повторите ssh-copy-id root@IP_EU_СЕРВЕРА
|
| Туннель часто обрывается | Нестабильное соединение между серверами | autossh переподключится автоматически; проверьте качество сети |
| Telegram показывает 🔴 на прокси | Порт 9443 закрыт файрволом на РФ-сервере | ufw allow 9443/tcp
|
📝 Краткая шпаргалка (всё в одном)
# 1. Скачать и установить
curl -sL https://github.com/9seconds/mtg/releases/download/v2.2.4/mtg-2.2.4-linux-amd64.tar.gz -o /tmp/mtg.tar.gz
tar -xzf /tmp/mtg.tar.gz -C /tmp/
mv /tmp/mtg-2.2.4-linux-amd64/mtg /usr/local/bin/mtg
chmod +x /usr/local/bin/mtg
# 2. Сгенерировать секрет
mtg generate-secret --hex google.com
# Сохраните вывод!
# 3. Создать конфиг (замените SECRET на ваш секрет)
cat > /etc/mtg.toml << EOF
secret = "ВАШ_СЕКРЕТ"
bind-to = "0.0.0.0:8443"
prefer-ip = "only-ipv4"
allow-fallback-on-unknown-dc = true
auto-update = true
[network.timeout]
tcp = "3s"
http = "5s"
idle = "5m"
[defense.anti-replay]
enabled = true
max-size = "1mib"
error-rate = 0.001
EOF
# 4. Создать systemd-сервис
cat > /etc/systemd/system/mtg.service << 'EOF'
[Unit]
Description=MTProto Proxy (mtg)
After=network.target
[Service]
ExecStart=/usr/local/bin/mtg run /etc/mtg.toml
Restart=always
RestartSec=5
[Install]
WantedBy=multi-user.target
EOF
# 5. Запустить
systemctl daemon-reload
systemctl enable --now mtg
# 6. Открыть порт
ufw allow 8443/tcp
# 7. Проверить
systemctl status mtg
# 8. Ссылка для клиентов:
# tg://proxy?server=IP_СЕРВЕРА&port=8443&secret=ВАШ_СЕКРЕТ