Telegram Proxy (MTProxy | Telemt): как создать прокси для Телеграм

/articles/tg_proxy/images/feature.png

Дисклеймер: Материал носит исключительно информационный характер. Автор не призывает к каким-либо действиям.

Статья-гайд, посвящённая установке и настройке своего Telegram-proxy на сервере.

Если вам не хочется возиться с настройкой, а нужно подключение в пару кликов, переходите к разделу Бесплатный прокси.

Привет, читатели! В связи со скачком популярности темы, я тоже решил хайпануть и вновь проверить свой навык жать по клавишам в правильном порядке. Сразу оговорюсь, что тут не будет рассказываться, как купить сервер и как его настроить должным образом. Об этом можете почитать в другой части интернета, либо взглянуть на мои предыдущие статьи: аренда сервера, настройка сервера. Тем не менее, как и в предыдущих гайдах, я постараюсь максимально пошагово и покомандно показать, что и как делать.

Предупреждение
Инструкции актуальны только для Ubuntu 22.04 и могут незначительно отличаться для других версий данного дистрибутива.

Растянем хронометраж базовыми понятиями и пояснениями, чтобы все понимали, о чём речь.

Telegram-прокси

Саму суть проксирования, думаю, уже все знают. Вместо прямого соединения между вашим ПК и серверами Telegram, мы вклиниваем сервер, который будет стоять посередине.

Telegram предоставляет возможность работать через два вида прокси — SOCKS и MTProxy. Первый рассматривать не будем, поскольку он никак не защищён от DPI (устройства/программы для анализа трафика, с помощью которых РКН и замедляет Telegram), поэтому сразу перейдём ко второму.

MTProxy

MTProxy — это программа, которая перенаправляет только MTProto-пакеты. Помимо того что он скрывает конечный IP-адрес от провайдера, он умеет обфусцировать трафик, запутывая DPI.

Инфо
MTProto — криптографический протокол, разработанный и используемый в Telegram. Именно благодаря ему шифруются наши сообщения, картинки и пр, и именно с ним работает MTProxy. Отсюда делаем вывод: этот прокси будет действовать исключительно в Telegram и нигде больше.

Но вот беда: MTProxy давно не обновлялся, и на данный момент имеет характерные паттерны, из-за которых он при желании будет легко детектироваться DPI, а значит нужен немного другой подход.

Telemt

Telemt — это усовершенствованная реализация MTProxy, позволяющая маскироваться под другие сайты. При попытке достучаться до сервера, не имея секретного ключа для подключения, Telemt будет пересылать на сайт, который вы указали в конфиге.

FAQ

  1. В ходе прочтения у вас мог возникнуть вопрос: “А если я буду использовать чужой MTProxy, владелец увидит мои сообщения?”.

    Ответ: однозначно нет. Как раз благодаря MTProto ваш Telegram аккаунт не смогут идентифицировать, и тем более не смогут расшифровать трафик, поскольку ключи шифрования находятся только на клиентах (приложения Telegram) и на официальных серверах Telegram.

    Всё, что увидит MTProxy, это:

    • Ваш IP;
    • Время подключения.
  2. Можно ли совершать звонки? Ответ: обычно нет. Звонить не получится по той же причине: проксируется только MTProto, а звонки в Telegram не работают на этом протоколе.

Telega

Небольшое отступление от общей темы. Вероятно, многие уже слышали о таком клиенте/клоне Telegram, как Telega. В прошлом году на Habr вышла статья с разбором декомпилированного и деобфусцированного кода, в котором выявились детали, после которых вы, возможно, передумаете использовать этот мессенджер. Статья уже удалена, но сохранилась в архивах: https://web.archive.org/web/20251106064704/https://habr.com/ru/articles/959534/.


Установка Telemt

UPD 05.03.2026

Итак, ознакомились, пора за дело. Для простоты объяснения и команд будем выполнять все действия от root.

Инфо
Самая актуальная информация по проекту тут: https://github.com/telemt/telemt.

Как обычно, будем использовать Docker. Пока в репозитории проекта нет инструкции по запуску в контейнере, но есть сторонний репозиторий с инструкцией, также постоянно обновляющийся: https://github.com/An0nX/telemt-docker.

Выполняем следующие команды:

1
2
curl -fsSL https://get.docker.com | sh
mkdir telemt && cd telemt

Создадим docker-compose: nano docker-compose.yml:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
services:
  telemt:
    image: whn0thacked/telemt-docker:3.2.1
    container_name: telemt
    restart: unless-stopped

    environment:
      RUST_LOG: "info"

    volumes:
      - ./telemt.toml:/etc/telemt.toml:ro

    ports:
      - "443:443/tcp"
      # If you enable metrics_port=9090 in config:
      # - "127.0.0.1:9090:9090/tcp"

    # Hardening
    security_opt:
      - no-new-privileges:true
    cap_drop:
      - ALL
    cap_add:
      - NET_BIND_SERVICE
    read_only: true
    tmpfs:
      - /tmp:rw,nosuid,nodev,noexec,size=16m

    ulimits:
      nofile:
        soft: 65536
        hard: 65536

    # Resource limits (optional)
    # deploy:
    #   resources:
    #     limits:
    #       cpus: "0.50"
    #       memory: 256M

    logging:
      driver: json-file
      options:
        max-size: "10m"
        max-file: "3"
Инфо

Пара советов, которые могут вам помочь в текстовом редакторе nano:

  1. Передвигать курсор мышкой не получится, впрочем как и во всём терминале, так что используйте для этого стрелки на клавиатуре.
  2. Нажмите Ctrl + O -> Enter, чтобы сохранить файл; Нажмите Ctrl + X, чтобы выйти из редактора.

Сгенерируем секретный ключ: openssl rand -hex 16 — вывод копируем и сохраняем.

Предупреждение
Секрет на то и секрет, что это.. секрет. Поэтому не раздавайте его, как и итоговую ссылку, кому попало.

Создадим конфиг прокси-сервера: nano telemt.toml:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
# === General Settings ===
[general]
# ad_tag = "00000000000000000000000000000000"
use_middle_proxy = false

[general.modes]
classic = false
secure = false
tls = true

[[server.listeners]]
ip = "0.0.0.0"
announce = "<SERVER_IP>"

# === Anti-Censorship & Masking ===
[censorship]
tls_domain = "<DOMAIN>"

[access.users]
# format: "username" = "32_hex_chars_secret"
hello = "<SECRET>"

В этом конфиге нужно будет заменить 3 вещи:

  1. <SERVER_IP> на IP сервера;

  2. <SECRET> на секретный ключ, сгенерированный предыдущей командой;

  3. <DOMAIN> на любой HTTPS‑домен. Домен для TLS‑маскировки должен быть популярным и правдоподобным для региона, где расположен сервер. Важно, чтобы выбранный домен не выглядел аномально относительно IP‑адреса VPS.

    Например, если сервер расположен в РФ, логично использовать домен, характерный для российского сегмента интернета. Если сервер находится в Европе — подойдёт популярный международный домен.

    Инфо
    Ещё надёжнее использовать собственный домен, размещённый на том же сервере, чтобы TLS‑профиль выглядел максимально естественно, но об этом чуть позже.

Готово! Запускаем контейнер: docker compose up -d && docker compose logs -ft. В логах ищем первую ссылку tg://… и копируем её.

Инфо
Чтобы остановить логи Docker, нажмите Ctrl + C.
/articles/tg_proxy/images/tg_link.png

Вставим скопированную ссылку в адресную строку браузера -> он предложит нам открыть Telegram, соглашаемся -> в приложении появится всплывающее окно, жмём “Включить”.

/articles/tg_proxy/images/tg_connect.png

В десктопной версии Telegram внизу в колонке с чатами появится значок щита, означающий, что прокси успешно подключен.

/articles/tg_proxy/images/tg_shield.png

Чтобы отключиться:

  • В десктопной версии нажмите на значок щита -> выберите пункт “Использовать системные прокси настройки”;
  • На Android в разделе с чатами нажмите три точки -> “Прокси” -> Выключите “Использовать прокси”;
  • На Iphone в разделе с чатами нажмите на значок щита -> Выключите “Использовать прокси”.

Telemt Advanced

NEW 05.03.2026

Как мы уже поняли, Telemt маскирует себя под сайт, указанный в censorship.tls_domain. И тут возникает проблема: если на устройстве одновременно работает tunnel с VLESS + Reality и в Telegram включен прокси Telemt с дефолтными настройками, то второй просто не будет функционировать, и Telegram застрянет в бесконечных попытках реконнекта.

Причину такого поведения автор Telemt описал в своих доках. Мы же сконцентрируемся на решении этой проблемы, рассмотрев как простой и не очень хороший способ, так и более сложный и менее опасный.

Self-steal

Чтобы всё заработало даже с Reality, достаточно сделать несколько шагов:

  1. Получить домен и указать A-запись. Как получить бесплатный поддомен, писал тут.
  2. В censorship.tls_domain вместо текущего домена прописать свой собственный.
  3. Если хочется видеть домен вместо IP в ссылке, поменять строку в server.listeners.announce на домен вместо нынешнего IP.
/articles/tg_proxy/images/telemt_advanced.png

Вот и всё. Для перезапуска используем: docker compose down && docker compose up -d && docker compose logs -ft и копируем ссылку из логов. Теперь подключение будет идти даже в случае, если на устройстве включен VPN с Reality.

Чем плох этот вариант? Наш домен не отдаёт сертификат, и в случае, если DPI захочет проверить факт существования сайта, прокси быстро урежут. Чтобы этого не произошло, логично, что нужно поднять сайт на нашем домене.

Улучшенный self-steal

Тут мне пришлось немного заморочиться, чтобы это всё работало, да ещё и в докере.

Во-первых, нужно остановить текущий контейнер: docker compose down.

Далее, изменим telemt.toml следующим образом rm -telemt.toml && nano telemt.toml. Также вставляем нужные значения вместо <DOMAIN> (2 раза) и <SECRET>:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
# === General Settings ===
[general]
# ad_tag = "00000000000000000000000000000000"
fast_mode = true
use_middle_proxy = false

[general.modes]
classic = false
secure = false
tls = true

[server]
port = 443
listen_addr_ipv4 = "0.0.0.0"
[[server.listeners]]
ip = "0.0.0.0"
announce = "<DOMAIN>"

# === Anti-Censorship & Masking ===
[censorship]
tls_domain = "<DOMAIN>"
mask_port = 8443
mask_host = "nginx"

[access.users]
# format: "username" = "32_hex_chars_secret"
hello = "<SECRET>"

Удаляем текущий .yml и создаём новый: rm docker-compose.yml && nano docker-compose.yml:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
services:
  telemt:
    image: whn0thacked/telemt-docker:telemt-cb0832b803c3
    container_name: telemt
    environment:
      RUST_LOG: "info"
    volumes:
      - ./telemt.toml:/etc/telemt.toml:ro
    restart: unless-stopped
    security_opt:
      - no-new-privileges:true
    cap_drop:
      - ALL
    cap_add:
      - NET_BIND_SERVICE
    read_only: true
    tmpfs:
      - /tmp:rw,nosuid,nodev,noexec,size=16m
    ulimits:
      nofile:
        soft: 65536
        hard: 65536
    logging:
      driver: json-file
      options:
        max-size: "10m"
        max-file: "3"
    networks:
      - telemt-network

  nginx:
    image: nginx:1.28.0-alpine3.21
    container_name: nginx
    ports:
      - 443:443
    volumes:
      - ./nginx.conf:/etc/nginx/nginx.conf:ro
      - /etc/ssl/private/fullchain.pem:/etc/nginx/ssl/fullchain.pem:ro
      - /etc/ssl/private/privkey.pem:/etc/nginx/ssl/privkey.pem:ro
    restart: unless-stopped
    healthcheck:
      test: ["CMD", "wget", "-q", "-O", "-", "https://localhost"]
      interval: 5s
      timeout: 2s
      retries: 3
    logging:
      driver: none
    depends_on:
      - telemt
    networks:
      - telemt-network

networks:
  telemt-network:
    driver: bridge

Создаём конфиг для nginx. В нём в двух местах меняем <DOMAIN> на наш домен/поддомен nano nginx.conf:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
worker_processes auto;

events {
    worker_connections 2048;
}

stream {
    resolver 127.0.0.11 valid=30s;
    map $ssl_preread_server_name $backend {
        <DOMAIN> telemt:443;
        default 0;
    }
    server {
        listen 443;

        proxy_pass $backend;
        ssl_preread on;
        proxy_timeout 5m;
        proxy_connect_timeout 1s;
    }
}

http {
    server {
        listen 0.0.0.0:8443 ssl;
        server_name <DOMAIN>;

        ssl_certificate /etc/nginx/ssl/fullchain.pem;
        ssl_certificate_key /etc/nginx/ssl/privkey.pem;

        location / {
            return 401 "Unauthorized";
        }
    }
}
Инфо

Если хочется реальный статический сайт, а не тупую заглушку “Unauthorized”, что будет правильнее с точки зрения маскировки, добавьте перед location две строки:

1
2
root /var/www/website;
index index.html;

и замените содержимое location с return 401 "Unauthorized"; на try_files $uri $uri/ =404;.

Также добавьте в docker-compose.yml ещё один том для nginx:

1
2
3
4
- ./nginx.conf:/etc/nginx/nginx.conf:ro
- /etc/ssl/private/fullchain.pem:/etc/nginx/ssl/fullchain.pem:ro
- /etc/ssl/private/privkey.pem:/etc/nginx/ssl/privkey.pem:ro
- /var/www/website/:/var/www/website/  # <-- Вот этот
/articles/tg_proxy/images/extra_tom.png

И, разумеется, по пути /var/www/website/ должен лежать index.html с вашим сайтом.

Вот небольшой пример с тем же Unauthorized :)

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Welcome</title>
    <style>
        body {
            background-color: #f0f0f0;
            font-family: Arial, sans-serif;
            text-align: center;
            padding-top: 50px;
            color: #333;
        }
        h1 {
            font-size: 48px;
            margin-bottom: 10px;
        }
        p {
            font-size: 20px;
            color: #666;
        }
    </style>
</head>
<body>
    <h1>Not authorized</h1>
    <p>You are not allowed to visit this page</p>
</body>
</html>

Осталось получить сертификат. Обратите внимание, что в некоторых командах нужно заменить {DOMAIN} на домен:

1
2
3
4
5
6
7
8
9
apt install curl socat cron -y
curl https://get.acme.sh | sh

# Перезаходим на сервер
sudo su -
acme.sh --set-default-ca --server letsencrypt  # меняет центр сертификации на Let's Encrypt
acme.sh --issue --standalone -d {DOMAIN}  # подписывает сертификат
mkdir -p /etc/ssl/private
acme.sh --install-cert -d {DOMAIN} --key-file /etc/ssl/private/privkey.pem --fullchain-file /etc/ssl/private/fullchain.pem  # перемещает цепочку сертификатов и ключ в нужную папку
Ошибка

Если на этапе получения сертификата возникла ошибка, то скорее всего проблемой является один из следующих пунктов:

  1. Включен firewall, но 80 порт закрыт. Откройте его командой ufw allow 80/tcp.
  2. Домен ещё не успел привязаться к IP. Попробуйте повторить попытку через 5 мин.

Возвращаемся к папке проекта и запускаем контейнеры вновь: cd /root/telemt && docker compose up -d && docker compose logs -ft.

Во-первых, теперь маскировка работает лучше, во-вторых, ссылка по-дефолту генерируется с доменом. Профит!


Реклама канала и статистика использования

NEW 05.03.2026

MTProxy имеет встроенную поддержку статистики использования, а также показа канала-спонсора вверху чатов в Telegram. Выглядит это вот так:

/articles/tg_proxy/images/advertised_channel.png

Сделать это очень просто. Открываем официального бота, стартуем и отправляем команду /newproxy. Для добавления прокси нужно прислать боту адрес этого самого прокси в формате host:port.

Теперь определимся с тем, что имеем. Если у нас нет домена, то в качестве host указываем IP сервера. Порт в любом случае ставим 443, если вы самостоятельно не меняли его в Telemt или nginx.

Далее, отправляем боту секрет, который генерировали в самом начале. Если потеряли, он находится в том же telemt.toml файле.

После этого бот пришлёт нам так называемый тэг.

/articles/tg_proxy/images/mtproxybot.png

Копируем его и возвращаемся к терминалу. Переходим к конфигу, а именно к блоку generalcd /root/telemt && nano telemt.toml:

  1. Раскомментируем строку ad_tag, удалив значок хэша и вставим вместо нулей наш тэг.
  2. Меняем значение use_middle_proxy на true.
/articles/tg_proxy/images/ad_tag.png

Сохраняем файл и перезапускаем контейнеры: sudo docker compose down && sudo docker compose up -d && sudo docker compose logs -ft.

В последних версиях Telemt запуск с use_middle_proxy происходит значительно дольше, чем без него. Дожидаемся появления ссылки (~1 минута).

Готово! Статистику можно смотреть в боте, отправив команду /myproxies -> выбрав нужный прокси -> нажав кнопку Stats:

/articles/tg_proxy/images/mtproxybot_stats.png

Установить продвигаемый канал ещё проще. В боте: /myproxies -> выбираем нужный прокси -> жмём Set promotion -> отправляем ссылку на канал в виде @channel или t.me/channel. Готово! Изменения применятся в течение часа.

/articles/tg_proxy/images/promoted_channel.png

Установка MTProxy

Зачем он вообще нужен, если есть Telemt? Если ваш местный DPI не силён, то такой прокси даст меньше неожиданных ошибок, хоть Telemt активно развивается прямо сейчас и является гораздо лучшей альтернативой в плане обмана DPI, обычный MTProxy чаще оказывается стабильнее в плане аптайма и беспрерывного коннекта (но это не точно).

Поднять этот прокси ещё проще, чем предыдущий. Достаточно лишь одного docker-compose:

1
2
mkdir mtproxy && cd mtproxy
nano docker-compose.yml

Вставляем:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
services:
  mtproto:
    image: telegrammessenger/proxy:latest
    container_name: mtproto
    restart: unless-stopped
    ports:
      - "443:443/tcp"
    environment:
      - SECRET=<SECRET>
    volumes:
      - proxy-config:/data

volumes:
  proxy-config:

Также заменяем <SECRET> на своё значение. Для перезапуска контейнера используем команду: cd /root/mtproxy && docker compose down && docker compose up -d && docker compose logs -ft — как и в прошлом варианте, копируем ссылку и подключаемся.


Бесплатный прокси

Если вы так и не разобрались, или вам лень делать это всё самому, у нашего проекта NoVPN есть небольшое количество собственных прокси-серверов специально для вас! Это абсолютно бесплатно!

Просто запустите бота, и нажмите на кнопку “NoVPN Proxy” — на сайте будет вся необходимая информация.

/articles/tg_proxy/images/novpn_logo.png

The end

Вот гайд и подошёл к концу! Опять же, немного позже добавлю сюда информацию о Telemt за ревёрс-прокси. Если у вас возникнут трудности/вопросы/предложения, добро пожаловать в комментарии под постом!

Спасибо, что читаете! 🌱

Поддержать автора
NoisyCake cloudtipscloudtips
0%