--- name: mtproto-proxy description: >- Deploy MTProto proxy (Telegram proxy) via Docker on a VPS. Uses seriyps/mtproto-proxy image with Fake TLS support, configurable ports, secret rotation, and Docker-based deployment. tags: - mtproto - telegram - proxy - docker - fake-tls category: devops --- # MTProto Proxy — Telegram Proxy via Docker ## When to Use This Skill Use this skill when you need to: - Deploy a Telegram MTProto proxy on a VPS for bypassing blocking - Configure Fake TLS (секрет с префиксом `ee`) для маскировки под HTTPS - Заменить или добавить MTProto рядом с существующими XRay/AmneziaWG прокси - Регенерировать секрет прокси (ротация ключей) - Проксировать Telegram, когда прямые MTProto подключения заблокированы ## Deploy ### 1. Выбор порта MTProto proxy должен работать на порту, **не занятом другими сервисами**: ```bash # Проверить занятые порты ssh root@VPS_IP "ss -tlnp" ``` Рекомендуемые незанятые порты, если 443/8443 заняты XRay: - `2053` — Cloudflare alt HTTPS, проходит у большинства операторов - `2096` — Cloudflare alt HTTPS - `10000` — редко блокируется - `30000-65535` — высокие порты, почти никогда не блокируются ### 2. Запуск контейнера **Важно:** Образ `seriyps/mtproto-proxy` использует переменные окружения `MTP_PORT`, `MTP_SECRET`, `MTP_TAG` (не `SECRET`, не `TAG`). Скрипт `start.sh` внутри контейнера читает именно эти переменные. ```bash # Сгенерировать секрет и tag MTP_SECRET=$(head -c 16 /dev/urandom | xxd -ps) MTP_TAG=$(head -c 16 /dev/urandom | xxd -ps) # Запустить (без Fake TLS) docker run -d --name mtproto-proxy \ --restart unless-stopped \ -p : \ -e MTP_PORT= \ -e MTP_SECRET=$MTP_SECRET \ -e MTP_TAG=$MTP_TAG \ seriyps/mtproto-proxy ``` ### 3. Fake TLS (рекомендуется) Чтобы трафик маскировался под обычный HTTPS, добавь префикс `ee` к секрету: ```bash MTP_SECRET=$(echo -n 'ee' && head -c 15 /dev/urandom | xxd -ps) ``` Итоговый секрет будет 32 hex-символа, начинается с `ee`. ### 4. Проверка ```bash # Статус контейнера docker ps --filter name=mtproto-proxy --format '{{.Names}} {{.Status}} {{.Ports}}' # Логи docker logs mtproto-proxy 2>&1 # Порт слушается ss -tlnp | grep # Ссылка для подключения (отображается в логах) # https://t.me/proxy?server=&port=&secret= ``` ### 5. Генерация ссылки для подключения Ссылка для Telegram вида: ``` https://t.me/proxy?server=&port=&secret= ``` Если секрет с `ee` (Fake TLS), Telegram сам определит тип и подключится с маскировкой. ## Ротация секрета ```bash docker rm -f mtproto-proxy MTP_SECRET=$(echo -n 'ee' && head -c 15 /dev/urandom | xxd -ps) MTP_TAG=$(head -c 16 /dev/urandom | xxd -ps) docker run -d --name mtproto-proxy \ --restart unless-stopped \ -p : \ -e MTP_PORT= \ -e MTP_SECRET=$MTP_SECRET \ -e MTP_TAG=$MTP_TAG \ seriyps/mtproto-proxy ``` ## Pitfalls 1. **Переменные окружения — `MTP_*`, а не `SECRET`/`TAG`.** Скрипт `start.sh` читает `MTP_PORT`, `MTP_SECRET`, `MTP_TAG`. Если передать `SECRET=d3ff9c...`, контейнер запустится с дефолтным секретом из sys.config (`d0d6e111bada5511fcce9584deadbeef`), а не с твоим. 2. **Порт внутри контейнера — 1443 по умолчанию.** Если не задать `MTP_PORT`, контейнер слушает на 1443 внутри. При маппинге `-p 2053:1443` надо указывать порт 1443 справа, а не 2053. 3. **Порт в маппинге должен совпадать с MTP_PORT.** Если `MTP_PORT=2053`, то маппинг должен быть `-p 2053:2053`. Иначе порты не совпадут. 4. **Fake TLS секрет:** должен начинаться на `ee` (32 hex символа). Telegram на клиенте сам определяет тип секрета по префиксу. 5. **Не занимать порты XRay:** если на сервере уже стоит XRay Reality на 443/8443, выбирай другой порт. 6. **Firewall:** если включён ufw/iptables, не забудь открыть порт. ## Related Skills - `networking-proxy` — umbrella для всех прокси/туннелей (XRay, AmneziaWG, Shadowsocks) - `hermes-agent` — для управления конфигом агента