Если вы хотите иметь свой приватный MTProto прокси для Telegram — без зависимости от публичных прокси, без посредников и с полным контролем — эта статья для вас.

Большинство руководств написаны под Linux. Но что если ваш сервер работает на Windows? В этой статье разберём полный цикл: от выбора образа до автоматизации смены секрета — всё на Windows Server с Docker.

Что получим в итоге:

  • Приватный MTProto прокси с Fake TLS (трафик маскируется под HTTPS)

  • Изоляция на отдельном IP — основной IP сервера остаётся чистым

  • PowerShell-скрипт для пересоздания прокси с новым секретом одной командой

  • Автозапуск после перезагрузки сервера


Что такое MTProto и Fake TLS

MTProto — собственный протокол Telegram для передачи данных. MTProto-прокси ретранслирует зашифрованный трафик Telegram, при этом сервер-прокси не может читать ваши сообщения — шифрование end-to-end остаётся неприкосновенным.

Fake TLS — режим работы прокси, при котором соединение маскируется под обычный HTTPS к какому-либо домену (например www.google.com). DPI-системы видят обычный TLS handshake и не могут отличить прокси от посещения сайта.

Секрет в формате Fake TLS начинается с ee и содержит hex-закодированный домен:

ee + <16 случайных байт в hex> + <домен в hex>

Выбор образа Docker

Существует два популярных образа:

Образ

Поддержка Fake TLS

Последнее обновление

Примечание

telegrammessenger/proxy

2020 год

Официальный от Telegram, устарел

nineseconds/mtg:2

Активно

Open source, Go, рекомендуется

Мы используем nineseconds/mtg:2 — он современный, поддерживает Fake TLS и активно поддерживается сообществом. Исходный код: github.com/9seconds/mtg.


Требования

  • Windows Server с установленным Docker

  • Внешний IP адрес (желательно отдельный под прокси)

  • Открытый порт (в примере 2443)

  • PowerShell 5.1+


Шаг 1: Подготовка отдельного IP

Рекомендуется привязать прокси к отдельному IP, а не к основному IP сервера. Это защитит основной IP от попадания в блокировки.

Большинство хостинг-провайдеров позволяют добавить дополнительный IP через панель управления. После добавления убедитесь что он привязан к интерфейсу:

ipconfig | findstr "ВАШ_НОВЫЙ_IP"

Если IP отображается — всё готово.


Шаг 2: Открыть порт в Windows Firewall

netsh advfirewall firewall add rule `
  name="mtproto-2443" `
  dir=in `
  action=allow `
  protocol=TCP `
  localport=2443

Важно: На Windows Server порт 443 глобально резервируется службой HTTP.sys и недоступен для Docker. Используйте любой другой порт — Telegram поддерживает произвольные порты в настройках прокси.


Шаг 3: Создать конфигурационный файл

nineseconds/mtg:2 работает через конфиг-файл в формате TOML. Важный нюанс: файл должен быть без BOM (Byte Order Mark). Стандартный Set-Content -Encoding UTF8 в PowerShell 5.x добавляет BOM, что ломает парсер TOML.

Правильный способ записи через .NET:

# Генерируем секрет встроенной командой mtg
$SECRET = docker run --rm nineseconds/mtg:2 generate-secret www.google.com

# Создаём папку
New-Item -ItemType Directory -Force -Path C:\mtg-config | Out-Null

# Записываем конфиг БЕЗ BOM
$configContent = 'secret = "' + $SECRET + '"' + "`nbind-to = `"0.0.0.0:3128`""
$utf8NoBom = New-Object System.Text.UTF8Encoding $false
[System.IO.File]::WriteAllText("C:\mtg-config\config.toml", $configContent, $utf8NoBom)

Параметр bind-to = "0.0.0.0:3128" — это адрес внутри контейнера. Снаружи доступ всё равно контролируется через -p в Docker, поэтому 0.0.0.0 внутри контейнера безопасен.


Шаг 4: Запустить контейнер

docker run -d `
  --name mtproto-proxy `
  --restart always `
  -p ВАШ_IP:2443:3128 `
  -v C:\mtg-config:/config `
  nineseconds/mtg:2 `
  run /config/config.toml

Разберём параметры:

  • --restart always — автозапуск после перезагрузки сервера

  • -p ВАШ_IP:2443:3128 — привязка к конкретному IP, порт 2443 снаружи → 3128 внутри контейнера

  • -v C:\mtg-config:/config — монтируем папку с конфигом внутрь контейнера

Проверяем что контейнер запустился:

docker ps --filter name=mtproto-proxy

Должны увидеть статус Up.


Шаг 5: Проверить доступность порта

Test-NetConnection -ComputerName ВАШ_IP -Port 2443

Если TcpTestSucceeded : True — порт открыт и доступен снаружи.


Шаг 6: Подключиться в Telegram

В Telegram: Настройки → Данные и память → Использовать прокси → Добавить прокси → MTProto

Поле

Значение

Сервер

ваш IP

Порт

2443

Секрет

значение из переменной $SECRET

Или сформируйте ссылку для автоподключения:

tg://proxy?server=ВАШ_IP&port=2443&secret=ВАШ_СЕКРЕТ

Нажав на такую ссылку в Telegram, настройки прокси добавятся автоматически.


Автоматизация: скрипт пересоздания прокси

Если нужно сменить секрет (например передать прокси другому пользователю или сменить по расписанию) — один скрипт делает всё:

# mtproto-setup.ps1
$SERVER_IP    = "ВАШ_IP"
$PORT         = "2443"
$INTERNAL_PORT = "3128"
$CONFIG_DIR   = "C:\mtg-config"
$CONTAINER_NAME = "mtproto-proxy"

Write-Host "=============================" -ForegroundColor Cyan
Write-Host "  MTProto Proxy Setup"         -ForegroundColor Cyan
Write-Host "=============================" -ForegroundColor Cyan

# 1. Генерация секрета через встроенную команду mtg
Write-Host "`n[1/5] Generating secret..." -ForegroundColor Yellow
$SECRET = docker run --rm nineseconds/mtg:2 generate-secret www.google.com
Write-Host "    Done." -ForegroundColor Green

# 2. Запись конфига без BOM
Write-Host "`n[2/5] Writing config..." -ForegroundColor Yellow
New-Item -ItemType Directory -Force -Path $CONFIG_DIR | Out-Null
$configContent = 'secret = "' + $SECRET + '"' + "`nbind-to = `"0.0.0.0:$INTERNAL_PORT`""
$utf8NoBom = New-Object System.Text.UTF8Encoding $false
[System.IO.File]::WriteAllText("$CONFIG_DIR\config.toml", $configContent, $utf8NoBom)
Write-Host "    Config saved to $CONFIG_DIR\config.toml" -ForegroundColor Green

# 3. Удаление старого контейнера
Write-Host "`n[3/5] Removing old container..." -ForegroundColor Yellow
docker stop $CONTAINER_NAME 2>$null | Out-Null
docker rm   $CONTAINER_NAME 2>$null | Out-Null
Write-Host "    Done." -ForegroundColor Green

# 4. Запуск нового контейнера
Write-Host "`n[4/5] Starting container..." -ForegroundColor Yellow
docker run -d `
    --name $CONTAINER_NAME `
    --restart always `
    -p "${SERVER_IP}:${PORT}:${INTERNAL_PORT}" `
    -v "${CONFIG_DIR}:/config" `
    nineseconds/mtg:2 `
    run /config/config.toml | Out-Null

Start-Sleep -Seconds 3

# 5. Проверка статуса
Write-Host "`n[5/5] Checking status..." -ForegroundColor Yellow
$status = docker inspect --format="{{.State.Status}}" $CONTAINER_NAME 2>$null

if ($status -eq "running") {
    Write-Host "    Container is running!" -ForegroundColor Green
    $link = 'tg://proxy?server=' + $SERVER_IP + '&port=' + $PORT + '&secret=' + $SECRET
    Write-Host "`n=============================" -ForegroundColor Cyan
    Write-Host "  Server : $SERVER_IP"           -ForegroundColor White
    Write-Host "  Port   : $PORT"                -ForegroundColor White
    Write-Host "  Secret : $SECRET"              -ForegroundColor White
    Write-Host "`n  Telegram link:"               -ForegroundColor White
    Write-Host "  $link"                         -ForegroundColor Green
    Write-Host "=============================`n" -ForegroundColor Cyan
} else {
    Write-Host "    ERROR! Container failed to start." -ForegroundColor Red
    docker logs $CONTAINER_NAME
}

Запуск:

powershell -ExecutionPolicy Bypass -File .\mtproto-setup.ps1

Скрипт выведет готовую ссылку прямо в терминале


Архитектура и безопасность

Телефон пользователя
       │
       │ Зашифров��нный трафик Telegram (E2E)
       │ Маскируется под HTTPS (Fake TLS)
       ▼
[Отдельный IP :2443]
       │
  Docker контейнер
  nineseconds/mtg:2
       │
       │ Ретрансляция зашифрованного трафика
       ▼
  Серверы Telegram

Что видит прокси-сервер:

  • IP-адреса подключающихся устройств

  • Объём трафика

  • Время подключений

Что прокси-сервер НЕ видит:

  • Содержимое сообщений (шифрование E2E Telegram)

  • Список контактов

  • Медиафайлы


Типичные проблемы и решения

Проблема: toml: invalid character at start of key: ï
Причина: Set-Content -Encoding UTF8 в PowerShell 5.x записывает BOM
Решение: Использовать [System.IO.File]::WriteAllText с UTF8Encoding $false


Проблема: ports are not available: listen tcp 0.0.0.0:443
Причина: На Windows порт 443 глобально захвачен службой HTTP.sys
Решение: Использовать любой другой порт (2443, 8443, 5443 и т.д.)


Проблема: unknown flag --bind
Причина: nineseconds/mtg:2 не поддерживает флаги командной строки — только конфиг-файл
Решение: Передавать конфиг через -v и run /config/config.toml


Проблема: Telegram показывает «Недоступен» при проверке
Причина: Порт закрыт в Windows Firewall
Решение:

netsh advfirewall firewall add rule name="mtproto-2443" dir=in action=allow protocol=TCP localport=2443

Итог

Мы подняли приватный MTProto прокси с Fake TLS на Windows Server:

  • Изолирован на отдельном IP

  • Трафик маскируется под HTTPS — сложно детектировать

  • Автозапуск при перезагрузке сервера (--restart always)

  • Секрет хранится в файле — не меняется при перезапуске

  • Один скрипт для пересоздания прокси с новым секретом

Прокси рассчитан на приватное использование — для себя и доверенных людей. Один экземпляр обслуживает неограниченное количество пользователей с одним секретом.