github valnesfjord/tg-ws-proxy-rs v1.3.0

latest releases: v1.5.1, v1.5.0, v1.4.1...
one month ago

Что сделано (by @Lyedok, thanks)

В этом PR добавлена поддержка входящего FakeTLS (ee) на listener-стороне tg-ws-proxy-rs.

Раньше ee/FakeTLS уже частично был реализован в faketls.rs, но использовался только для upstream MTProto fallback, то есть на участке:

tg-ws-proxy-rs -> upstream MTProto proxy

При этом публичный listener по-прежнему принимал входящий клиентский трафик как обычный dd/padded MTProto:

Telegram client -> tg-ws-proxy-rs

На публичном домашнем IP такой входящий MTProto-трафик может быть виден DPI и блокироваться. Этот PR добавляет режим, в котором клиент подключается к tg-ws-proxy-rs через ee/FakeTLS, а backend остаётся прежним WSS к Telegram Web:

Telegram client
  -> ee FakeTLS
tg-ws-proxy-rs
  -> WSS/TLS
kws*.web.telegram.org

Основные изменения

  • Добавлен CLI/env-параметр:
    • --listen-faketls-domain <DOMAIN>
    • TG_LISTEN_FAKETLS_DOMAIN
  • Добавлена поддержка полного inbound-секрета вида:
    • ee<32-hex-key><domain_hex>
  • Генерация tg://proxy ссылки теперь использует:
    • dd<key> для обычного режима;
    • ee<key><domain_hex> при включённом inbound FakeTLS.
  • Listener теперь умеет:
    • принять TLS ClientHello от Telegram-клиента;
    • проверить FakeTLS HMAC;
    • проверить SNI;
    • отправить fake ServerHello/CCS/AppData;
    • извлечь 64-байтный MTProto init из TLS AppData;
    • передать поток дальше в существующий WSS backend.
  • Исправлен кейс, когда Telegram присылает в первом TLS AppData не только 64 байта init, но и начало payload. Эти лишние байты теперь буферизуются и не теряются.
  • Timeout входящего handshake переведён с warn на debug, потому что на публичном порту таймауты от сканеров/оборванных подключений являются ожидаемым шумом.

Docker

Добавлен минимальный multi-stage Dockerfile:

  • build stage: Rust/Alpine;
  • runtime stage: scratch;
  • статический musl binary;
  • CA certificates;
  • пользователь по умолчанию 1000:1000.

Итоговый образ получается около 2 MB вместо Debian-based runtime.

CI

Добавлен базовый GitHub Actions workflow:

  • cargo clippy --all-targets --locked
  • cargo test --locked
  • cargo build --release --locked
  • docker build

cargo fmt --check намеренно не включён, потому что текущий репозиторий целиком не отформатирован rustfmt, и такой чек завалит PR из-за существующих файлов. Это лучше делать отдельным formatting-only PR.

Тесты

Добавлены unit-тесты для:

  • FakeTLS ClientHello signing/parsing;
  • проверки SNI;
  • reject при неверном секрете;
  • структуры fake ServerHello;
  • parsing ee<key><domain_hex>;
  • генерации ee ссылки при --listen-faketls-domain;
  • regression-кейса с coalesced TLS AppData.

Don't miss a new tg-ws-proxy-rs release

NewReleases is sending notifications on new releases.