mirror of
https://github.com/by-sonic/tglock.git
synced 2026-10-04 08:16:01 +03:00
fix(media): use native MTProto for CDN203 and retain recent diagnostics
This commit is contained in:
@@ -205,8 +205,10 @@ Ping приходит в читающую половину, а отвечает
|
||||
4. дополнительные Telegram IP и варианты хоста;
|
||||
5. системный DNS (кроме CDN DC203).
|
||||
|
||||
Поддерживаются DC1–5 и media/CDN DC203. DC203 использует WebSocket-host DC2,
|
||||
но подключается к собственному IP. DNS fallback на DC2 для DC203 запрещён:
|
||||
Поддерживаются DC1–5 и CDN DC203. Для DC203 первым используется обычный MTProto
|
||||
TCP к закреплённому `91.105.192.100:443`; этот сервер может принимать MTProto,
|
||||
не принимая TLS/WebSocket. Резерв через Worker соединяется с тем же IP.
|
||||
WebSocket-попытки также сохраняют закреплённый адрес. DNS fallback на DC2 для DC203 запрещён:
|
||||
успешный WebSocket handshake с другим DC не доставляет CDN-запрос в нужный
|
||||
датацентр. Worker также получает именно IP DC203.
|
||||
|
||||
@@ -228,6 +230,10 @@ Ping приходит в читающую половину, а отвечает
|
||||
подхватываются. Тесты проверяют доверенный сертификат, SNI, неверное имя
|
||||
хоста и недоверенного издателя.
|
||||
|
||||
Это относится к TLS-маршрутам. Прямой CDN TCP — отдельный транспорт MTProto,
|
||||
а не TLS с отключённой проверкой. Он доступен только для точного назначения
|
||||
DC203. Для произвольных адресов такой обход политики не добавляется.
|
||||
|
||||
Cloudflare Worker принимается только как пользовательская настройка. TGLock
|
||||
не загружает и не скрывает публичные списки чужих доменов.
|
||||
|
||||
|
||||
@@ -12,11 +12,12 @@
|
||||
| #58 — Worker, туннели 0/1 | Worker отвечал 101 до открытия TCP; ошибки после handshake терялись | Worker 502/504 и диагностические WebSocket close-коды, Rust-тесты раннего закрытия и reset. HTTP 426 проверяет только публикацию Worker |
|
||||
| #50 — ни один маршрут не работает | Последовательные TCP/TLS таймауты задерживали резерв; кратковременные туннели ошибочно сохраняли предпочтение маршрута | Ограниченный параллелизм, cooldown после upstream failure, ошибки Worker. Нельзя обещать обход, когда недоступны и Telegram, и собственный Worker |
|
||||
| #42 — Android через LAN | Прежние duplex-исправления уже в main; потеря ошибок upstream скрывала дальнейший отказ | Независимый Android-compatible криптографический вектор, фрагментированные init и одновременная передача 128/256 КиБ, диагностика разрывов. Нужна проверка Play Market-клиента в сети репортёра |
|
||||
| #32 — медиа | DC203 fallback через DNS попадал в DC2, хотя CDN имеет свой DC и ключи | DC203 сохраняет IP CDN во всех маршрутах; тест Worker dst, двунаправленная передача. Реальные фотографии аккаунта репортёра не проверены |
|
||||
| #32 — медиа | DC203 fallback через DNS попадал в DC2, хотя CDN имеет свой DC и ключи; на закреплённом CDN IP WebSocket не отвечает, но обычный MTProto TCP работает | DC203 использует точный CDN IP по TCP с преобразованием transport-шифрования; Worker остаётся резервом. Проверка живым req_pq/resPQ и тесты обеих сторон. Реальные фотографии аккаунта репортёра не проверены |
|
||||
| #53 — статическая aarch64 | Системный OpenSSL мешал самостоятельной musl-сборке | rustls + ring, ARM64 CI с проверкой ELF и запуском CLI, артефакт и OpenWrt-инструкция. Физический NanoPi R4S не проверен |
|
||||
| #9 — Android | Старый PR отстал от main, сборка требовала ручной настройки; жизненный цикл сервиса мог останавливать прокси или оставлять ложное уведомление | Перенос актуального ядра, foreground service по состоянию прокси, APK CI, постоянный секрет в каталоге приложения. HyperOS и длительная фоновая работа требуют устройства |
|
||||
|
||||
Дополнительно: Unicode-секрет больше не вызывает panic; GUI сохраняет секрет
|
||||
Дополнительно: журнал больше не замолкает после первых 64 разных событий;
|
||||
Unicode-секрет больше не вызывает panic; GUI сохраняет секрет
|
||||
в каталоге приложения с миграцией прежнего файла; npm lock обновляет уязвимый
|
||||
транзитивный `nanoid` без смены версии приложения.
|
||||
|
||||
@@ -25,6 +26,10 @@
|
||||
- TLS проверяет имя из WebSocket URI даже при подключении к закреплённому IP.
|
||||
Переход на rustls использует встроенные WebPKI roots; системные пользовательские
|
||||
корневые сертификаты автоматически не импортируются.
|
||||
- Прямой маршрут CDN203 использует обычный MTProto TCP к одному закреплённому
|
||||
адресу, без TLS-обёртки. Ключи и шифрование содержимого Telegram не меняются;
|
||||
снимается только transport-obfuscation локального прокси и накладывается
|
||||
transport-obfuscation сервера. Если провайдер блокирует CDN IP, нужен Worker.
|
||||
- [Telegram WebSocket](https://core.telegram.org/mtproto/transports#websocket)
|
||||
является потоком байтов. Границы TCP read и WS messages не обязаны совпадать
|
||||
с MTProto-пакетами; дополнительный парсер пакетов не добавлялся.
|
||||
@@ -47,7 +52,8 @@ cargo test --locked --no-default-features --features cli --lib --bins
|
||||
```
|
||||
|
||||
CI дополнительно проверяет MSRV 1.88, состав macOS GUI bundle, статическую
|
||||
ARM64 musl-сборку и подпись/содержимое Android debug APK. Конкретные результаты
|
||||
ARM64 musl-сборку, подпись/содержимое Android debug APK и запуск на Android 15
|
||||
эмуляторе. Пропуск UI lifecycle отмечается отдельно от успешного запуска. Конкретные результаты
|
||||
и ссылки на прогоны фиксируются в описании PR после завершения CI.
|
||||
|
||||
Worker: `npm run test:worker` исполняет настоящий deployment-файл с подменой
|
||||
@@ -55,6 +61,10 @@ Worker: `npm run test:worker` исполняет настоящий deployment-
|
||||
Это не тест живого Cloudflare-аккаунта. Отдельный тест Rust поднимает локальный
|
||||
WebSocket и проверяет совместимость клиента с контрактом Worker.
|
||||
|
||||
Для проверки реального бинаря без Telegram-аккаунта добавлен
|
||||
[независимый Node.js probe](LIVE_PROBE.md). Он проверяет `req_pq_multi → resPQ`,
|
||||
nonce и целостность ответа; это ещё не авторизация и не скачивание медиа.
|
||||
|
||||
## Что нужно проверить на устройствах
|
||||
|
||||
Android: установка APK, старт/стоп, ссылка в Telegram, сохранение секрета после
|
||||
|
||||
@@ -0,0 +1,61 @@
|
||||
# Manual protocol probe
|
||||
|
||||
`scripts/probe_proxy.mjs` uses only Node.js built-ins and is independent of the
|
||||
Rust transport helpers. It connects to an already running TGLock listener at
|
||||
`127.0.0.1`, sends one unauthenticated `req_pq_multi` through a secret-protected
|
||||
obfuscated2 padded-intermediate stream, and validates the returned `resPQ`, its
|
||||
request nonce, and the lengths of its TL fields. It stops before creating an
|
||||
authorization key. No Telegram account, API ID, API hash or login is needed.
|
||||
|
||||
The secret is read from an explicitly supplied file and is never printed. Use
|
||||
the same secret file as the running CLI. Do not paste proxy links or secret
|
||||
values into public logs.
|
||||
|
||||
```sh
|
||||
# Offline validation first: no network access.
|
||||
node scripts/probe_proxy.mjs --self-test
|
||||
|
||||
# Start a local CLI separately, using a persistent secret file.
|
||||
tglock-cli --port 18080 --secret-file /private/path/tglock-secret
|
||||
|
||||
# Ordinary DC, media route, and CDN route; run each explicitly.
|
||||
node scripts/probe_proxy.mjs --port 18080 --secret-file /private/path/tglock-secret --dc 2
|
||||
node scripts/probe_proxy.mjs --port 18080 --secret-file /private/path/tglock-secret --dc -4 --fragment-size 7
|
||||
node scripts/probe_proxy.mjs --port 18080 --secret-file /private/path/tglock-secret --dc 203
|
||||
```
|
||||
|
||||
On Windows, supply the downloaded CLI executable and a Windows file path in the
|
||||
same commands. Supported DC values are `1` through `5` and `203`; a negative
|
||||
value requests a media route. `--timeout-ms` defaults to 15000 and is bounded at
|
||||
120000. The response is bounded at 2 MiB. `--fragment-size 7` sends small writes
|
||||
with 2 ms gaps to exercise stream fragmentation; TCP can still combine writes.
|
||||
|
||||
A successful JSON report contains `response: "resPQ"`, `nonceMatches: true`, the
|
||||
requested DC, the public RSA fingerprint count, and elapsed time. Exit status 1
|
||||
means connection, timeout, decryption/framing or response validation failed.
|
||||
The ordinary CI suite does not run this live probe.
|
||||
|
||||
Success demonstrates a correctly relayed protocol exchange. It does **not**
|
||||
authenticate the responding server, prove its DC identity, log into an account,
|
||||
or verify message sending, media downloads or Android lifecycle. In particular,
|
||||
`requestedDc` describes the request, not an independently confirmed backend.
|
||||
|
||||
## Isolate CDN transport failures
|
||||
|
||||
To distinguish an unavailable CDN WebSocket endpoint from an unavailable CDN
|
||||
TCP connection, explicitly run:
|
||||
|
||||
```sh
|
||||
node scripts/probe_proxy.mjs --direct-cdn --dc 203
|
||||
```
|
||||
|
||||
This optional mode bypasses local TGLock and connects **only** to the pinned
|
||||
Telegram CDN address `91.105.192.100:443`, using raw obfuscated2 TCP without a
|
||||
proxy secret or TLS. It supports no arbitrary host. It performs the same single
|
||||
unauthenticated exchange and still does not prove account or media operation.
|
||||
The parser accepts trailing bytes after the complete `resPQ` TL object because
|
||||
live CDN replies can include random padding in the declared message length.
|
||||
|
||||
Protocol references: [handshake initiation](https://core.telegram.org/mtproto/auth_key),
|
||||
[obfuscated transports](https://core.telegram.org/mtproto/mtproto-transports),
|
||||
and [unencrypted messages](https://core.telegram.org/mtproto/description#unencrypted-message).
|
||||
Reference in New Issue
Block a user