Changelog¶
4.9.0¶
PROXY protocol v1/v2 listener support (#50).
- PROXY protocol — accept HAProxy PROXY protocol v1 (text) and v2 (binary) headers on client listeners. Required when running behind a load balancer (HAProxy, nginx, AWS NLB) that injects client IP. Enable with
--proxy-protocol(CLI),proxy_protocol = true(TOML), orPROXY_PROTOCOL=true(Docker). - Auto-detects v1 and v2 headers, extracts real client IP, re-checks IP ACLs against the real address.
- v2 LOCAL command accepted for load balancer health check probes.
- New Prometheus metrics:
teleproxy_proxy_protocol_connections_total,teleproxy_proxy_protocol_errors_total. - Fix auto-generated secret not written to TOML config —
start.shnow correctly stores the generated secret in the TOML config. - Documentation: complete SEO overhaul with per-page meta descriptions, OpenGraph tags, JSON-LD structured data, and robots.txt.
- Translations: Russian documentation now at 100% coverage, Farsi and Vietnamese expanded to 38%.
- TON wallet added as a donation option alongside Tribute.
4.8.0¶
DC health probes (#47).
- DC latency probes - periodic TCP handshake measurement to all 5 Telegram DCs, exposed as Prometheus histograms (
teleproxy_dc_latency_seconds), failure counters, and last-latency gauges. Helps operators diagnose slow downloads and pick optimal DC routing. - Disabled by default. Enable with
--dc-probe-interval 30(CLI),dc_probe_interval = 30(TOML), orDC_PROBE_INTERVAL=30(Docker env). - Probes run in the master process only. Completion is tracked via non-blocking poll to preserve sub-millisecond accuracy.
- Text stats endpoint includes per-DC latency, average, count, and failure fields.
4.7.0¶
Per-secret quotas, unique-IP limits, and expiration (#26).
- Data quota — cap total bytes transferred per secret; active connections are closed and new ones rejected when exhausted. Configurable in bytes or human-readable sizes (
quota = "10G") - Unique IP limit — cap how many distinct client IPs can use a secret simultaneously (
max_ips = 5). Additional connections from an already-connected IP are always allowed - Secret expiration — auto-disable a secret after a timestamp (
expires = 2025-12-31T23:59:59Z). Existing connections continue; only new ones are rejected - Per-reason rejection counters in Prometheus and plain-text stats (
rejected_quota,rejected_ips,rejected_expired) - Docker env vars:
SECRET_QUOTA_N,SECRET_MAX_IPS_N,SECRET_EXPIRES_N - SOCKS5 upstream proxy support (#22)
- One-click cloud deploy page
- Documentation: install/upgrade instructions, SOCKS5 docs, Observatory link
4.6.0¶
DPI resistance and operational improvements.
- ServerHello size variation widened from ±1 to ±32 bytes, mimicking the natural variation in certificate chain and session ticket sizes seen from real TLS servers
- ServerHello fragmentation: ServerHello and CCS+AppData are now sent as separate TCP segments, defeating DPI that pattern-matches the full handshake response in a single packet
- Docker healthcheck respects custom
STATS_PORT— previously hardcoded to 8888, now uses${STATS_PORT:-8888}(#38) install.shsupports multiple secrets via comma-separatedSECRETor numberedSECRET_Nvariables/linkendpoint serves connection links as HTML pages with scannable QR codes
New documentation: DPI Resistance — covers server-side mitigations, recommended setup, and client-side bypass tools.
Client-side detection
The primary detection vector for MTProxy fake-TLS in Russia is the Telegram client's TLS fingerprint, which cannot be fixed server-side. Telegram Desktop fixed several fingerprint artifacts; keep clients updated. For affected networks, client-side bypass tools like zapret and GoodbyeDPI can help.
4.5.0¶
QR codes for connection links.
teleproxy linksubcommand prints a proxy URL and renders a scannable QR code in the terminal using UTF-8 half-block characters- Docker
start.shandinstall.shnow display QR codes automatically at startup — point a phone camera at the screen to connect - Vendored nayuki/QR-Code-generator (MIT) for zero-dependency QR rendering on any platform
- E2E tests decode the rendered QR output with pyzbar and verify it matches the expected URL
- Documentation: new "Connection Links" page (en + ru)
4.4.0¶
teleproxy checkdiagnostic subcommand — validates configuration and tests connectivity before accepting clients. Checks DC reachability, NTP clock drift, fake-TLS domain probe, and SNI/DNS mismatch. Exit 0/1/2 for pass/fail/bad-args.
4.3.0¶
Direct mode connection resilience.
- IPv6 auto-detection: probe at startup, enable without
-6if reachable - Multiple addresses per DC with synchronous failover on connect failure
- Connection retry with exponential backoff (200ms–800ms, 3 attempts)
--dc-override dc_id:host:portto add or replace DC addresses (repeatable). Docker:DC_OVERRIDE=2:1.2.3.4:443,2:5.6.7.8:443- New stat:
direct_dc_retries/teleproxy_direct_dc_retries_total
4.2.1¶
- Fix aarch64 build: remove unused x86-only
sys/io.hinclude - Add native ARM64 glibc build to CI (catches platform-specific issues masked by Alpine/musl)
4.2.0¶
--stats-allow-net CIDRflag to extend stats endpoint access beyond RFC1918 ranges (repeatable). Docker:STATS_ALLOW_NET=100.64.0.0/10,fd00::/8
4.1.0¶
MTProto transport protocol compliance improvements.
- Detect and log transport error codes (-404, -429, etc.) from DCs in direct mode
- Detect transport error codes in medium mode client parse path
- Track quick ACK packets with
teleproxy_quickack_packets_totalcounter - Track transport errors with
teleproxy_transport_errors_totalcounter
4.0.0¶
Rebrand to Teleproxy. Binary renamed from mtproto-proxy to teleproxy.
- Binary name:
teleproxy(wasmtproto-proxy) - Prometheus metrics prefix:
teleproxy_(wasmtproxy_) - Docker user/paths:
/opt/teleproxy/(was/opt/mtproxy/) - Environment variables:
TELEPROXY_*(oldMTPROXY_*still accepted with deprecation warning) - Docker image includes backward-compat symlink
mtproto-proxy -> teleproxy - CLI flags and behavior unchanged