Если вы хотите иметь свой приватный 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 | Последнее обновление | Примечание |
|---|---|---|---|
| ❌ | 2020 год | Официальный от Telegram, устарел |
| ✅ | Активно | 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 |
Порт |
|
Секрет | значение из переменной |
Или сформируйте ссылку для автоподключения:
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)Секрет хранится в файле — не меняется при перезапуске
Один скрипт для пересоздания прокси с новым секретом
Прокси рассчитан на приватное использование — для себя и доверенных людей. Один экземпляр обслуживает неограниченное количество пользователей с одним секретом.
