Если вы работаете с тг-ботами, то, скорее всего, замечали проблемы с таймаутами и нестабильным подключением к боту. Или, например, вам захотелось использовать недоступные API на инфраструктуре в RU-регионе, и для этого не обязательно использовать три интересные буквы. Для таких задач подходит и простой прокси. Этот способ не починит звонки, но базовые запросы будут работать. Да и задержка будет поменьше. Но это не точно.

Существуют 2 варианта:

  • купить готовый прокси

  • поднять собственный сервер

Чтобы поднять собственный прокси-сервер за пару минут и не напрягаться с конфигурацией, я сделал маленький CLI, который поднимает прокси-стек на VPS за несколько команд: HTTP, SOCKS5 и MTProto для Telegram. Все обновления будут в моем Telegram-канале @kotelnikoff_dev. Там же будет список провайдеров, на которых я тестировал свой CLI.
Гит

В статье покажу:

  • чем прокси отличается от “трех букв”

  • пару слов о прокси-протоколах

  • как быстро развернуть собственный прокси-сервер

  • как управлять доступом через CLI proxyctl

Почему не “три буквы”

Идея решения с “тремя буквами” состоит в том, что оно уводит трафик сервера целиком. Это рабочий вариант, но для прикладных задач он часто избыточен.

Прокси работает точечно:

  • отправляет только нужные запросы;

  • разделяет трафик по приложениям и пользователям.

Какие протоколы используются

HTTP proxy

Подходит для:

  • curl;

  • браузеров;

  • fetch, axios и других HTTP-клиентов;

  • любых случаев, когда нужен обычный HTTP/HTTPS-трафик.

Такой прокси понимает HTTP-протокол и умеет делать CONNECT для HTTPS.

SOCKS5 proxy

Подходит для:

  • приложений, которые умеют работать через SOCKS;

  • нестандартных клиентов;

  • случаев, где нужен универсальный TCP-прокси.

MTProto proxy

Подходит только для Telegram-клиентов.

Прокси сам по себе не шифрует данные на уровне “замены HTTPS”. Это всего лишь посредник. Безопасность веб-запросов по-прежнему обеспечивает HTTPS между клиентом и сайтом.

Что такое proxyctl

proxyctl — это CLI для развертывания и управления proxy-стеком:

  • 3proxy для HTTP и SOCKS5;

  • mtg для MTProto.

proxyctl нужен для:

  • установки зависимостей;

  • скачивания или сборки нужных бинарников;

  • генерации конфигов;

  • создания и запуска сервисов;

  • управления пользователями;

  • базовой диагностики после установки.

Поддерживаются два режима запуска:

  • systemd для обычных VPS/VM;

  • process для окружений без systemd, например некоторых контейнеров.

Быстрый старт

Нужен сервер на Ubuntu или Debian.

Установка:

curl -fsSL "https://raw.githubusercontent.com/Kotelnikovekb/proxyctl/main/install.sh" | sudo bash

Диагностика и проверка работоспособности сервисов

После установки полезно выполнить:

proxyctl status
proxyctl diagnose

diagnose проверяет:

  • запущен ли 3proxy;

  • слушаются ли нужные порты;

  • проходят ли локальные HTTP/HTTPS/SOCKS-запросы через 127.0.0.1;

  • нет ли проблем с базой пользователей.

Если локально все ок, а извне не подключается, проблема обычно не в самом прокси, а в firewall/security groups провайдера.

После установки можно либо пройти мастер:

proxyctl wizard

Либо сразу поставить готовый набор:

proxyctl install full

full поднимет:

  • HTTP proxy;

  • SOCKS5 proxy;

  • MTProto proxy.

Если нужен только Telegram:

proxyctl install mtproto

Если нужен только HTTP/SOCKS для API и приложений:

proxyctl install api

Пресеты

CLI поддерживает пять сценариев:

  • api — HTTP + SOCKS5;

  • universal — HTTP + SOCKS5;

  • mtproto — только MTProto;

  • telegram-mobile — HTTP + SOCKS5 + MTProto;

  • full — полный набор.

Можно указывать сразу несколько:

proxyctl install a

Управление доступом

Для работы 3proxy необходимо добавить пользователя и пароль.

Добавить пользователя:

proxyctl add-user alice

Посмотреть пользователей:

proxyctl list-users

Сменить пароль:

proxyctl change-password alice new-pass

Удалить пользователя:

proxyctl remove-user alice

CLI выполнит команды и перезапустит сервис после изменений.

Как получить данные для подключения

CLI умеет сразу вывести параметры подключения.

Для HTTP и SOCKS5:

proxyctl show-connect

На выходе будут:

  • host;

  • port;

  • username.

Для Telegram:

proxyctl show-telegram-link

Команда выводит готовую tg:// ссылку, которую можно сразу открыть в Telegram-клиенте.

Отдельно про firewall

Во время тестов были сложности с портами на серверах google cloud. Для проверки нужно проверить, что открыты входящие TCP-порты:

  • 3128 для HTTP proxy;

  • 1080 для SOCKS5;

  • 443 для MTProto, если он включен.

Для Google Cloud CLI умеет даже подсказать готовые команды:

proxyctl print-gcp-firewall

Это не открывает firewall автоматически, а выводит готовые gcloud команды, которые необходимо выполнить в проекте.

Ограничения

Важно сразу проговорить ограничения, чтобы не было ложных ожиданий:

  • проект ориентирован на Ubuntu/Debian. Если нужно, то появятся и другие платформы;

  • установка завязана на apt;

  • это не замена полноценной сетевой архитектуре;

  • cloud firewall все равно настраивается отдельно;

Если что-то не получилось, то задавайте вопросы в комментариях тут или в группе @kotelnikoff_dev.

Подкиньте программисту на кофе, ему еще песика кормить :-)