Files
tglock/README.md
T
Никита Sonic 9429975403 feat(cli): файл настроек tglock.toml (#35)
* fix(bundle): спрятать CLI за фичей — beta.2 и beta.3 упаковывали не тот бинарь

Мой предыдущий фикс (mainBinaryName в #31) фиксом не был. Он изменил только
имя выходного файла: бандлер по-прежнему брал headless CLI и просто
переименовывал его в tglock. Проверено по содержимому опубликованных
артефактов, а не по имени:

  версия  файл в MacOS/  размер  признаки CLI       признаки GUI
  beta.1  tglock         17.8 МБ  нет               ipc.localhost, wry×3206
  beta.2  tglock-cli      4.3 МБ  tglock-cli×6      нет
  beta.3  tglock          4.3 МБ  tglock-cli×6      нет

То есть beta.3 тоже не запускается, и моя же проверка CFBundleExecutable это
пропустила, потому что сверяла имя.

Настоящая причина найдена воспроизведением локально. Ломается только при явном
--target: без него бандлер выбирает GUI, с ним — CLI. Локальная сборка, на
которой я объявил фикс подтверждённым, шла без --target, а обе сборки в CI — с
ним. Обобщение было неправомерным.

Исправление убирает саму возможность выбора: CLI спрятан за фичей cli, которой
нет в default. При сборке приложения второго бинаря просто не существует.

Проверено против воспроизведённой поломки:
  до : tglock.exe 1.7 МБ, признаки CLI, GUI нет
  после: tglock.exe 9.0 МБ, признаки GUI, CLI нет, tglock-cli.exe не собран

Проверки переписаны на содержимое:
- release.yml распаковывает .app и .deb и ищет ipc.localhost (есть только в
  GUI) и allow-direct (есть только в CLI). Поймала бы и beta.2, и beta.3;
- новая задача CI bundle собирает бандл с явным --target aarch64-apple-darwin
  и проверяет его так же. Ловит до публикации, а не после;
- заодно исправлен шаблон grep для .deb: dpkg-deb -c выводит путь без ./, из-за
  чего проверка ложно падала на исправной сборке.

Команда сборки CLI теперь требует --features cli; обновлены README, ci.yml и
release.yml.

* fix(ci): одна проверка бандла на Python вместо трёх копий grep

Проверка содержимого бандла, добавленная в #33, работала на Linux и давала
ложное «в бандле не GUI» на macOS. Причина в BSD grep: в UTF-8-локали он молча
не находит строки в бинарных данных там, где GNU grep находит. Из-за этого
задача macOS в релизе beta.4 упала уже после загрузки артефактов, а вместе с
ней снова пропустилась задача с CLI-бинарями.

Сами артефакты beta.4 при этом корректны — проверено скачиванием: в бандле
tglock на 20.3 МБ, universal/fat, признаки GUI на месте, признаков CLI нет.
Не хватает только tglock-cli-*.

Проверка вынесена в scripts/verify_bundle_binary.py и вызывается из всех трёх
мест: задачи CI bundle, проверки macOS и проверки Linux в релизе. Один скрипт
вместо трёх копий шелл-кода исключает и платформенные различия grep, и
расхождение копий между собой.

Скрипт проверен на реальных исторических артефактах:
  beta.4 (исправный)  → код 0
  beta.3 (сломанный)  → код 1, найдены allow-direct и secret-file
  beta.2 (сломанный)  → код 1, то же

* feat(cli): файл настроек tglock.toml

Запрошено в #32: держать все параметры и секрет в одном месте, чтобы не
собирать батник с ключами при каждом запуске.

Файл ищется рядом с бинарём под именем tglock.toml — как и просили в ишью, —
либо указывается через --config. Приоритеты: значения по умолчанию → файл →
флаги. Флаги-переключатели могут только включать: отсутствие --quiet не
отменяет quiet = true из файла, иначе файлом нельзя было бы ничего включить.

Секрет можно вписать прямо в конфиг, в том числе в форме с префиксом dd — то
есть скопировав из напечатанной ссылки tg://proxy. Отдельный secret_file
остаётся, inline-секрет важнее.

deny_unknown_fields намеренно: опечатка вроде porrt = 1443 останавливает старт
с перечислением допустимых полей. Сервис, который из-за опечатки слушает 1080
вместо 1443, хуже сервиса, который не запустился. Явный --config к
несуществующему файлу тоже ошибка, а не тихий откат к настройкам по умолчанию.

Если секрет не закреплён ни одним из способов, CLI печатает предупреждение:
после перезапуска ссылка станет другой и настроенные клиенты отвалятся.

Найдено при живом прогоне и исправлено здесь же: демон падал, если stdout
закрывался. println! при ошибке записи паникует, а канал закрывается штатно —
`| head`, закрытый терминал, перезапуск сборщика логов. Воспроизводилось
одной командой:

  tglock-cli --port 18101 | head -2
  thread 'tokio-rt-worker' panicked at stdio.rs: failed printing to stdout

Печать переведена на say(), который возвращает признак успеха; наблюдатель
статуса при закрытом stdout просто прекращает печатать, туннель продолжает
работать.

Тестов в CLI стало 26 вместо 12: приоритеты, конфликт lan и bind из разных
источников, обе формы записи секрета, отказ на опечатке и на битых значениях,
комментарии в файле. Плюс parse_secret в ядре с проверкой того, что секрет,
сам начинающийся с dd, не теряет первый байт.

В CI добавлены три шага: чтение настроек из файла, перекрытие флагом и отказ
на опечатке; отдельно — проверка, что закрытый stdout не роняет демон.

Документация: секция про файл настроек в README, полный пример с пояснениями в
tglock.example.toml, юнит systemd переведён на --config.

* fix: вернуть плоский путь бинаря, модуль настроек — в библиотеку

Проверка бандла в CI упала на этом PR:

  failed to rename app binary .../release/cli: No such file or directory

Причина моя. Я перенёс CLI в каталожную форму src/bin/cli/main.rs, и
перечисление бинарей в Tauri вывело имя приложения из имени каталога —
получилось "cli", которого не существует. Явное name = "tglock-cli" в
[[bin]] при этом игнорируется. До переноса, при плоском src/bin/cli.rs,
всё собиралось.

Путь бинаря вернулся к src/bin/cli.rs, а модуль настроек переехал в
библиотеку как cli_settings под фичей cli. Ему там и место: он работает с
ListenConfig, mtproto и proxy, а clap не использует вовсе.

Проверено воспроизведением того же условия локально — сборка бандла с явным
--target: приложение собирается, скрипт проверки подтверждает GUI-бинарь
(9.0 МБ, ipc.localhost и wry на месте, признаков CLI нет).

Тестов: 66 в библиотеке с фичей cli, 12 в бинаре, clippy чист в обоих
вариантах сборки. Живой прогон с конфигом и отказ на опечатке сохранились.

---------

Co-authored-by: by-sonic <171230345+by-sonic@users.noreply.github.com>
2026-07-30 20:19:31 +03:00

42 KiB
Raw Blame History

RoseVPN — попробовать бесплатно в Telegram

Быстрый VPN для России — YouTube без буферизации, Discord/Instagram/ChatGPT снова работают.
Подключение в Telegram через @rosevpnru_bot — бесплатный пробный период, без регистрации, без карты.

YouTube — без буферов Discord — голос работает Instagram — открывается ChatGPT — доступен


🔓 TGLock

Обход блокировки Telegram через WebSocket-туннель

Один клик. Без VPN. Без серверов. Без подписки.

Скачать последний релиз Всего загрузок GitHub stars

Windows macOS Linux Rust MIT License

Telegram стал тормозить или перестал открываться? Запусти TGLock — и мессенджер снова работает. Не нужны VPN, прокси-серверы, абонентская плата или регистрация.

Новый интерфейс TGLock


🤔 Что это и зачем

TGLock — это локальный прокси на твоём компьютере: принимает и MTProto, и SOCKS5. Он перехватывает соединения Telegram, заворачивает их в WebSocket и отправляет на веб-инфраструктуру Telegram — по нескольким маршрутам сразу, переключаясь на следующий, если текущий перестал отвечать. Провайдер видит обычный HTTPS.

Кому подойдёт:

  • 📱 Telegram открывается через раз, сообщения уходят с задержкой, фото и видео не грузятся
  • 🛡 GoodbyeDPI, Zapret или ByeDPI больше не помогают — провайдер шейпит по IP
  • 🍎 Нужен графический интерфейс под macOS
  • 💻 Нужно решение для Windows, macOS или Linux без подписок и без своего сервера
  • 🖥 Нужен вариант для сервера или машины без монитора — для этого есть tglock-cli

Чего TGLock не делает — честно, чтобы не тратить твоё время:

  • Голосовые и видеозвонки. Они идут по UDP, а TGLock проксирует только TCP. Со звонками ничего не изменится
  • Всё, кроме Telegram. YouTube, Discord, Instagram, ChatGPT работать не начнут: TGLock разворачивает только MTProto — протокол, который больше нигде не используется
  • Android и iOS. Своего приложения нет. Телефон можно подключить к TGLock на компьютере через LAN-режим

Чем отличается от VPN: TGLock работает только с Telegram. Остальной трафик идёт напрямую — ничего не замедляется, мобильный трафик не расходуется впустую.


Скачать

👉 Последний релиз

Платформа Файл
Windows 10/11 (x64) _x64-setup.exe
macOS (Apple Silicon + Intel) universal .dmg
Linux (x86_64) .deb
Linux (x86_64, портативно) .AppImage
Сервер, контейнер, машина без монитора tglock-cli-*

Все сборки весят единицы мегабайт. Исключение — .AppImage: он несёт своё окружение и поэтому крупный.

🖥 tglock-cli — тот же туннель без графического интерфейса, одним бинарём. Нужен там, где окно не создаётся: сервер, контейнер, виртуалка, машина без монитора. Доступен начиная с v2.0.0-beta.2. Если ты скачал beta.2 и приложение не открывалось — это была ошибка сборки, исправлено в beta.3. Подробности — ниже.

🛡 Антивирус ругается, SmartScreen предупреждает, VirusTotal показывает детекты

Так и будет. Объясню механизм и дам способы проверить, не доверяя мне на слово.

Что ты увидишь. На Windows — «Система Windows защитила ваш компьютер» от SmartScreen. На VirusTotal — детекты у части движков, обычно единицы из примерно шестидесяти.

Почему. Складываются две вещи. Установщик не подписан сертификатом, а неподписанные файлы проверяются эвристиками гораздо строже, чем подписанные. И само поведение программы — открыть локальный порт, объявить себя прокси-сервером, прописаться в настройки соединения Telegram — это ровно тот профиль, по которому эвристики ищут прокси-трояны. Программа делает именно это, только по твоей просьбе. Отличить одно от другого автоматически движок не может, поэтому и реагирует.

Подписи не будет. Сертификат — это ежегодный платёж, а проект бесплатный и ничего не зарабатывает. Значит предупреждение останется, и делать вид, что «скоро подпишем», я не буду.

Как проверить вместо доверия. Три способа, все не требуют верить мне:

  1. Сверить контрольную сумму. GitHub публикует sha256 каждого файла прямо на странице релиза — разверни Assets и увидишь digest рядом с именем. Сравни с тем, что скачалось:

    Get-FileHash .\TGLock_<версия>_x64-setup.exe -Algorithm SHA256
    
    sha256sum tglock-cli-x86_64-unknown-linux-gnu   # Linux
    shasum -a 256 tglock-cli-universal-apple-darwin  # macOS
    

    Это доказывает, что файл не подменили по пути к тебе.

  2. Посмотреть, как файл собирался. Бинарники собирает GitHub Actions из публичного коммита, лог открыт и его никто не может отредактировать задним числом. У каждого релиза на странице Actions есть свой запуск: видно, какой коммит взят и какими командами собран. Ссылка на него — в описании релиза.

  3. Собрать самому. Для CLI это одна команда и никаких зависимостей кроме Rust:

    cargo build --release --locked --no-default-features --features cli --bin tglock-cli
    

    Полная сборка с интерфейсом — ниже.

Если этого недостаточно — не запускай. Это нормальное решение, а не паранойя: исполняемый файл из интернета без подписи заслуживает недоверия по умолчанию. Собери из исходников или возьми tg-ws-proxy — он решает ту же задачу и тоже открыт.

🍎 macOS: пока сборка не нотарифицирована Apple, при первом запуске может понадобиться:

xattr -cr /Applications/TGLock.app

Это снимает карантин Gatekeeper с приложения, скачанного из GitHub.


🚀 Как пользоваться

  1. Скачай и запусти приложение для своей системы.
  2. Нажми «Включить защиту».
  3. TGLock откроет Telegram и предложит подключить локальный MTProto-прокси.
  4. Telegram работает. Окно TGLock можно свернуть.

Ручная настройка (если автоматическая не сработала)

Telegram → Настройки → Продвинутые → Тип соединения → Использовать проксиSOCKS5

  • Сервер: 127.0.0.1
  • Порт: 1080

🏠 LAN-режим — один прокси на всю квартиру

В окне TGLock включи галочку LAN — приложение начнёт слушать на 0.0.0.0. Все устройства в домашней сети (телефон, планшет, ноутбук, телевизор) смогут подключиться к <IP-компьютера>:1080 и тоже получить рабочий Telegram.

Ссылку tg://proxy с уже подставленным адресом TGLock открывает сам при включении — её достаточно переслать себе в Telegram и открыть на телефоне. Если нужен адрес руками: ipconfig на Windows, ip a на Linux, ifconfig на macOS.

Удобно, если дома один компьютер всегда включён — он становится «домашним Telegram-роутером».

В LAN-режиме TGLock пропускает только адреса Telegram. Открытым SOCKS5-прокси для всего интернета он при этом не становится — иначе им бы воспользовались не только твои устройства.

🖥 Без графического интерфейса: tglock-cli

Для сервера, виртуалки, контейнера и машины без монитора или без 3D-ускорения. Это отдельный бинарь, в котором нет ни Tauri, ни системного WebView — там, где окно просто не создаётся, CLI работает.

tglock-cli                                # 127.0.0.1:1080, только для этого компьютера
tglock-cli --lan                           # 0.0.0.0:1080, только адреса Telegram
tglock-cli --bind 10.0.0.5 --port 1443     # свой адрес и порт
tglock-cli --worker my-name.workers.dev    # резервный маршрут, см. docs/CLOUDFLARE_WORKER.md
tglock-cli --help                          # все флаги

Файл настроек

Чтобы не собирать батник с ключами при каждом запуске (#32), положите рядом с бинарём tglock.toml — он подхватится сам. Или укажите путь: tglock-cli --config /etc/tglock.toml.

port = 1080
lan = true

# Секрет — вторая половина ссылки tg://proxy. Для сервиса его нужно закрепить,
# иначе после перезапуска все настроенные клиенты отвалятся. Запустите один
# раз, скопируйте из напечатанной ссылки и вставьте сюда.
secret = "dd00112233445566778899aabbccddeeff"

worker = ["my-name.workers.dev"]

Полный пример со всеми полями и пояснениями — tglock.example.toml.

Приоритеты: значения по умолчанию → файл → флаги. Флаг всегда сильнее файла. Флаги-переключатели (--lan, --allow-direct, --quiet) могут только включать: их отсутствие означает «взять из файла», а не «выключить».

Опечатка в файле — ошибка при старте с перечислением допустимых полей, а не молча проигнорированная строка. Сервис, который из-за porrt = 1443 слушает 1080, хуже сервиса, который не запустился.

Файл с секретом внутри держите с правами 600: это доступ к вашему прокси.

При запуске печатается готовая tg://proxy-ссылка — её можно открыть на любом устройстве в сети, чтобы Telegram настроился сам. Дальше в лог идёт по строке на каждое изменение состояния: сколько соединений, какой дата-центр, какой маршрут живой, сколько сбоев.

Прав администратора не нужно: TGLock не правит ни системный DNS, ни файл hosts — нужные адреса Telegram зашиты в маршрутах, а TLS SNI остаётся настоящим.

--lan и любой другой сетевой адрес пропускают только адреса Telegram. Обычным SOCKS5-прокси TGLock становится исключительно по явному --allow-direct, и на сетевом адресе это открытый прокси для всего интернета — включайте осознанно.

Юнит для systemd

[Unit]
Description=TGLock — Telegram через WebSocket-туннель
After=network-online.target
Wants=network-online.target

[Service]
Type=exec
ExecStart=/usr/local/bin/tglock-cli --config /etc/tglock.toml
Restart=on-failure
RestartSec=5s
StateDirectory=tglock
DynamicUser=yes
NoNewPrivileges=yes
ProtectSystem=strict
ProtectHome=yes
PrivateTmp=yes
RestrictAddressFamilies=AF_INET AF_INET6

[Install]
WantedBy=multi-user.target
sudo install -m755 tglock-cli-x86_64-unknown-linux-gnu /usr/local/bin/tglock-cli
sudo install -m600 tglock.example.toml /etc/tglock.toml   # и отредактировать
sudo systemctl enable --now tglock
journalctl -u tglock -f

Закреплённый секрет здесь обязателен, и это не украшение: секрет — половина tg://proxy-ссылки. Без него он генерируется заново при каждом старте, и после первого же systemctl restart все настроенные клиенты перестанут подключаться. Задайте secret в /etc/tglock.toml (файл с правами 600) либо secret_file = "/var/lib/tglock/secret" — тогда StateDirectory=tglock создаст каталог с нужными правами, а файл запишется с режимом 600.

При старте без закреплённого секрета CLI печатает предупреждение — молча уйти в такое состояние он не даст.

Остановка по systemctl stop приходит как SIGTERM — CLI закрывает туннели и выходит с нулевым кодом, а не умирает по SIGKILL.

Docker

FROM rust:1.88 AS build
WORKDIR /src
COPY . .
RUN cargo build --release --locked --no-default-features --features cli --bin tglock-cli

FROM debian:bookworm-slim
RUN apt-get update && apt-get install -y --no-install-recommends ca-certificates \
    && rm -rf /var/lib/apt/lists/*
COPY --from=build /src/target/release/tglock-cli /usr/local/bin/tglock-cli
EXPOSE 1080
ENTRYPOINT ["tglock-cli", "--lan", "--secret-file", "/data/secret"]
docker run -d --name tglock -p 1080:1080 -v tglock-data:/data tglock

Образу не нужны ни Node.js, ни libwebkit2gtk — только ca-certificates для проверки сертификата Telegram.


🔬 Как это работает

Telegram Desktop / mobile (через LAN)
              ▼
   MTProto или SOCKS5 (127.0.0.1:1080 либо 0.0.0.0:1080)
              ▼
        TGLock — читает первые 64 байта
                 obfuscated2 init-пакета,
                 расшифровывает AES-256-CTR,
                 достаёт номер DC
              ▼
   WSS → kws{dc}.web.telegram.org
         каскад маршрутов, см. ниже
              ▼
        Telegram Data Center
  1. Локальный прокси принимает соединения Telegram: и MTProto (по ссылке tg://proxy), и SOCKS5.
  2. Из первых 64 байт obfuscated2-пакета расшифровывается номер DC — AES-256-CTR, ключ в байтах [8..40], IV в [40..56], индекс DC — i16 в [60..62]. Отрицательное значение означает медиа-соединение.
  3. Трафик заворачивается в WebSocket к kws{dc}.web.telegram.org — это тот же домен, через который работает Telegram Web в браузере.
  4. Маршрут выбирается каскадом, и это главное отличие 2.0 от первой версии. Один домен может резолвиться в недоступный адрес, поэтому по очереди пробуются: закреплённые IP Telegram, их дублёры kwsN-1, системный DNS и — если ты его настроил — твой собственный Cloudflare Worker. Упавший маршрут уходит в cooldown с удвоением задержки, удачный запоминается для этого DC. Системный DNS и файл hosts при этом не изменяются: TCP-соединение идёт на закреплённый IP, а TLS SNI и заголовок Host остаются настоящими, поэтому сертификат Telegram проверяется как обычно.
  5. Провайдер видит TLS-handshake к web.telegram.org — легитимный HTTPS, MTProto в нём не виден.
  6. Весь остальной трафик (не-Telegram) проходит напрямую — без замедления.

Интерфейс различает три состояния и не выдаёт одно за другое: «Защита включена» — локальный порт открыт, туннеля пока нет; «Ищем новый маршрут» — попытки были неудачными, идёт перебор; «Telegram на связи» — есть установленный туннель, то есть WebSocket-рукопожатие уже прошло. Смешивание первого и третьего состояния и было основной причиной жалоб «прокси подключён, а Telegram не работает».

📖 Архитектура 2.0, различение протоколов и честный список ограниченийdocs/ARCHITECTURE_V2.md. Запасной маршрут через свой Cloudflare Worker, со скриптом и пошаговой установкой — docs/CLOUDFLARE_WORKER.md. Разбор всех issue и того, что в них было обещано зря — docs/ISSUE_AUDIT.md. Черновик статьи про переход v1 → v2 лежит в HABR.md — цифры там описывают код на момент написания, документацией он не является.


🆚 Сравнение с альтернативами

GoodbyeDPI Zapret AmneziaVPN TGLock
Подход Фрагментация пакетов TCP/UDP desync Полноценный VPN-туннель WebSocket-туннель
Обходит IP-шейпинг
macOS (GUI) Windows only только CLI
Нужен сервер / подписка ($)
Только Telegram
LAN-шаринг сложно (галочка)
Режим без GUI (tglock-cli)
Размер ~200 КБ ~5 МБ ~80 МБ 2 МБ установщик, 2 МБ CLI
Цена 0 ₽ 0 ₽ свой сервер 0 ₽

⚠ Когда TGLock не подойдёт: если заблокирован не только Telegram, а ещё YouTube, Discord, Instagram или ChatGPT — обходить каждый сервис отдельно смысла нет, нужен полноценный VPN. TGLock эту задачу не решает и решать не будет: он разворачивает только MTProto.

Звонки тоже не заработают — они по UDP, а TGLock проксирует только TCP.


Часто задаваемые вопросы

Telegram заблокировали в России — это правда?

Полностью Telegram в РФ не заблокирован, но провайдеры замедляют трафик через DPI и шейпят по IP-диапазонам Telegram DC (149.154.160175, 91.108.48, 91.108.5659 и др.). У части пользователей мессенджер открывается через раз, видео не грузится, фото уходят минутами.

TGLock решает именно это — заворачивает Telegram-трафик в HTTPS к веб-инфраструктуре Telegram, которая под шейпинг не попадает. Голосовые и видеозвонки он не лечит: они идут по UDP, а TGLock проксирует только TCP.

Это безопасно? Что с моими данными?

TGLock — локальный прокси. Он работает только на твоём компьютере и не отправляет данные третьим сторонам. Соединение идёт к серверам Telegram через их же домен web.telegram.org — тот же, что использует Telegram Web в браузере. Единственное исключение — если ты сам укажешь в настройках свой Cloudflare Worker как резервный маршрут; по умолчанию это поле пустое, и никакой сторонней инфраструктуры в схеме нет.

Кода — около 2900 строк Rust (из них ~1100 приходится на тесты) и ~380 строк TypeScript на интерфейс. Всё открыто, можно прочитать и собрать самому. Бинарники в релизах собираются из этого же исходника в GitHub Actions — логи сборки публичные.

Чем отличается от GoodbyeDPI / Zapret / ByeDPI?

GoodbyeDPI, Zapret и ByeDPI фрагментируют пакеты, чтобы DPI не распознал MTProto. Это работает, пока провайдер блокирует по содержимому. Но если шейпинг идёт по IP (а так делают большинство крупных РФ-провайдеров с 2024–2026 — Ростелеком, МТС, Билайн, Мегафон), фрагментация не помогает: пакеты всё равно идут на «нехороший» IP и троттлятся.

TGLock же отправляет трафик на web.telegram.org — обычный HTTPS-домен, который под IP-шейпинг Telegram DC не попадает.

Работает ли на iPhone или Android?

Своего приложения под Android и iOS нет — TGLock только для desktop. Есть два обходных пути:

  1. LAN-режим на компьютере. Включи галочку LAN, и в настройках Telegram на телефоне укажи прокси с IP компьютера. Работает, пока компьютер включён и телефон в той же сети.
  2. tglock-cli на своём VPS. Headless-бинарь запускается как systemd-сервис, слушает 0.0.0.0 и пропускает только адреса Telegram — тогда телефон работает откуда угодно, а не только из дома. См. раздел про CLI.

Поддержка Android обсуждается в #9, сроков нет: Tauri 2 умеет собирать под Android, но перехват трафика там делается через VpnService — это другая архитектура, а не пересборка того же кода.

Замедляет ли TGLock интернет?

Нет. Через прокси идёт только трафик Telegram (фильтрация по IP-диапазонам Telegram DC). YouTube, браузер, игры, торренты — всё это идёт напрямую и не замедляется. В этом главное отличие от VPN.

Apple ругается «приложение не проверено / нельзя открыть»

Сборка пока не подписана и не нотарифицирована — Apple Developer ID стоит $99 в год. Сними карантин Gatekeeper руками: перенеси приложение из .dmg в «Программы» и выполни в Терминале

xattr -cr /Applications/TGLock.app

После этого приложение запустится двойным кликом из Finder.

Telegram пишет «прокси не настроен» или сразу отключается

Открой TGLock — он должен показывать «ПОДКЛЮЧЕНО» и хотя бы одно активное соединение, когда Telegram пытается работать. Если соединений ноль:

  • Не запущен ли уже другой прокси на порту 1080? В TGLock можно поменять порт в настройках.
  • Антивирус/файрвол не блокирует localhost-подключения?
  • В настройках Telegram сервер указан как 127.0.0.1, не localhost — на некоторых системах это разные сетевые стеки.
  • На macOS — убедись что снят Gatekeeper (xattr -cr ...).
Приложение вообще не запускается — окно не появляется

Так проявляется отсутствие 3D-ускорения: интерфейс построен на системном WebView, а тот без ускорения окно не создаёт. Отсюда же случаи «не работает в виртуалке», «не стартует с дефолтным драйвером Microsoft» и «нет монитора».

Начиная с 2.0.0-beta.2 TGLock сам просит у WebView программный рендер, так что на таких машинах должен запускаться. Если хочется вернуть аппаратное ускорение — запусти с переменной TGLOCK_FORCE_GPU=1.

Если окно всё равно не появилось, интерфейс тебе и не нужен: возьми tglock-cli, которому WebView не требуется вообще. И напиши в #10 или #17, что именно за система — это как раз те ишью.

Порт 1080 уже занят другим приложением

В окне TGLock есть поле «Порт» — поменяй на любой свободный (например, 10800, 1081, 8888). После рестарта прокси автоматически обновит deep-link для Telegram. В настройках Telegram укажи новый порт.

А что если провайдер заблокирует и web.telegram.org?

Это реальный риск, и TGLock 2.0 к нему подготовлен настолько, насколько может.

Маршрут не один: пробуются закреплённые IP Telegram, дублёры kwsN-1 и системный DNS. Пока жив хотя бы один — туннель поднимается.

Если у твоего провайдера легли все маршруты, есть запасной выход — свой Cloudflare Worker. Тогда соединение идёт на твой домен *.workers.dev, а воркер доводит его до Telegram; блокировать его провайдеру придётся отдельно. Готовый скрипт и пошаговая установка: docs/CLOUDFLARE_WORKER.md. Нужен только аккаунт Cloudflare, бесплатного тарифа хватает, свой сервер и домен не нужны.

Признак, что пора это делать: приложение показывает «Ищем новый маршрут» и не проходит, а в диагностике туннелей 0 и растёт счётчик сбоев. Если Telegram работает — настраивать ничего не надо.

Но честно: если веб-версию Telegram заблокируют так, что её не видно и из датацентров Cloudflare, подход исчерпает себя. TGLock держится на доступности web.telegram.org, и никакой запас маршрутов этого не отменяет.

Можно ли использовать TGLock как обычный SOCKS5 для других приложений?

Смысла нет, и по умолчанию это запрещено.

TGLock определяет Telegram по IP получателя и заворачивает в WebSocket только его. Не-Telegram адреса он релеит напрямую — без шифрования, то есть никакой пользы для обхода в этом нет.

Поэтому такой релей разрешён только когда прокси слушает 127.0.0.1, где до него дотянутся лишь процессы твоего компьютера. На 0.0.0.0 и любом сетевом адресе не-Telegram запросы отклоняются: иначе LAN-режим сделал бы из твоей машины открытый прокси для всего интернета. В tglock-cli это можно переопределить флагом --allow-direct — но на сетевом адресе ты получишь именно открытый SOCKS5, так что делай это осознанно.

Где скачать новые версии? Будут ли обновления?

Все релизы — на странице GitHub Releases. При пуше тега v* GitHub Actions собирает и публикует установщики под Windows x64, macOS (universal) и Linux x64, плюс headless tglock-cli под те же три платформы. Подпишись на репозиторий (кнопка WatchCustomReleases), чтобы получать уведомления.


🛠 Стек технологий

Технология Зачем
Rust Один бинарник, нативная скорость, без runtime-зависимостей
Tauri 2 Нативная оболочка для GUI. Опциональна: за фичей gui, в CLI не входит
TypeScript + Vite Интерфейс, внутренняя навигация и строгая типизация
tokio Async I/O, обработка сигналов для корректной остановки сервиса
tokio-tungstenite WebSocket-клиент с TLS поверх native-tls
aes + ctr Расшифровка MTProto obfuscated2 init-пакета
clap Разбор аргументов tglock-cli

Ядро (src/lib.rs: разбор MTProto, каскад маршрутов, прокси) не зависит ни от Tauri, ни от оконной системы — поэтому один и тот же код обслуживает и графический интерфейс, и headless-режим.


🏗 Сборка из исходников

git clone https://github.com/by-sonic/tglock.git
cd tglock
npm ci
npm run tauri build

Результат — target/release/tglock (или tglock.exe на Windows).

Минимальная версия Rust — 1.88 (rust-version в Cargo.toml, проверяется отдельной задачей в CI). На более старых тулчейнах зависимости не соберутся: часть из них требует edition 2024.

Только CLI, без графики

cargo build --release --locked --no-default-features --features cli --bin tglock-cli

Ни Node.js, ни фронтенда, ни libwebkit2gtk для этого не нужно — при выключенной фиче gui Tauri и системный WebView в сборку не попадают вообще. Именно так CLI собирается на голом сервере.

Проверки, которые гоняет CI

cargo fmt --check
cargo clippy --all-targets -- -D warnings
cargo clippy --no-default-features --features cli --all-targets -- -D warnings
cargo test --all-targets
cargo test --no-default-features --features cli --lib --bins

Тестов 59: разбор obfuscated2, каскад маршрутов и его cooldown, протокольные отказы SOCKS5, устойчивость секрета к перезапуску, плюс сквозной тест туннеля против мок-сервера, который реализует сторону Telegram и проверяет, что до неё доходит ровно тот открытый текст, который отправил клиент. Единственный тест с пометкой #[ignore] — тот, что требует живой сети.

Свой релиз через GitHub Actions

Форкни репозиторий и поставь тег v*.github/workflows/release.yml соберёт установщики под Windows x64, macOS (universal, Apple Silicon + Intel) и Linux x64, а также tglock-cli под те же три платформы, и опубликует их в релизе.


🤝 Как помочь

Проект живой, PR и баг-репорты разбираются.

  • Нашёл баготкрой issue. Полезнее всего: ОС и версия, что показывает вкладка диагностики (маршрут, DC, число сбоев) и провайдер. Для tglock-cli — вывод из консоли.
  • Хочешь фичу — тоже issue. Если её нет в планах, так и будет написано, без месяцев тишины.
  • Присылаешь PR — перед отправкой прогони проверки выше, они те же, что в CI. Небольшие PR ревьюятся быстрее.
  • Не работает после релиза — это регрессия, пиши сразу, такие вещи в приоритете.

Известные ограничения, о которых не нужно открывать issue: звонки (UDP), сервисы кроме Telegram (только MTProto), Android и iOS (обсуждается в #9).


📄 Лицензия

MIT — делай что хочешь. Форки, модификации, использование в коммерческих проектах — всё разрешено. Ссылка на репозиторий приветствуется, но необязательна.


by sonic · Issues & feedback · Releases