[Из песочницы] Роскомнадзор и Телеграм боты через прокси

habr.png

Более лучше рекламы для прекрасного мессенджера и придумать невозможно — «несгибаемый Дуров держит оборону и стоит за конфиденциальность своих клиентов, как за свою жизнь». Но суть данного поста не в маркетинговой составляющей блокировки Telegram на территории России. Если ваш Telegram бот перестал работать и вам нужно эту работу срочно восстановить, добро пожаловать под кат.

Вчера вечером мы столкнулись с проблемой, с которой было ожидаемо столкновение. API сервер одного нашего клиента располагался в Heroku. Вчера недовольный клиент мне пишет (в Telegram, разумеется), что на сайте информация рандомно то появляется, то нет. Сам сайт (приложение на NodeJS) уже был заранее перенесен на Московский сервер для уменьшения пинга.

Спустя полчаса изучения проблемы был получен простой вывод: Роскомнадзор заблокировал часть адресов heroku. Ротация серверов heroku происходит на уровне DNS и DNS иногда отдавал рабочий IP, иногда — нет. К слову, выяснять причину проблемы было довольно таки непросто — когда тестировали мы с разработчиками — проблемы не было. Когда тестировал клиент — были. Уже появлялись мысли ответить клиенту великую фразу разработчика «у меня на компе все работает».

Решение было довольно простым — мы перенесли API сервер приложения на Питерский сервер клиента и там его спокойно развернули. Все заработало отлично, кроме, конечно же, интеграции с Telegram. Поскольку отказаться от этой интеграции не является возможным, т.к. нет достойной альтернативы, мы начали искать решение данной проблемы. С родным клиентом Telegram все просто — в него уже встроено взаимодействие с proxy сервером и его настройка отнимает несколько секунд. С Bot API все немного по другому. Приложение взаимодействует с https://api.telegram.org/ для каждого действия Telegram бота, а этот адрес, разумеется, заблокирован РКН.

В качестве экспресс-решения проблемы сразу пришло в голову подключить API сервер клиента к нашей OpenVPN сети для обхода этой блокировки. Решение было сразу же отвергнуто, т.к. скорость ответа оставляла желать лучшего. Гугл и Яндекс не смогли поделиться со мной полезной информацией по решению этого вопроса.

В результате пришла в голову простая и очевидная мысль — поднять самостоятельно простейший прокси сервер для соединения в телеграм. Ниже предоставлен конфиг nginx который сейчас уже отлично справляется со своей задачей


Nginx config

server {
listen 80;
server_name my-telegram-proxy.server;
location / {
proxy_set_header X-Forwarded-Host $host;
proxy_set_header X-Forwarded-Server $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass https://api.telegram.org/;
client_max_body_size 100M;
}
}

Далее в приложении я подменил url BOT API для взаимодействия с telegram — вместо
https://api.telegram.org/bot
написал
http://my-telegram-proxy.server/bot
и интеграция с Bot Api успешно заработала

Для большего удобства создал docker контейнер с подробной инструкцией по его использованию. Это позволит вам поднять свою telegram bot proxy одной командой за считанные секунды
https://hub.docker.com/r/zvinger/docker-proxy-rkn/builds/
Пример команды:
docker run -d -p 8012:80 zvinger/docker-proxy-rkn
и указываете http://адрес.сервера:8012/ в конфигурации приложения. Порт можете выбрать любой при вводе команды

© Habrahabr.ru