Установка MTProto Proxy (mtg) на Linux-сервере

Материал из wolfram
Версия от 09:45, 1 апреля 2026; Владимир (обсуждение | вклад)
(разн.) ← Предыдущая версия | Текущая версия (разн.) | Следующая версия → (разн.)
Перейти к навигации Перейти к поиску

📡 Установка 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=ВАШ_СЕКРЕТ

ℹ️ Проект: https://github.com/9seconds/mtg

Версия: v2.2.4 (март 2026)

Лицензия: MIT