Установка Telegram MTProto Proxy на Ubuntu 18.04 теория и практика
MTProto — протокол разработанный командой Дурова предназначенный для шифрования трафика месенджера Telegram.
MTProto Proxy — промежуточный сервер, выполняющий роль посредника между пользователем и целевым сервером позволяя получать доступ к сервису если по каким-то причинам он недоступен скрывая свой IP адрес и маскируя трафик.
Преимущества MTProto Proxy в сравнении socks:
- Для подключения вместо логин/пароль, достаточно только пароля
- Трафик не отличается от обычного HTTPS/TLS
- Пароль не передается до сервера при подключении
- Трафик зашифрован
- Возможна работа через прокси только Telegram’a (другие приложения работать не будут)
- Promoted каналы
Как видим MTProto Proxy является узкоспециализированным средством, которое позволяет работать только с месенджером.
Огромным недостатком socks прокси является то, что логин и пароль при подключении к прокси передаётся в открытом виде. Данная особенность не даст возможность читать переписку, но понять что конкретный человек использует мессенджер вполне может.
В странах, которые используют DPI (в РФ — СОРМ) для анализа трафика, так и сделано. Это устройство разбирает туннель и смотрит, что же там внутри, если видит запрещенный трафик — блокирует.
Так же при расшаривании socks прокси он может попасть в глобальные списки и злоумышленники получали инструмент для незаконных действий. В таком случае при розыскных мероприятиях вопросы будут к держателю прокси сервера, т.к. злоумышленник использовал его в качестве промежуточного узла.
Promoted канал — канал, на который вы автоматически будете подписаны при подключении к прокси, он будет закреплен наверху списка и его нельзя удалить пока вы не отключитесь от данного прокси. Это дает возможность монетизировать трафик канала, тем самым поощряя держателя прокси.
Прочитав теорию, можно приступать:
Для установки нам понадобится общий набор инструментов для сборки из исходного кода и пакеты разработки для openssl и zlib.
Клонируем из репы на GitHub и компилируем:
Раскидываем файлы по своим местам:
Создаем секрет, который будет использоваться пользователями для подключения к вашему прокси.
Создаем конфигурационный файл:
Копируем туда текст с содержимым:
где:
443 — порт, используемый клиентами для подключения к прокси.
8888 — локальный порт для получения статистики. Получить ее можно только локально через loopback. Пример: wget localhost:8888/stats
<secret> — идентификатор полученный при генерировании его ранее. На сервере может быть несколько секретов. Пример: -S <secret1> -S <secret2>
Если сервер расположен за NAT, требуется добавить параметр —nat-info <arg> <Внутренний адрес>:<Внешний адрес>. Не забываем покинуть порты.
Другие команды можно посмотреть после старта сервиса командой: mtproto-proxy -h
Перезагружаем systemd для поиска новых или измененных юнитов:
Запускаем службу с добавлением ее в автозагрузку:
Все — готово. Для того что бы пользователи смогли подключиться к прокси — генерируем ссылку:
Для включения рекламы promoted канала требуется написать этому боту @MTProxybot и зарегистрировав ваш сервер. После этого он вам выдаст TAG — персональный идентификатор прокси для отслеживании статистики и установки рекламы каналов. Его нужно вписать в mtproto-proxy.service, добавлением параметра: -P <TAG>. Перезагружаем прокси (systemctl restart mtproto-proxy) и можно добавлять канал для рекламы средствами бота. На этом установка является завершенной.
ВАЖНО: Использование прокси в некоторых странах может нарушать законодательство. Ознакомьтесь с законами страны прежде чем устанавливать ПО.
Все операции описанные в заметке производились на тестовом стенде, и после написания были удалены.
Развёртывание своего MTProxy Telegram со статистикой
„Я унаследовал эту неразбериху,
начиная с бессовестных Zello; LinkedIn
и кончая «всеми прочими» на платформе Telegram
в моём мире.
А потом икнув,
чиновник торопливо и громко добавил:
но я наведу (здесь в IT) порядок“
(. ).
Дуров, справедливо полагает, что это авторитарные государства должны его, шифропанка, бояться, а роскомнадзоры и золотые щиты со своим DPI-фильтрами его не очень-то беспокоят»
(Политическая техника)
Моя техническая политика — проще, я могу тут расписать свои размышления по беспечным блокировкам в рунете, но полагаю, что прогрессивные граждане Modern Russian и юзеры Хабра ощутили на своей шкуре непрофессионализм действующей власти, поэтому ограничусь единственной фразой: наша техническая политика — «Цифровое Сопротивление». «обеспечение родных и близких устойчивым каналом связи».
Развертывание MTProto proxy Telegram
- Технический уровень сложности — «несложно», если, например, следовать данной шпаргалке.
- Уровень надежности — «выше среднего»: docker-образ работает стабильно, перезапускать его не требуется каждый день, как писали разработчики в своей официальной документации Telegram, но какие-то уязвимости контейнер наверняка содержит.
- Уровень сопротивления/тревоги —
10 игиловцев плетут свои заговоры«родня пользуется», бан не прилетал от РКН ни разу за все время (с весны). - Уровень доверия — «public baby distrust», проблема на стороне клиентов (некоторые друзья подозрительно относятся к моему MtprotoProxy).
- Уровень тестостерона — «выше не стал».
- Финансовые затраты — «0₽».
- Финансовое вознаграждение — «от гражданина Дурова не зависит». Поощрение — возможность навязывание рекламы.
Окей, развернули свой бесплатный сервер, переходим на официальный сайт dockerhub и скачиваем docker-контейнер.
Не нужно искать какой-то образ, файл, или волшебную кнопку — «их нет», вся магия делается в CLI:
Но перед «этим» установите docker для CLI:
Далее, в официальной документации MtprotoProxyTelegram нам предлагают сделать примерно следующее, делаем:
После этой команды в выводе терминала появится HEX-строка, но она нам не интересна.
И получаем нужные данные:
В выводе данного лога нам показывают (замазал):
А) наш ip сервера (внешний ip сервера);
Б) и случайный секрет — случайная строка в HEX.
Перед тем, как зарегать наш MtproProxy, нужно настроить главный файрволл над iptables (как бы вы не перенаправляли трафик на данной VPC, он будет непослушный, так как самый главный файрволл в Amazon-EC2 находится в web-интерфейсе и имеет более высокий приоритет над iptables).
Заходим в «консоль Amazon-EC2» в Security Group и открываем входящий 443 порт (логичная маскировка трафика на первое время).

Берём из лога наши данные «ip и секрет» и идем в мессенджер Telegram, находим официальный MTProxy Admin Bot (@MTProxybot) и регистрируем наш MtproProxy: запускаем команду [/newproxy] и вводим [наш_ip:443], а потом и наш [секрет/HEX].
Если накосячите при вводе данных, бот будет сердиться и слать вас на…
Если две строчки заполните без ошибок, то получите одобрение и рабочую ссылку, на ваш действующий MtprotoProxyTelegram, которым вы можете поделиться с кем угодно.

Также через данного бота можно добавить Ваш спонсоркий канал (но не чат), где Вы будете ваши взгляды навязывать пользователям, которые подключились к вашему серверу, а можно не «спамить», и не беспокоить своих будучи-потенциальных клиентов, не показывая канал в закрепленном списке мессенджера.
Еще пару слов о боте, там можно запрашивать статистику, но «тоже бублик». Видимо «статистика» доступна, когда за тобой Махачкала «толпа нахлебников».
Мониторинг
А сколько мы можем подключить юзеров на наш сервер? И вообще, кто/что там? Чего? И сколько?
Смотрим, что там по официальной документации… Ага, вот, сделать так:
«Держи карман шире» По предложенным командам мы всегда будем получать подобную ошибку:
«curl: (7) Failed to connect to localhost port 2398: В соединении отказано»
Прокси наш будет работать. Но! Бублик, а не статистику мы получим.
Можно заняться делами для красноглазиков: проверить
Сначала я подумал, что это очередной косяк за разработчиками Telegram (и я до сих пор так думаю), потом нашёл временное неплохое решение: полирнуть напильником Docker-Контейнер.
Позже на глаза попалась инфа:
«Мы заблокировали на своих серверах часть публичных прокси, воспользовавшись базами проекта firehol. Этот проект мониторит списки с публичными прокси и делает базы с ними.
С этого момента (то есть уже почти двое суток) не было заблокировано ни одного IP-адреса нашего российского прокси.
3. Рассказываем, как сделать почти неуязвимый для Роскомнадзора прокси и делимся скриптом блокировки публичных прокси.
— Обновите docker-контейнер (или демон) MTProto proxy до последней версии: РКН вычисляет старые версии по порту статистики, который биндился на 0.0.0.0 и однозначно себя идентифицировал для всего интернета. А лучше — откройте нужны порты с помощью iptables, а остальные — закройте (помните, что в случае с docker-контейнером следует использовать правило FORWARD).
— Роскомнадзор давно научился дампить трафик: они видят обращения внутри HTTP- и SOCKS5-прокси, а так же видят старую версию обфускации MTProto proxy.
Когда клиенты некоторых провайдеров, у которых установлены такие дампилки, обращаются к Telegram через такие прокси, то РКН видит такие обращения и сразу блокируют эти прокси. Тоже самое касается MTProto proxy со старой обфускацией.
Решение: раздавайте клиентам, которые подключаются к прокси, secret только с dd в начале (не нужно указывать дополнительные буквы dd в настройках самого mtproto proxy). Это включит версию обфускации, которую не умеют определять дампилки.
И никаких HTTP- и SOCKS5-прокси.
— Подгон, с помощью которого каждый владелец телеграм-прокси, который регулярно банится РКН, может полностью (или почти полностью) прекратить блокировки (а заодно и убедиться в том, что РКН лжёт).
Скрипт, который банит публичные прокси и небольшой мануал к нему».
Наш прокси прозападный, ни каких проблем/блокировок за весенние и прохладные летние деньки я не встретил, на творческую задачку это тоже не тянуло, поэтому потерей темпа не занимался и префикс dd* к ключу не добавлял.
Мануал «получение статистики/мониторинг» по официальной инструкции MtprotoProxyTelegram — нерабочий/устаревший, придется чинить docker-образ.
Контейнер у нас всё еще запущен:
curl: (7) Failed to connect to 0.0.0.0 port 2398: В соединении отказано
Статистика всё еще недоступна .
Узнаем идентификатор docker-контейнера:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
f423c209cfdc telegrammessenger/proxy:latest «/bin/sh -c ‘/bin/ba…» About an hour ago Up About a minute 0.0.0.0:443->443/tcp mtproto-proxy2
Идём со своим уставом внутрь docker-контейнера:
И в самой последней строке скрипта «run.sh» добавляем пропущенный флаг:
Добавляете «—http-stats», что- то вроде этого должно получиться:
Ctrl+o/Ctrl+x/Ctrl+d (сохранить/выход из nano/выход из контейнера).
Перезапускаем наш docker-контейнер:
Всё, теперь по команде:
В статистике много «мусора» (на скрине 1/3 её часть), создаём alias:
Получаем то, ради чего полировали docker-контейнер: кол-во подключений и нагрузку:
Docker-контейнер работает, статистика крутится.
Затраченные ресурсы
Как бы ты не был крут Стюарт Редман даже ты оставляешь след от го.на на своих трусах. Работающий Docker-образ оставляет немаленький след.
Расписывать преимущества и недостатки docker-образов не имеет смысла, docker-контейнер — это мини-виртуальная машина, потребляющая ресурсы менее, чем «реальная» виртуальная машина, например VirtualBox, но потребляющая.
1) Запущен со статистикой docker-образ или без неё, два клиента резвятся или десять — ресурсы утилизируются
одинаково: 75% от всей производительности CPU t2.micro.
2) Смотрим мониторинг VPC-сервера:

Из графика утилизации ресурсов на VPC видим, что docker-контейнер потребляет постоянно
7,5% от общей макс. производительности CPU и 28 мая был остановлен мною намеренно/временно (Примечание — на сервере так же крутятся OpenVPN & pptp).
Почему 10% постоянной загрузки CPU — это предел для данного сервера?
Потому что есть ограничения со стороны Amazon EC2 и исчисляются они в кредитах:

1 кредит CPU = 1 ЦП, работающему со 100% загрузкой в течение одной минуты, а у нас кредитов 6 (то есть в пиках 100%-я утилизация CPU возможна в течении 6 минут, а дальше мощность CPU снизится). Другие комбинации: например, 1 кредит CPU = 1 ЦП, работающему с 50%-й нагрузкой в течение двух минут (то есть мы можем исполльзовать CPU с 50%-й нагрузкой в течении 12 минут), или, пример, постоянной 10%-й нагрузкой CPU в течение всего времени и д.п
Новый MTProto-прокси сервер от Telegram
Прокси-сервер является посредником между клиентом и сервером. Для обхода ограничений прокси-сервер должен быть установлен там, где нет ограничений доступа к требуемой информации, при этом не должно быть таковых ограничений и между клиентом и прокси-сервером.

Обновлённая поддержка прокси-серверов в клиентах Telegram
- Новый MTProto-прокси. Работает с родным для Telegram протоколом MTProto
- Открытый исходный код сервера на GitHub
- Docker-образ на DockerHub
- В мобильных клиентах появилась возможность добавлять несколько прокси-серверов каждого типа. Пользователь может выбрать наиболее подходящий
MTProto-прокси
- MTProto-прокси работает только с Telegram
- Клиент и сервер не имеют фазы открытого обмена информацией
- В реализации MTProto-прокси сервера от Telegram прокси-сервер и его владелец не имеют прямого доступа к метаинформации протокола MTProxy (логины, например).
- Для всевозможных фильтров и анализаторов обмен данными с MTProto-прокси сервером выглядит как неструктурированный бинарный двунаправленный поток данных между клиентом и сервером. Это затрудняет распознавание протокола с целью ограничения.
Быстрый старт
Для запуска собственного MTProto-прокси сервера требуется только машина с установленным Docker и доступом в сеть. На порту 443 не должно ничего быть (nginx, apache). При первом запуске прокси-сервера будет создан секретный ключ, который будет запомнен. Запуск одной командой:
Для просмотра информации о секретном ключе и специальных ссылках посмотрите журнал контейнера командой:
Надо учитывать, что прокси-сервер будет пытаться «угадать» параметры для ссылок, поэтому IP и порт могут быть неточными и требовать коррекции.
Секретный ключ
Можно устанавливать свой собственный секретный ключ через переменную окружения SECRET:
При корпоративном использовании прокси-сервера (группами пользователей) можно использовать несколько ключей (до 16). Например, я для корпоративных установок выделяю такие группы пользователей: boss, managers, users. Для каждой из них генерирую свой ключ. В случае компрометации (утечки на сторону) ключа, меняю его для группы. В чем проблема компрометации ключа? В трафике. Количество подключений может полностью заполнить канал к вашей машине. Также можно сделать систему ротации ключей.
Для установки нескольких ключей их надо перечислить через запятую:
Или можно задать желаемое количество ключей для автогенерации через переменную SECRET_COUNT (не больше 16):
Для генерации своего ключа можно воспользоваться, например, одной из команд в Linux:
Производительность
Каждый процесс прокси-сервера может обрабатывать десятки тысяч подключений. Для лучшей производительности стоит ограничение 60000 подключений на одно ядро процессора. По умолчанию запускается два процесса прокси-сервера (с предположением, что каждому система выделит по ядру). Можно увеличить количество запускаемых процессов через переменную WORKERS. Не следует запускать их больше, чем на процессоре имеется ядер:
Использование сети
В примере специально дан ключ —net=host . Это позволяет избежать избыточной трансляции адресов и позволяет использовать IPv6 прямо из коробки без настройки, если он есть на той машине, на которой запускается proxy-server.
Конечно же, можно запустить и более классическим способом, указав проброс портов:
Можно указать и какой-нибудь другой порт, например:
Учтите, что прокси-сервер ничего не знает о «настоящем» порте и ссылка будет неправильная, её надо будет корректировать.
Мониторинг
MTProto-прокси сервер представляет некоторую статистику по своей работе. Статистика предоставляется только на localhost: http://localhost:2398/stats .
При запуске прокси-сервера через docker с параметром —net=host для получения статистики достаточно команды: curl http://localhost:2398/stats , или проксирования через, например, nginx куда-нибудь наружу. При запуске прокси-сервера через docker с пробрасыванием портов статистику можно получить командой:
- ready_targets — количество серверов Telegram, c которыми будет пытаться соединиться прокси-сервер
- active_targets — количество подключений к серверам Telegram (в теории должно совпадать с ready_targets)
- total_special_connections — количество входящих соединений клиентов
- total_max_special_connections — максимальное возможное количество одновременных соединений
Реклама
Telegram позволяет монетизировать прокси-сервер через подписку на Promoted-канал. Promoted-канал — это такой канал, на который вы автоматически будете подписаны при подключении к прокси-серверу. Он будет закреплен наверху списка чатов и его нельзя удалить пока вы не отключитесь от данного прокси-сервера.
Для настройки Promoted-канала следует у специального бота @MTProxybot получить код и передать его в переменной TAG при запуске сервера:
Этот параметр не запоминается, его надо задавать каждый раз при создании и пересоздании контейнера.
Promoted-канал будет показываться наверху с соответствующей пометкой для тех клиентов, которые используют данный прокси-сервер. Если подписаться на канал, то пометки не будет.

Обновление прокси-сервера
Разработчики MTProto-прокси будут стараться делать минимум изменений, но рекомендуют обновлять прокси-сервер хотя бы раз в сутки:
Docker Compose
Для использования Promoted-каналов не забудьте добавить переменную TAG.