Как стать автором
Обновить

Комментарии 32

Спасибо за проделаннуб работу, возникло 2 вопроса


  • с помощью синей изоленты нет возможности скрестить бота с официальной mtproxy
  • не могу понять отчего http проксирование работает быстрее VPN решения которое умеет сжимать трафик
VPN требует ресурсов на установление канала связи, ну и латентность чуть больше.

все-таки бот и клиент телеграма – это разные вещи, я сомневаюсь что клиент работает http-запросами на api, скорее всего у него свой бинарный протокол и другие сервера. так что боту socks/mtproxy не нужны, достаточно обычного http reverse proxy, что автор и проделал…


другое дело что решение какое-то однобокое. если бот не должен получать сообщения или сообщения вытягиваются поллингом – вопросов нет, а иначе как будет вебхук работать – там же сам телеграм инициирует отправку нотификаций на адрес бота. нужен либо ещё один реверс от телеграма к боту, либо может проще бота развернуть где-то отдельно от основного сервиса? тогда и проксировать ничего не придётся… а данные можно боту скармливать уже с основного сервиса по http...

Так вебхуки уже другая история. Или РКН блокирует и входящий траффик от Telegram тоже?
Если телеграм придет с заблокированного адреса — то TCP-сессия не установится, в сторону таких адресов дропаются любые пакеты.
Ну я бы ещё прикрыл фаерволом проксёвый порт от всего остального мира.
Если речь о nodejs, то можно использовать github.com/Bannerets/tdl#login-as-a-bot на основе tdlib, который в теории должен пробиваться через блокировку как и обычный телеграм клиент.
Правда лично я его не тестил при подключении в качестве бота — только как обычного пользователя.
proxy_pass https://api.telegram.org/;
А резолвинг-то, наверное, все еще идет только при старте или релоаде nginx'а? Т.е. если вдруг поменяется IP, то все встанет?
вот так можно попробовать

location / {

resolver 8.8.8.8;
set $url «api.telegram.org»;
proxy_pass https://$url;

}

не совсем понял в чем профит от этого варианта
Я думаю, корни тут идут отсюда:
When you use a variable to specify the domain name in the proxy_pass directive, NGINX re‑resolves the domain name when its TTL expires.

Хотя если смотреть прямо в доках, то вроде как завязываться на переменную уже не обязательно.
сударь грамматический нацист просто не в курсе мема про «более лучше (одеваться)» :)
Спасибо большое поправил. Фейл:) Причем перечитал прежде чем публиковать раз 10)
Простите, я правильно понимаю, что вы решились не шифровать запросы до своего сервера в сети, по сути, которая является «прослушиваемой»?
нет конечно) обязательно https, но для быстрого старта, чтобы убедиться, что «работает» можно на http сделать — решил что так проще писать для инструкции)
При https есть проблема, раньше апи бота работало без валидации сертификата, а сейчас вроде как нет, поэтому вариант проксирования через nginx у вас просто не будет работать…
Есть способ еще проще через streams (и правильнее, так как шифрование сохранится) с тем же Nginx, и даже ничего в коде скрипта менять не придется.
На стороне приложения пишем в /etc/hosts:

ip.of.my.proxy api.telegram.org

Для Nginx на проксе пишем:

stream {
# Конфигурация апстрима
upstream tgapi {
server api.telegram.org:443;
}
# Вот этот блок ради того, чтобы можно было один сервер использовать как прокси для нескольких имен
map $ssl_preread_server_name $upstream {
hostnames;
default tgapi;
api.telegram.org tgapi;
}
server {
listen 443;
ssl_preread on;
proxy_pass $upstream;
}
}


Кстати, в большинстве дистрибутивов nginx собран без stream, но оно есть в nginx-full в официальной репе самого nginx.
Спасибо! Как будет время выпущу попробую, дополню эту статью и соберу еще один контейнер
Не опасно ли бизнесу работать через телеграмм, на который наезжает государственная машина, и по закону? На него может спокойно наезжать роскомнадзор и он может внезапно найти на него управу, и отключить.
Тогда бизнес может оказаться без канала связи.
Я думаю, надо найти другие боты для связи с клиентами, для надежности.
Да, совершенно согласен. Поэтому используем телеграм только в качестве дублирующего канала для отправки уведомлений о новых заявках или проблемах. Основа идет через почту
правильно понимаю? трафик от бота до прокси не защищен?
В примере в статье да. В продакшне https
Простите за нудность, но — а зачем вы вообще используете именно nginx и именно так?
В целом, у вас задача стоит «просто отфорвардить запросы через разблокированное место». Есть вариант с nginx + stream, который я выше написал, есть haproxy, который может просто запроксить не трогая содержимое. Наконец, есть всякие другие подобные штуки которые делают то же самое. Все они позволяют 2 основных вещи:
1. Сохранить оригинальное шифрование.
2. Обеспечить доступ через разблоченный узел.
Схема «свой домен + сертификат + апстрим» конечно имеет право на жизнь, но она сложнее, требует выписки (и поддержки) своего сертификата, требует изменения в конфигурации приложения (имя домена) при том, что совершенно не дает профита.
А можно подробней описать более простой способ с сохранением шифрования и тд? Я бы с удовольствием на него перешел в работе) Я понимал, что мой вариант не идеален, но когда нужно что-то сделать срочно, то я делаю тем способом, который проверен)
Вот так будет выглядеть конфигурация для haproxy, которая будет делать то же самое (но только для одного домена, что не всегда удобно):

resolvers default
    nameserver default 4.2.2.2:53

frontend localhost
    bind *:443
    option tcplog
    mode tcp
    default_backend nodes
 
backend nodes
    mode tcp
    balance roundrobin
    option ssl-hello-chk
    server api api.telegram.org:443 check resolvers default
Можно еще socat, там все вообще к одной маленькой команде сводится:
socat TCP4-LISTEN:443,reuseaddr,fork,bind=serverip TCP4:api.telegram.org:443
После чего все запросы на 443 порт вашего сервера будут проксироваться на api.telegram.org.
А зачем nginx если бот на nodejs поддерживает проксирование:
const TelegramBot = require('node-telegram-bot-api')

if (config.proxy) {
   options.request = {
      proxy: config.proxy
   }
}

const bot = new TelegramBot(config.token, options)


Или я что то не так понял?

можно и так, но – сквида с авторизацией поднимать дольше и сложнее чем реверс на nginx сделать…


лично я бы просто поднял tcp-тоннель с помощью socat, а на сервере прописал адрес тоннеля в /etc/hosts для api.telegram.org, тогда и с сертификатами не пришлось бы ничего городить. а уж научить systemd поднимать socat на автозапуске – вообще ничего не стоит…

Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Истории