Что сделано (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 --lockedcargo test --lockedcargo build --release --lockeddocker 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.