Прокси-сервер является посредником между клиентом и сервером. Для обхода ограничений прокси-сервер должен быть установлен там, где нет ограничений доступа к требуемой информации, при этом не должно быть таковых ограничений и между клиентом и прокси-сервером.
Для запуска собственного MTProto-прокси сервера требуется только машина с установленным Docker и доступом в сеть. На порту 443 не должно ничего быть (nginx, apache). При первом запуске прокси-сервера будет создан секретный ключ, который будет запомнен. Запуск одной командой:
Для просмотра информации о секретном ключе и специальных ссылках посмотрите журнал контейнера командой:
Надо учитывать, что прокси-сервер будет пытаться «угадать» параметры для ссылок, поэтому IP и порт могут быть неточными и требовать коррекции.
Можно устанавливать свой собственный секретный ключ через переменную окружения SECRET:
При корпоративном использовании прокси-сервера (группами пользователей) можно использовать несколько ключей (до 16). Например, я для корпоративных установок выделяю такие группы пользователей: boss, managers, users. Для каждой из них генерирую свой ключ. В случае компрометации (утечки на сторону) ключа, меняю его для группы. В чем проблема компрометации ключа? В трафике. Количество подключений может полностью заполнить канал к вашей машине. Также можно сделать систему ротации ключей.
Для установки нескольких ключей их надо перечислить через запятую:
Или можно задать желаемое количество ключей для автогенерации через переменную SECRET_COUNT (не больше 16):
Для генерации своего ключа можно воспользоваться, например, одной из команд в Linux:
Каждый процесс прокси-сервера может обрабатывать десятки тысяч подключений. Для лучшей производительности стоит ограничение 60000 подключений на одно ядро процессора. По умолчанию запускается два процесса прокси-сервера (с предположением, что каждому система выделит по ядру). Можно увеличить количество запускаемых процессов через переменную WORKERS. Не следует запускать их больше, чем на процессоре имеется ядер:
В примере специально дан ключ
Конечно же, можно запустить и более классическим способом, указав проброс портов:
Можно указать и какой-нибудь другой порт, например:
Учтите, что прокси-сервер ничего не знает о «настоящем» порте и ссылка будет неправильная, её надо будет корректировать.
MTProto-прокси сервер представляет некоторую статистику по своей работе. Статистика предоставляется только на localhost:
При запуске прокси-сервера через docker с параметром
Некоторые метрики:
Telegram позволяет монетизировать прокси-сервер через подписку на Promoted-канал. Promoted-канал — это такой канал, на который вы автоматически будете подписаны при подключении к прокси-серверу. Он будет закреплен наверху списка чатов и его нельзя удалить пока вы не отключитесь от данного прокси-сервера.
Для настройки Promoted-канала следует у специального бота @MTProxybot получить код и передать его в переменной TAG при запуске сервера:
Этот параметр не запоминается, его надо задавать каждый раз при создании и пересоздании контейнера.
Promoted-канал будет показываться наверху с соответствующей пометкой для тех клиентов, которые используют данный прокси-сервер. Если подписаться на канал, то пометки не будет.
Разработчики MTProto-прокси будут стараться делать минимум изменений, но рекомендуют обновлять прокси-сервер хотя бы раз в сутки:
Пример docker-compose.yml:
Для использования Promoted-каналов не забудьте добавить переменную TAG.
Обновлённая поддержка прокси-серверов в клиентах Telegram
- Новый MTProto-прокси. Работает с родным для Telegram протоколом MTProto
- Открытый исходный код сервера на GitHub
- Docker-образ на DockerHub
- В мобильных клиентах появилась возможность добавлять несколько прокси-серверов каждого типа. Пользователь может выбрать наиболее подходящий
MTProto-прокси
- MTProto-прокси работает только с Telegram
- Клиент и сервер не имеют фазы открытого обмена информацией
- В реализации MTProto-прокси сервера от Telegram прокси-сервер и его владелец не имеют прямого доступа к метаинформации протокола MTProxy (логины, например).
- Для всевозможных фильтров и анализаторов обмен данными с MTProto-прокси сервером выглядит как неструктурированный бинарный двунаправленный поток данных между клиентом и сервером. Это затрудняет распознавание протокола с целью ограничения.
Быстрый старт
Для запуска собственного MTProto-прокси сервера требуется только машина с установленным Docker и доступом в сеть. На порту 443 не должно ничего быть (nginx, apache). При первом запуске прокси-сервера будет создан секретный ключ, который будет запомнен. Запуск одной командой:
$ docker run -d --net=host --name=mtproto-proxy --restart=always \
-v proxy-config:/data telegrammessenger/proxy
Для просмотра информации о секретном ключе и специальных ссылках посмотрите журнал контейнера командой:
$ docker logs mtproto-proxy
[+] Using the explicitly passed secret: 'b7e70329dcf3721c4239b86ad32a90b8'.
[+] Saving it to /data/secret.
[*] Final configuration:
[*] Secret 1: b7e70329dcf3721c4239b86ad32a90b8
[*] tg:// link for secret 1 auto configuration: : tg://proxy?server=81.177.103.94&port=443&secret=b7e70329dcf3721c4239b86ad32a90b8
[*] t.me link for secret 1: tg://proxy?server=81.177.103.94&port=443&secret=b7e70329dcf3721c4239b86ad32a90b8
[*] Tag: no tag
[*] External IP: 81.177.103.94
[*] Make sure to fix the links in case you run the proxy on a different port.
Надо учитывать, что прокси-сервер будет пытаться «угадать» параметры для ссылок, поэтому IP и порт могут быть неточными и требовать коррекции.
Секретный ключ
Можно устанавливать свой собственный секретный ключ через переменную окружения SECRET:
$ docker run -d --net=host --name=mtproto-proxy --restart=always \
-v proxy-config:/data -e SECRET=b7e70329dcf3721c4239b86ad32a90b8 \
telegrammessenger/proxy
При корпоративном использовании прокси-сервера (группами пользователей) можно использовать несколько ключей (до 16). Например, я для корпоративных установок выделяю такие группы пользователей: boss, managers, users. Для каждой из них генерирую свой ключ. В случае компрометации (утечки на сторону) ключа, меняю его для группы. В чем проблема компрометации ключа? В трафике. Количество подключений может полностью заполнить канал к вашей машине. Также можно сделать систему ротации ключей.
Для установки нескольких ключей их надо перечислить через запятую:
$ docker run -d --net=host --name=mtproto-proxy --restart=always \
-v proxy-config:/data -e SECRET=b7e70329dcf3721c4239b86ad32a90b8,afccd434fb32248f29f033b189bd8541,878397a50627deb349d4c296bd9dc3c2 \
telegrammessenger/proxy
Или можно задать желаемое количество ключей для автогенерации через переменную SECRET_COUNT (не больше 16):
$ docker run -d --net=host --name=mtproto-proxy --restart=always \
-v proxy-config:/data -e SECRET_COUNT=5 telegrammessenger/proxy
Для генерации своего ключа можно воспользоваться, например, одной из команд в Linux:
# работает даже на busybox:
$ tr -dc 'a-f0-9' < /dev/urandom | dd bs=1 count=32 2>/dev/null
$ hexdump -n 16 -e '4/4 "%08x" 1 "\n"' /dev/random # требуется программа hexdump
$ openssl rand -hex 16 # требуется openssl
Производительность
Каждый процесс прокси-сервера может обрабатывать десятки тысяч подключений. Для лучшей производительности стоит ограничение 60000 подключений на одно ядро процессора. По умолчанию запускается два процесса прокси-сервера (с предположением, что каждому система выделит по ядру). Можно увеличить количество запускаемых процессов через переменную WORKERS. Не следует запускать их больше, чем на процессоре имеется ядер:
$ docker run -d --net=host --name=mtproto-proxy --restart=always \
-v proxy-config:/data -e WORKERS=16 telegrammessenger/proxy
Использование сети
В примере специально дан ключ
--net=host
. Это позволяет избежать избыточной трансляции адресов и позволяет использовать IPv6 прямо из коробки без настройки, если он есть на той машине, на которой запускается proxy-server.Конечно же, можно запустить и более классическим способом, указав проброс портов:
$ docker run -d -p443:443 --name=mtproto-proxy --restart=always \
-v proxy-config:/data telegrammessenger/proxy
Можно указать и какой-нибудь другой порт, например:
$ docker run -d -p8443:443 --name=mtproto-proxy --restart=always \
-v proxy-config:/data telegrammessenger/proxy:latest
Учтите, что прокси-сервер ничего не знает о «настоящем» порте и ссылка будет неправильная, её надо будет корректировать.
Мониторинг
MTProto-прокси сервер представляет некоторую статистику по своей работе. Статистика предоставляется только на localhost:
http://localhost:2398/stats
.При запуске прокси-сервера через docker с параметром
--net=host
для получения статистики достаточно команды: curl http://localhost:2398/stats
, или проксирования через, например, nginx куда-нибудь наружу. При запуске прокси-сервера через docker с пробрасыванием портов статистику можно получить командой:$ docker exec mtproto-proxy curl http://localhost:2398/stats
Некоторые метрики:
- ready_targets — количество серверов Telegram, c которыми будет пытаться соединиться прокси-сервер
- active_targets — количество подключений к серверам Telegram (в теории должно совпадать с ready_targets)
- total_special_connections — количество входящих соединений клиентов
- total_max_special_connections — максимальное возможное количество одновременных соединений
Реклама
Telegram позволяет монетизировать прокси-сервер через подписку на Promoted-канал. Promoted-канал — это такой канал, на который вы автоматически будете подписаны при подключении к прокси-серверу. Он будет закреплен наверху списка чатов и его нельзя удалить пока вы не отключитесь от данного прокси-сервера.
Для настройки Promoted-канала следует у специального бота @MTProxybot получить код и передать его в переменной TAG при запуске сервера:
$ docker run -d --net=host --name=mtproto-proxy --restart=always \
-v proxy-config:/data -e TAG=85174e9e0ffa43c0d3a7167e52175268 \
telegrammessenger/proxy:latest
Этот параметр не запоминается, его надо задавать каждый раз при создании и пересоздании контейнера.
Promoted-канал будет показываться наверху с соответствующей пометкой для тех клиентов, которые используют данный прокси-сервер. Если подписаться на канал, то пометки не будет.
Обновление прокси-сервера
Разработчики MTProto-прокси будут стараться делать минимум изменений, но рекомендуют обновлять прокси-сервер хотя бы раз в сутки:
$ docker pull telegrammessenger/proxy # обновить образ
$ docker stop mtproto-proxy # остановить контейнер
$ docker rm mtproto-proxy # удалить контейнер
$ docker run .... # создать из обновленного образа и запустить контейнер заново
$ docker logs -f --tail=30 mtproto-proxy # посмотреть журнал контейнера
Docker Compose
Пример docker-compose.yml:
version: '3.0'
services:
mtproxy:
image: telegrammessenger/proxy:latest
hostname: mtproxy
container_name: mtproxy.local
volumes:
- proxy-config:/data
network_mode: "host"
logging:
driver: syslog
options:
tag: mtproxy
restart: always
volumes:
proxy-config:
external: true
Для использования Promoted-каналов не забудьте добавить переменную TAG.
Обновление прокси-сервера c Docker Compose
$ docker-compose pull mtproxy # обновить образ
$ docker-compose up -d # пересобрать и перезапустить контейнер
$ docker-compose logs -f --tail=30 mtproxy # посмотреть журнал сервиса