Releases: teleproxy/teleproxy
Releases · teleproxy/teleproxy
Release list
v4.16.1
- Add bounded per-secret JA4 distributions alongside the global ClientHello
counter. Each worker keeps the top four HMAC-matched fingerprints per secret
and exposes them assecret_<label>_ja4_seen<TAB><hash><TAB><N>in/stats
andteleproxy_secret_ja4_seen{secret="...",hash="..."}in/metrics.
Unmatched ClientHellos remain visible in the existing global top-32 counter.
v4.16.0
- Fix high idle CPU usage with worker processes (#129). The master now enters
the normal epoll sleep path when there are no active special connections
instead of waking every 1-2 ms merely because workers are configured. - Replace legacy
__synccompare-and-swap operations with portable
__atomic_compare_exchange_ncalls and linklibatomicon Linux (#131).
This fixes ARM64 builds where 16-byte compare-and-swap is not lock-free. - Accept TLS 1.3 camouflage backends that omit the optional compatibility
ChangeCipherSpec record (#105). Startup probing andteleproxy checknow
handle both valid ServerHello layouts. - Add a complete native TOML configuration reference with defaults, examples,
reload behavior, fake-TLS backends, secret limits, ACLs, and DC overrides
(#108). - Clarify that
/statsand/linkdeliberately return 404 outside their
allowlist, publish Docker's stats port on loopback by default, and document
SSH-tunnel access (#127). - Correct SOCKS5 documentation and examples: upstream SOCKS5 routing requires
direct-to-DC mode (#123).
v4.15.0
- Expose ClientHello JA4 fingerprint distribution on
/statsand/metrics
(#102, follow-up to #39 / #101). Every well-formed ClientHello reaching
the proxy — including HMAC failures from TSPU probes — is hashed per the
foxio JA4 spec and rolled into a top-32 counter per worker, surfaced as
ja4_seen<TAB><hash><TAB><N>lines in/statsand as
teleproxy_ja4_seen{hash="..."}samples in/metrics. Always on, zero
configuration. Optional[stats] ja4_log = true(--ja4-log/
JA4_LOG=true) printsja4=<hash> sni=<name>per connection at verbose
level 2 for one-off investigations. Lets operators see which JA4 a new
TSPU signature is targeting instead of inferring from user reports.
v4.14.1
- Fix macOS backend-forward path. Backend forwarding (the camouflage fallback
for invalid handshakes — wrong secret, stale timestamp, unknown SNI,
duplicate client_random, plain HTTPS probes) silently dropped every
request on macOS native builds:writev()to a freshly opened outbound
socket whoseconnect()was still inEINPROGRESSreturnsENOTCONN
on BSD/Darwin where Linux returnsEAGAIN. The proxy treated anything
other thanEAGAIN/EINTRas fatal and tore down the connection
before the SYN-ACK arrived. Now treatsENOTCONNas a retry condition
too. Five fake-TLS E2E tests (test_wrong_secret_rejected,
test_stale_timestamp_rejected,test_unknown_sni_falls_back,
test_duplicate_client_random_rejected,test_browser_tls_sees_real_backend)
now pass on the macOS dev build alongside Linux. - New
mss_clampTOML key +--no-mss-clampCLI flag +MSS_CLAMP=false
env var to disable the automatic ClientHello fragmentation shipped in
v4.14.0. Default stays on. Useful escape hatch for bandwidth-bound
operators willing to take the JA4 detection risk in exchange for ~5×
lower packet count on the proxy listener.
v4.14.0
- Automatic ClientHello fragmentation against TSPU JA4 fingerprinting (#39).
The MTProxy listening socket now announces a 256-byte TCP MSS in the SYN-ACK,
forcing the client kernel to chop its outgoing ClientHello across 2-3 TCP
segments. ALPN and signature_algorithms — required inputs to JA4 — land in
segments 2/3, so a single-packet JA4 extractor computes the wrong hash and
the connection slips past the signature. No configuration; no client change
required. The HTTP/statsand/metricslistener keeps the system default
MSS. Trade-off: Linux caps server→client segments at the same MSS, raising
packet count ~5× and TCP/IP header overhead from ~3% to ~15% on the proxy
listener — measurable on bandwidth-saturated deployments but well within
the timeout of the existing 20MB MTProto E2E test.
v4.13.0
- Wildcard certificate support in fake-TLS mode (#44).
-D '*.example.com:backend:443'
matches any single-label subdomain ofexample.comagainst the configured
SNI pattern (RFC 6125), fixing the failure mode where operators with a
*.example.comcert saw fake-TLS traffic land on nginx's default vhost.
Fingerprinting probes the backend host, not the literal*.example.com.
Same bug filed against mtg as 9seconds/mtg#394; teleproxy is now the first
MTProxy implementation to handle wildcards. - New
CONFIG_DOWNLOAD_PROXYenv var routes theproxy-multi.confdownload
through an outbound HTTP/SOCKS proxy (#61). Useful whencore.telegram.org
is unreachable directly from the host. Defaults toSOCKS5_PROXYwhen
unset, so a single knob can cover both DC routing and config refresh. - New
EE_BACKENDenv var splits the fake-TLS SNI domain (EE_DOMAIN) from
the actual camouflage backend (#62). Avoids the/etc/hostsworkaround for
local backends, and supports unix sockets (EE_BACKEND=unix:/run/nginx.sock)
for nginx fronts. Configurable in TOML as
domain = [{ name = "...", backend = "..." }]. - Fix pre-handshake sockets accumulating as
total_connectionsuntil OS-level
TCP keepalive killed them ~2 hours later (#63). The 10-second handshake
alarm intcp_rpcs_ext_alarm/tcp_rpcs_ext_drs_alarmnow drops the
socket instead of no-opping when fake-TLS isn't configured. Visible on
busy public proxies as a hightotal_connectionsgauge that didn't track
authenticated user count, especially under random-padding (dd) mode where
scanners and probes get accepted but never complete obfs2. - New
make test-handshake-timeoutregression test asserts
total_connectionsreturns to baseline within 15 seconds of opening junk
sockets. - Document direct-mode limitations (#79). The
--directpage now spells out
what skipping Telegram's middle-end trades away: media on non-Premium
accounts may not load, sponsored channels aren't delivered, and voice/video
calls aren't carried by any MTProto proxy regardless of mode. Answers the
recurring symptom reported in #60. - Memory-handling robustness in
src/common/common-stats.cand assorted free
paths (#84, #85, #82).cppcheck --check-level=exhaustivefindings are now
gated in CI (#78) so future OOM-path regressions surface before merge.
v4.12.2
Build hygiene. No runtime changes.
- Compile cleanly with
make CC=clangon x86_64 (#68). Adds_mm_*
intrinsic shims for the GCC-only__builtin_ia32_*names used in
src/common/crc32.c, gated to x86 so Apple Silicon clang isn't
affected. - New
build-clangjob in the CI matrix exercises the clang x86_64
build path so future regressions surface in CI rather than only in
third-party packaging (#72).
v4.12.1
Hotfix for log spam introduced in 4.12.0.
- Fix
WARNING: IP tracking table full for secret 0flooding docker logs
on busy plain secrets (#71). The 4.12.0 fix for #70 made every secret
populate a fixed-size 256-entry per-IP table, which overflows on any
proxy serving more than ~256 distinct source IPs since startup. Plain
secrets (nomax_ips, norate_limit) now bypass the precise tracking
table entirely and feed the cumulativeteleproxy_secret_unique_ips
counter from a per-secret Bloom filter — bounded memory, no overflow. - For limit-bearing secrets where the table can still legitimately fill
ifmax_ipsexceeds 256, throttle the warning to once per minute per
slot and include the secret label and a remediation hint.
v4.12.0
Bug fixes for Docker deployments and per-secret metrics.
- Fix
teleproxy_secret_unique_ipsalways reporting 0 (#70). The counter was
only incremented when a secret hadmax_ipsorrate_limitconfigured;
plain secrets are now tracked too. - Clarify
teleproxy_secret_bytes_received_total/_sent_totalHELP text:
"received" is uploads (proxy from clients), "sent" is downloads (proxy to
clients). The counters are direct-mode only; relay-mode aggregation is a
separate gap, tracked for a follow-up. - Change
teleproxy_secret_unique_ipsTYPE fromgaugetocounterto
match its actual cumulative behaviour. - Fix Docker
SECRET=hex:label,hex:labelwriting the entire string as the
TOMLkeyinstead of splitting label off (#67). The numbered-secret path
(SECRET_LABEL_N) was already correct. - Add
EXTERNAL_PORTenv var for advertising a different port in the
connection link than the internal listen port (#66) — needed when Docker
maps-p 4443:443. Also added a matchingexternal_portTOML option,
consumed by the/linkHTML page andteleproxy linkURL builder.
v4.11.0
SOCKS5 upstream support in check command (#57), Cloudflare Spectrum docs (#55).
teleproxy checknow routes DC probes through the configured SOCKS5 proxy.
New--socks5 URLCLI flag; also reads from TOML config.- Handle buffer allocation failures gracefully instead of crashing (#58).
- Fix PROXY protocol metrics always reporting 0 in multi-worker mode (#53).
- New deployment guide: Cloudflare Spectrum.