Установка MTProto Proxy (mtg) на Linux-сервере: различия между версиями
Владимир (обсуждение | вклад) Новая страница: « = 📡 Установка MTProto Proxy (mtg) на Linux-сервере = Полная пошаговая инструкция для новичков. Проверено на '''Ubuntu/Debian''' с <code>mtg v2.2.4</code>. ---- ---- == Что это и зачем == '''mtg''' — это легковесный MTProto-прокси для Telegram. Его задача — дать пользователям доступ к Telegram, встраивая пр...» |
Владимир (обсуждение | вклад) мНет описания правки |
||
| (не показаны 2 промежуточные версии этого же участника) | |||
| Строка 2: | Строка 2: | ||
= 📡 Установка MTProto Proxy (mtg) на Linux-сервере = | = 📡 Установка MTProto Proxy (mtg) на Linux-сервере = | ||
Полная пошаговая инструкция для новичков. Проверено на '''Ubuntu/Debian''' с <code>mtg v2.2.4</code>. | Полная пошаговая инструкция для новичков. Проверено на '''Ubuntu/Debian''' с <code>mtg v2.2.4</code>. | ||
---- | ---- | ||
| Строка 44: | Строка 43: | ||
== Установка mtg == | == Установка mtg == | ||
=== Шаг 1: Подключитесь к серверу по SSH === | === Шаг 1: Подключитесь к серверу по SSH === | ||
<syntaxhighlight lang="bash"> | <syntaxhighlight lang="bash"> | ||
| Строка 134: | Строка 132: | ||
mtg v2 использует конфигурационный файл в формате '''TOML'''. | mtg v2 использует конфигурационный файл в формате '''TOML'''. | ||
=== | === Рекомендуемый конфиг === | ||
<syntaxhighlight lang="bash"> | <syntaxhighlight lang="bash"> | ||
cat > /etc/mtg.toml << 'EOF' | cat > /etc/mtg.toml << 'EOF' | ||
| Строка 143: | Строка 141: | ||
# 0.0.0.0 означает "все сетевые интерфейсы" | # 0.0.0.0 означает "все сетевые интерфейсы" | ||
bind-to = "0.0.0.0:8443" | 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-атак (рекомендуется оставить включённой) | # Защита от replay-атак (рекомендуется оставить включённой) | ||
| Строка 152: | Строка 166: | ||
</syntaxhighlight><div style="padding: 10px 15px; margin: 10px 0; background-color: #fff3cd; border-left: 4px solid #ffc107; border-radius: 4px;"> | </syntaxhighlight><div style="padding: 10px 15px; margin: 10px 0; background-color: #fff3cd; border-left: 4px solid #ffc107; border-radius: 4px;"> | ||
⚠️ '''Внимание:''' Не забудьте заменить значение <code>secret</code> на ваш настоящий секрет, сгенерированный на предыдущем шаге! | ⚠️ '''Внимание:''' Не забудьте заменить значение <code>secret</code> на ваш настоящий секрет, сгенерированный на предыдущем шаге! | ||
</div><div style="padding: 10px 15px; margin: 10px 0; background-color: #d1ecf1; border-left: 4px solid #17a2b8; border-radius: 4px;"> | |||
💡 '''Важно о структуре TOML:''' Все глобальные параметры (<code>secret</code>, <code>bind-to</code>, <code>prefer-ip</code> и т.д.) должны находиться '''до''' секций <code>[...]</code>. Если параметр окажется после <code>[defense.anti-replay]</code> — он будет проигнорирован! | |||
</div><div style="padding: 10px 15px; margin: 10px 0; background-color: #fff3cd; border-left: 4px solid #ffc107; border-radius: 4px;"> | |||
⚠️ '''Типичное наложение проблем:''' На практике часто возникают '''две проблемы одновременно''': | |||
'''1.''' IPv6 на VPS работает нестабильно → mtg зависает на попытках подключения к DC через IPv6 → медиа не загружается. | |||
'''2.''' ТСПУ замедляет международные MTProto-соединения → подключение занимает 10–40 секунд. | |||
Симптомы обеих проблем похожи. Решение: <code>prefer-ip = "only-ipv4"</code> (пункт 1) + SSH-туннель через РФ-сервер (пункт 2, см. раздел ниже). | |||
</div> | </div> | ||
| Строка 181: | Строка 205: | ||
== Первый запуск и проверка == | == Первый запуск и проверка == | ||
=== Запуск в режиме отладки (для первого раза) === | === Запуск в режиме отладки (для первого раза) === | ||
Добавьте временно <code>debug = true</code> в начало конфига:<syntaxhighlight lang="bash"> | Добавьте временно <code>debug = true</code> в начало конфига:<syntaxhighlight lang="bash"> | ||
| Строка 303: | Строка 326: | ||
== Подключение клиентов Telegram == | == Подключение клиентов Telegram == | ||
=== Способ 1: Ссылка для быстрого подключения (рекомендуется) === | === Способ 1: Ссылка для быстрого подключения (рекомендуется) === | ||
Сформируйте ссылку и отправьте её пользователям:<pre> | Сформируйте ссылку и отправьте её пользователям:<pre> | ||
| Строка 314: | Строка 336: | ||
=== Способ 2: Ручная настройка === | === Способ 2: Ручная настройка === | ||
==== Android ==== | ==== Android ==== | ||
<pre> | <pre> | ||
| Строка 352: | Строка 373: | ||
== Диагностика проблем == | == Диагностика проблем == | ||
=== Встроенная диагностика mtg === | === Встроенная диагностика mtg === | ||
В v2.2.4 есть команда <code>mtg doctor</code>:<syntaxhighlight lang="bash"> | В v2.2.4 есть команда <code>mtg doctor</code>:<syntaxhighlight lang="bash"> | ||
| Строка 404: | Строка 424: | ||
== Продвинутые настройки == | == Продвинутые настройки == | ||
=== Полный конфиг с пояснениями === | === Полный конфиг с пояснениями === | ||
<syntaxhighlight lang="toml"> | <syntaxhighlight lang="toml"> | ||
| Строка 416: | Строка 435: | ||
# Адрес:порт для прослушивания | # Адрес:порт для прослушивания | ||
bind-to = "0.0.0.0:8443" | 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 | concurrency = 8192 | ||
# Допуск расхождения времени (для FakeTLS проверки) | # Допуск расхождения времени (для FakeTLS проверки) | ||
| Строка 431: | Строка 458: | ||
dns = "https://1.1.1.1" | dns = "https://1.1.1.1" | ||
# Таймауты | # Таймауты (уменьшены для быстрого переключения при недоступности DC) | ||
[network.timeout] | [network.timeout] | ||
tcp = " | tcp = "3s" | ||
http = " | http = "5s" | ||
idle = " | idle = "5m" | ||
# Защита от replay-атак | # Защита от replay-атак | ||
| Строка 462: | Строка 489: | ||
run /config.toml | run /config.toml | ||
</syntaxhighlight> | </syntaxhighlight> | ||
---- | |||
== 🔗 SSH-туннель через промежуточный сервер (РФ → Европа) == | |||
Если ТСПУ (DPI) блокирует или замедляет прямое MTProto-подключение к европейскому серверу, можно проложить '''SSH-туннель''' через промежуточный сервер в РФ. Клиенты Telegram по-прежнему просто вводят прокси в настройках — '''никакого дополнительного ПО не требуется'''. | |||
=== Почему это нужно === | |||
ТСПУ умеет распознавать MTProto FakeTLS на международных каналах и '''троттлить''' (замедлять) или обрывать соединения. Симптомы: | |||
* Подключение к прокси занимает минуты | |||
* Чаты загружаются, но медиа (фото, видео, файлы) — нет | |||
* Порт доступен (<code>Test-NetConnection</code> проходит), но Telegram не подключается | |||
При этом трафик '''внутри РФ''' (Клиент → РФ-сервер) не подвергается такому же анализу. SSH-туннель между серверами шифрует трафик и делает его невидимым для ТСПУ. | |||
=== Схема работы === | |||
<pre> | |||
Внутри РФ Зашифрованный SSH | |||
┌──────────┐ MTProto FakeTLS ┌──────────┐ ┌──────────────┐ ┌──────────┐ | |||
│ 📱 │ ───────────────────► │ 🇷🇺 РФ │ ──► │ 🇪🇺 Европа │ ──► │ ☁️ │ | |||
│ Telegram │ ТСПУ не трогает │ Сервер │ SSH │ Сервер (mtg) │ │ Telegram │ | |||
│ клиент │ внутренний трафик │ (туннель)│ │ │ │ серверы │ | |||
└──────────┘ └──────────┘ └──────────────┘ └──────────┘ | |||
порт 9443 порт 8443 | |||
</pre> | |||
=== Требования === | |||
{| class="wikitable" | |||
!Компонент | |||
!Описание | |||
|- | |||
|'''РФ-сервер''' | |||
|VPS в России с SSH-доступом (может быть тот же, где стоит 3X-UI) | |||
|- | |||
|'''EU-сервер''' | |||
|Сервер в Европе, где уже работает mtg | |||
|- | |||
|'''SSH между серверами''' | |||
|РФ-сервер должен иметь SSH-доступ к EU-серверу | |||
|- | |||
|'''autossh''' | |||
|Утилита для автоматического переподключения SSH-туннеля | |||
|} | |||
=== Шаг 1: Настройка SSH-ключей (без пароля) === | |||
На '''РФ-сервере''' выполните:<syntaxhighlight lang="bash"> | |||
# Сгенерировать ключ (если ещё нет) | |||
ssh-keygen -t ed25519 -N "" -f ~/.ssh/id_ed25519 | |||
# Скопировать публичный ключ на EU-сервер | |||
# (потребуется ввести пароль EU-сервера один раз) | |||
ssh-copy-id root@IP_EU_СЕРВЕРА | |||
# Проверить что вход без пароля работает | |||
ssh root@IP_EU_СЕРВЕРА "echo OK" | |||
</syntaxhighlight>Если в ответ получили <code>OK</code> — ключи настроены правильно. | |||
=== Шаг 2: Установка autossh === | |||
На '''РФ-сервере''':<syntaxhighlight lang="bash"> | |||
apt install autossh -y | |||
</syntaxhighlight><code>autossh</code> — обёртка над SSH, которая автоматически переподключается при обрыве соединения. | |||
=== Шаг 3: Запуск туннеля (ручной тест) === | |||
<syntaxhighlight lang="bash"> | |||
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_СЕРВЕРА | |||
</syntaxhighlight> | |||
{| class="wikitable" | |||
!Параметр | |||
!Назначение | |||
|- | |||
|<code>-M 0</code> | |||
|Отключить мониторинг-порт autossh (используем ServerAlive) | |||
|- | |||
|<code>-N</code> | |||
|Не выполнять команды на удалённом сервере (только туннель) | |||
|- | |||
|<code>-f</code> | |||
|Уйти в фоновый режим | |||
|- | |||
|<code>ServerAliveInterval=30</code> | |||
|Проверять соединение каждые 30 секунд | |||
|- | |||
|<code>ServerAliveCountMax=3</code> | |||
|Переподключиться после 3 неудачных проверок (90 сек) | |||
|- | |||
|<code>-L 0.0.0.0:9443:127.0.0.1:8443</code> | |||
|Слушать порт 9443 на РФ-сервере → пробрасывать на 127.0.0.1:8443 EU-сервера | |||
|} | |||
Проверьте:<syntaxhighlight lang="bash"> | |||
ss -tlnp | grep 9443 | |||
</syntaxhighlight>Должно показать <code>ssh</code> на порту 9443. | |||
=== Шаг 4: Автозапуск через systemd === | |||
Чтобы туннель переживал перезагрузки РФ-сервера, создайте сервис:<syntaxhighlight lang="bash"> | |||
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 | |||
</syntaxhighlight>Проверка:<syntaxhighlight lang="bash"> | |||
systemctl status mtg-tunnel | |||
ss -tlnp | grep 9443 | |||
</syntaxhighlight> | |||
=== Шаг 5: Открыть порт на РФ-сервере === | |||
<syntaxhighlight lang="bash"> | |||
ufw allow 9443/tcp | |||
</syntaxhighlight> | |||
=== Шаг 6: Оптимальный конфиг mtg на EU-сервере === | |||
Для стабильной работы через туннель рекомендуется следующий конфиг:<syntaxhighlight lang="toml"> | |||
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 | |||
</syntaxhighlight> | |||
{| class="wikitable" | |||
!Параметр | |||
!Зачем | |||
|- | |||
|<code>prefer-ip = "only-ipv4"</code> | |||
|Полностью исключить IPv6 (частая причина зависаний) | |||
|- | |||
|<code>allow-fallback-on-unknown-dc = true</code> | |||
|Не отклонять соединения к неизвестным DC (нужно для медиа) | |||
|- | |||
|<code>auto-update = true</code> | |||
|Автоматически обновлять список адресов Telegram DC | |||
|- | |||
|<code>tcp = "3s"</code> | |||
|Быстрый переход к следующему DC при недоступности (уменьшает задержку подключения) | |||
|} | |||
=== Шаг 7: Подключение клиентов Telegram === | |||
Клиенты подключаются к '''РФ-серверу''' (не к EU!):<pre> | |||
tg://proxy?server=IP_РФ_СЕРВЕРА&port=9443&secret=ВАШ_СЕКРЕТ | |||
</pre>Или вручную в настройках Telegram: | |||
{| class="wikitable" | |||
!Поле | |||
!Значение | |||
|- | |||
|'''Тип''' | |||
|MTProto | |||
|- | |||
|'''Сервер''' | |||
|IP вашего '''РФ-сервера''' | |||
|- | |||
|'''Порт''' | |||
|9443 | |||
|- | |||
|'''Секрет''' | |||
|тот же секрет, что сгенерирован для mtg | |||
|} | |||
=== Управление туннелем === | |||
{| class="wikitable" | |||
!Команда (на РФ-сервере) | |||
!Описание | |||
|- | |||
|<code>systemctl status mtg-tunnel</code> | |||
|Проверить статус туннеля | |||
|- | |||
|<code>systemctl restart mtg-tunnel</code> | |||
|Перезапустить туннель | |||
|- | |||
|grep 9443 | |||
|Проверить, слушается ли порт | |||
|- | |||
|<code>journalctl -u mtg-tunnel -f</code> | |||
|Логи туннеля в реальном времени | |||
|} | |||
=== Увеличение лимита SSH-сессий на EU-сервере === | |||
Если более 10 клиентов подключаются одновременно, увеличьте лимит на '''EU-сервере''':<syntaxhighlight lang="bash"> | |||
# Проверить текущий лимит | |||
grep MaxSessions /etc/ssh/sshd_config | |||
# Установить высокий лимит | |||
echo "MaxSessions 100" >> /etc/ssh/sshd_config | |||
systemctl reload sshd | |||
</syntaxhighlight> | |||
=== Диагностика проблем с туннелем === | |||
{| class="wikitable" | |||
!Проблема | |||
!Причина | |||
!Решение | |||
|- | |||
|Порт 9443 не слушается | |||
|autossh не запущен или SSH-соединение не установлено | |||
|<code>systemctl restart mtg-tunnel</code> и проверьте логи | |||
|- | |||
|<code>Permission denied (publickey)</code> | |||
|SSH-ключ не установлен на EU-сервер | |||
|Повторите <code>ssh-copy-id root@IP_EU_СЕРВЕРА</code> | |||
|- | |||
|Туннель часто обрывается | |||
|Нестабильное соединение между серверами | |||
|autossh переподключится автоматически; проверьте качество сети | |||
|- | |||
|Telegram показывает 🔴 на прокси | |||
|Порт 9443 закрыт файрволом на РФ-сервере | |||
|<code>ufw allow 9443/tcp</code> | |||
|} | |||
---- | ---- | ||
| Строка 480: | Строка 751: | ||
secret = "ВАШ_СЕКРЕТ" | secret = "ВАШ_СЕКРЕТ" | ||
bind-to = "0.0.0.0:8443" | 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] | [defense.anti-replay] | ||
Текущая версия от 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=ВАШ_СЕКРЕТ