Компактный 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-архитектуры
- OpenWrt:
mipsel_24kc,mips_24kc,armv7,armv8l,aarch64,x86_64 - Linux:
x86_64,aarch64,armv7,armv6,386,riscv64,loong64 - Additional targets:
mips64,mips64el - macOS:
amd64,arm64 - Windows:
amd64,arm64 - FreeBSD:
amd64,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-режим
Если нужно получать не обычные релизы, а тестовые обновления из ветки:
- Откройте меню
tgm - Перейдите в
Advanced - Выберите
Update source - Выберите режим
preview - Выберите ветку из списка или введите имя вручную
- После сохранения вернитесь в главное меню и запустите
Setup / Update
После этого менеджер будет обновляться из выбранной preview-ветки, а не из обычных release-тегов.
Если нужно вернуться обратно на стабильные релизы:
- Снова откройте
Advanced -> Update source - Выберите режим
release - Оставьте
latest, выберите тег из списка или введите его вручную - Запустите
Setup / Update
Если у вас уже включен автозапуск, источник обновлений тоже будет сохранён.
Текущий UX Update source:
- на первом экране доступны
release,previewиback - пустой Enter на первом экране делает
back - для
releaseпоказывается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, если свои домены уже заданыback
10) 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:dda0b1c2d3e4f5061728394a5b6c7d8e9fSECRET в --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 уже удален с диска.
Перед удалением меню просит подтверждение.
Команда останавливает прокси, отключает автозапуск и удаляет:
- бинарник и файл версии из
/tmp - постоянную копию для автозапуска
- команду
tgm init.dсервис- скрипт управления
- PID-файл и директорию состояния
Данный репозиторий создан исключительно как пример и для ознакомительных целей. Автор не несет ответственности за использование проекта, его настройку, запуск и возможные последствия. Вся ответственность за такие действия лежит на пользователе.