Компактный Go-порт tg-ws-proxy для Telegram. Основной сценарий - запуск на
OpenWrt-роутере через меню-скрипт без Python runtime и desktop-обвязки.
Прокси принимает подключения от Telegram как SOCKS5 или MTProto и ведет
трафик до Telegram DC через WebSocket/TLS. Если основной маршрут недоступен,
можно включить Cloudflare route или внешний MTProto proxy как запасной путь.
Telegram app / Telegram Desktop
-> SOCKS5 или MTProto
-> tg-ws-proxy
-> WebSocket + TLS -> Telegram DC
-> Cloudflare route, если включен
-> внешний MTProto proxy, если задан
-> прямой TCP fallback
[!IMPORTANT] Используйте на свой страх и риск. Проект не гарантирует 100% работу и не берет на себя ответственность за состояние роутера или сети.
| Python manager | This port | |
|---|---|---|
| Runtime | нужен Python | один статический бинарник |
| Размер | зависит от Python-пакетов | OpenWrt binary около 5 MB |
| OpenWrt | больше места и зависимостей | скачать и запустить |
| CGO | не важно | CGO_ENABLED=0 |
| Управление | script/menu | script/menu + прямой CLI |
Подключитесь к роутеру по SSH и запустите:
wget -O /tmp/tg-ws-proxy-go.sh https://github.com/d0mhate/-tg-ws-proxy-Manager-go/releases/latest/download/tg-ws-proxy-go.sh && sh /tmp/tg-ws-proxy-go.sh
Обычно достаточно трех действий:
Setup / Update -> подтвердить yStart proxy -> выбрать t для запуска в терминале или b для фонаEnable autostart, если нужен запуск после перезагрузкиПосле Setup / Update меню покажет предупреждение. Это нормально: нужно выйти
из текущей menu-сессии и снова запустить tgm, чтобы менеджер работал уже на
обновленном script state.
Скрипт создает короткую команду tgm. Через нее можно снова открыть меню или
выполнить команды вроде tgm stop, tgm status, tgm remove.
wget -O /tmp/tg-ws-proxy-go.sh https://github.com/d0mhate/-tg-ws-proxy-Manager-go/releases/latest/download/tg-ws-proxy-go.sh && sh /tmp/tg-ws-proxy-go.sh install && sh /tmp/tg-ws-proxy-go.sh start
Запуск в фоне:
sh /tmp/tg-ws-proxy-go.sh start-background
Готовые бинарники лежат в Releases. Меню-скрипт сам выбирает подходящий asset по архитектуре роутера.
Для обычных release manager script дополнительно сверяет SHA256 скачанного бинарника с digest из GitHub release API. Для preview-веток эта проверка не выполняется.
Поддерживаемые release-архитектуры
mipsel_24kc, mips_24kc, armv7, armv8l, aarch64, x86_64x86_64, aarch64, armv7, armv6, 386, riscv64, loong64mips64, mips64elamd64, arm64amd64, arm64amd64, arm64Проверенная цель:
Xiaomi Mi Router 4A Gigabit Edition v2OpenWrt 24.10.5ramips/mt7621mipsel_24kcПо умолчанию прокси запускается как SOCKS5 на порту 1080.
Если прокси запущен на роутере, в Telegram укажите:
| Field | Value |
|---|---|
| Type | SOCKS5 |
| Host | IP роутера |
| Port | 1080 |
| Username | пусто, если auth не включена |
| Password | пусто, если auth не включена |
Если прокси запущен на той же машине, используйте host 127.0.0.1.
SOCKS5 auth включается в меню: Advanced -> SOCKS5 auth.
MTProto включается через меню:
Advanced19) Mode -> mtproto20) Secret -> сгенерировать secret или вставить свой15) Public IP -> указать публичный IP сервераПосле этого меню покажет готовую ссылку tg://proxy?.... Ее можно открыть в
Telegram или вывести QR-код через 16) Show QR code.
Прямой запуск бинарника без меню:
./tg-ws-proxy [flags]
| Flag | Default | Description |
|---|---|---|
--mode <socks5\|mtproto> |
socks5 |
Режим работы прокси |
--host <IP> |
127.0.0.1 |
Адрес, на котором слушает сервер |
--port <PORT> |
1080 |
Порт, на котором слушает сервер |
--username <NAME> |
пусто | Логин для SOCKS5 auth |
--password <PASS> |
пусто | Пароль для SOCKS5 auth |
--verbose |
off |
Подробные логи |
--buf-kb <KB> |
256 |
Размер буфера сокета |
--pool-size <N> |
4 |
Размер пула заранее открытых WebSocket соединений |
--pool-max-age <DURATION> |
55s |
Максимальный возраст idle WebSocket в пуле |
--pool-refill-delay <DURATION> |
250ms |
Пауза между созданием новых WebSocket соединений |
--dial-timeout <DURATION> |
10s |
Таймаут подключения |
--init-timeout <DURATION> |
15s |
Таймаут первого ответа клиента |
--dc-ip <DC:IP> |
DC2 + DC4 | IP для конкретного Telegram DC, можно повторять |
--cf-proxy |
off |
Включить Cloudflare route |
--cf-proxy-first |
off |
Сначала пробовать Cloudflare, потом direct route |
--cf-balance |
off |
Балансировать трафик между несколькими Cloudflare доменами с сохранением fallback-порядка |
--cf-domain <DOMAIN[,DOMAIN2]> |
пусто | Домен или список доменов для Cloudflare route |
--secret <HEX> |
пусто | MTProto secret, нужен для --mode mtproto |
--link-ip <IP> |
пусто | IP, который попадет в tg://proxy ссылку |
--mtproto-proxy <HOST:PORT:SECRET> |
пусто | Внешний MTProto proxy как fallback, можно повторять |
# SOCKS5 только для этой машины
./tg-ws-proxy --mode socks5 --host 127.0.0.1 --port 1080
# SOCKS5 для устройств в локальной сети
./tg-ws-proxy --mode socks5 --host 0.0.0.0 --port 1080
# SOCKS5 с логином и паролем
./tg-ws-proxy --mode socks5 --host 0.0.0.0 --port 1080 --username alice --password secret
# SOCKS5 с Cloudflare route
./tg-ws-proxy --mode socks5 --cf-proxy --cf-domain yourdomain.com
# MTProto
./tg-ws-proxy --mode mtproto --secret dda1b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4 --port 1080 --link-ip 1.2.3.4
# MTProto с внешним MTProto proxy как fallback
./tg-ws-proxy --mode mtproto --secret dda1b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4 --port 1080 \
--mtproto-proxy proxy.example.com:443:ddf0e1d2c3b4a5968778695a4b3c2d1e0f
Основные команды:
sh tg-ws-proxy-go.sh install
sh tg-ws-proxy-go.sh update
sh tg-ws-proxy-go.sh start
sh tg-ws-proxy-go.sh start-background
sh tg-ws-proxy-go.sh stop
sh tg-ws-proxy-go.sh restart
sh tg-ws-proxy-go.sh enable-autostart
sh tg-ws-proxy-go.sh disable-autostart
sh tg-ws-proxy-go.sh status
sh tg-ws-proxy-go.sh telegram
sh tg-ws-proxy-go.sh quick
sh tg-ws-proxy-go.sh remove
sh tg-ws-proxy-go.sh help
Если установлена короткая команда tgm, можно использовать ее:
tgm status
tgm stop
tgm remove
Главное меню:
1) Setup / Update - скачать или обновить бинарник2) Start proxy / 2) Stop proxy - запустить или остановить прокси3) Enable autostart / 3) Disable autostart - включить или выключить автозапуск4) Advanced - расширенные настройкиAdvanced:
Full status - полный статус установкиProxy settings - текущие настройки проксиQuick commands - готовые команды для скриптаToggle verbose - подробные логиRestart proxy - перезапуск с текущими настройкамиToggle proxy / Toggle order / Toggle balance - Cloudflare route, порядок попыток и балансировкаSet domain / Check domain - built-in или свои Cloudflare домены и проверка kws1..kws5, kws203SOCKS5 auth - логин и парольDC mapping - ручная карта DC:IPPort / Pool size / Public IP - порт, пул соединений, IP для ссылкиShow QR code - QR-код для подключенияUpdate source - release/latest, конкретный тег или preview-веткаRemove binary - удаление установки с подтверждениемMode / Secret / Upstream proxies - MTProto-режимЕсли нужно получать не обычные релизы, а тестовые обновления из ветки:
tgmAdvancedUpdate sourcepreviewSetup / UpdateПосле этого менеджер будет обновляться из выбранной preview-ветки, а не из обычных release-тегов.
Если нужно вернуться обратно на стабильные релизы:
Advanced -> Update sourcereleaselatest, выберите тег из списка или введите его вручнуюSetup / UpdateЕсли у вас уже включен автозапуск, источник обновлений тоже будет сохранён.
Текущий UX Update source:
release, preview и backbackrelease показывается latest, список недавних тегов и ручной вводpreview показывается список доступных preview-веток и ручной вводCloudflare route нужен, если прямой путь до Telegram нестабилен. Можно использовать built-in пул доменов или указать свои домены с поддержкой WebSocket.
Полная инструкция по настройке домена: CF-proxy
В меню:
Advanced6) Toggle proxy -> включить Cloudflare route8) Toggle balance -> включить или выключить round-robin между несколькими доменами9) Set domain -> оставить built-in пул или указать свои домены через запятую10) Check domain -> проверить built-in, свои или вручную введенные доменыПункты 9 и 10 в Advanced были переработаны:
9) Set domain теперь работает через numbered menu:enter your own domainskeep currentuse built-in domains, если свои домены уже заданыback10) Check domain теперь тоже работает через numbered menu:your own domains, если они заданыbuilt-in domainsenter domains manuallybackПустой Enter в этих экранах теперь по умолчанию делает back, а не сохраняет
что-то неявно.
Порядок маршрутов:
| Order | Meaning |
|---|---|
fallback |
сначала direct route, потом Cloudflare |
first |
сначала Cloudflare, потом direct route |
Через переменные окружения:
CF_PROXY=1 CF_BALANCE=1 CF_DOMAIN='' tgm start
CF_PROXY=1 CF_DOMAIN=yourdomain.com tgm start
CF_PROXY=1 CF_PROXY_FIRST=1 CF_DOMAIN=yourdomain.com tgm start
Для manager script CF_BALANCE=1 используется по умолчанию.
Прямой запуск бинарника:
./tg-ws-proxy --cf-proxy --cf-balance
./tg-ws-proxy --cf-proxy --cf-proxy-first --cf-balance
./tg-ws-proxy --cf-proxy --cf-domain yourdomain.com
./tg-ws-proxy --cf-proxy --cf-proxy-first --cf-domain yourdomain.com
Если --cf-domain не указан, бинарь использует built-in пул доменов.
--cf-domain сам по себе не включает Cloudflare route. Нужен --cf-proxy.
MTProto mode позволяет подключать Telegram напрямую как к MTProto-прокси, без SOCKS5.
В меню:
Advanced19) Mode -> mtproto20) Secret -> сгенерировать secret или вставить свой15) Public IP -> указать IP для ссылки подключенияПосле этого прокси покажет tg://proxy?... ссылку. Ее можно открыть в Telegram
или вывести QR-код через 16) Show QR code.
Через переменные окружения:
PROXY_MODE=mtproto MT_SECRET=dda1b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4 MT_LINK_IP=1.2.3.4 tgm start
Прямой запуск бинарника:
./tg-ws-proxy --mode mtproto --secret dda1b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4 --port 1080 --link-ip 1.2.3.4
--link-ip влияет только на ссылку подключения. На маршрутизацию он не влияет.
Если WebSocket до Telegram недоступен и нет своего Cloudflare-домена, можно указать внешний MTProto proxy как запасной маршрут.
./tg-ws-proxy --mode mtproto --secret dda1b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4 --port 1080 \
--mtproto-proxy proxy1.example.com:443:ddf0e1d2c3b4a5968778695a4b3c2d1e0f \
--mtproto-proxy proxy2.example.com:443:dda0b1c2d3e4f5061728394a5b6c7d8e9f
SECRET в --mtproto-proxy - это secret внешнего прокси, а не вашего сервера.
Целевые OpenWrt сборки:
GOOS=linux GOARCH=mipsle GOMIPS=softfloat
GOOS=linux GOARCH=mips GOMIPS=softfloat
GOOS=linux GOARCH=arm GOARM=7
GOOS=linux GOARCH=arm64
GOOS=linux GOARCH=amd64
Скрипт перед установкой проверяет архитектуру, свободное место в /tmp и
доступность релиза.
tgm remove
Или через меню: Advanced -> Remove binary.
После удаления текущая menu-сессия закрывается, потому что manager script уже удален с диска.
Перед удалением меню просит подтверждение.
Команда останавливает прокси, отключает автозап
$ claude mcp add -tg-ws-proxy-Manager-go \
-- python -m otcore.mcp_server <graph>