Osobní MTProto proxy na Erlangu: systém politik a unikátní tajné klíče
MTProto proxy zajišťují přístup k Telegramu v podmínkách cenzury. Tradiční model používá jeden tajný klíč pro všechny uživatele, což vede k problémům: absence kontroly přístupu, nemožnost analýzy podle uživatelů a omezená monetizace. Řešením jsou osobní tajné klíče s unikátní SNI doménou pro každého klienta, implementované v Erlang mtproto_proxy prostřednictvím systému politik.
Tato implementace je škálovatelná díky O(1) validaci spojení a pravidlům konfigurovatelným za běhu. Podporuje omezení připojení, odvolání přístupu a sledování aktivity bez restartu serveru.
Výhody Erlangu pro vysoce vytížené proxy
Erlang/OTP je ideální pro MTProto proxy díky architektuře orientované na miliony dlouhodobých spojení:
- Izolace procesů: každé spojení je samostatný lehký proces (~2 KB). Pád jednoho neovlivní ostatní.
- Automatické škálování: BEAM distribuuje procesy na všechna jádra CPU bez ruční správy.
- Předběžné multitaskingové plánování: žádný klient nemůže monopolizovat jádro.
- Bit syntax pro parsování: bezpečný rozbor TLS ClientHello jedním řádkem:
parse_client_hello(
<<?TLS_REC_HANDSHAKE, ?TLS_10_VERSION, TlsFrameLen:16,
?TLS_TAG_CLIENT_HELLO, HelloLen:24, ?TLS_12_VERSION,
Random:32/binary,
SessIdLen, SessId:SessIdLen/binary,
CipherSuitesLen:16, CipherSuites:CipherSuitesLen/binary,
CompMethodsLen, CompMethods:CompMethodsLen/binary,
ExtensionsLen:16, Extensions:ExtensionsLen/binary>>
) when TlsFrameLen >= 512, HelloLen >= 508 -> ...
- Živý monitoring: vzdálená konzole pro inspekci tabulek a stavů.
- Horké aktualizace: změna kódu a konfigurace bez přerušení spojení.
Celkový objem kódu je 3500 řádků, což je méně než u většiny analogů.
SNI a formát fake-TLS tajných klíčů
Server Name Indication (SNI) umožňuje klientovi specifikovat doménu v ClientHello před dokončením TLS handshake. Fake-TLS napodobuje TLS 1.3 ClientHello s legitimním SNI, skrývajíc MTProto uvnitř šifrovaných polí.
Formát osobního tajného klíče:
0xEE | <16 náhodných bajtů> | <SNI doména v UTF-8>
Hexadecimální řetězec pro t.me/proxy:
ee<32 hex tokenů><hex-kódované SNI>
Validace: HMAC ClientHello se základním tajným klíčem (jeden na port). Unikátnost je určena SNI doménou z rozšíření.
Systém politik: pravidla přístupu
Politiky jsou seřazený seznam pravidel pro každé spojení. První nesplněné pravidlo odmítne připojení.
Typy pravidel
| Pravidlo | Popis |
|---------|----------|
| {in_table, Key, Table} | Klíč je v tabulce Table |
| {not_in_table, Key, Table} | Klíč není v tabulce Table |
| {max_connections, [Key,...], N} | Připojení podle klíčů ≤ N |
Klíče ze spojení
tls_domain— SNI z fake-TLSport_name— název portuclient_ipv4/client_ipv6— IP klienta{client_ipv4_subnet, Mask}— podsíť
Tabulky jsou hash tabulky v paměti, které se ukládají při přenačtení konfigurace a ztrácejí se při restartu.
Politika pro osobní proxy
Základní politika:
{policy, [
{in_table, tls_domain, personal_domains},
{max_connections, [tls_domain], 30}
]}
- Bílý seznam:
tls_domainvpersonal_domains. - Limit: ≤30 současných spojení na doménu (proti sdílení odkazů).
Doplňky:
{max_connections, [client_ipv4], 30},
{not_in_table, client_ipv4, ip4_blacklist}
Spuštění standardní osobní proxy
sys.config
{mtproto_proxy, [
{ports, [
#{name => mtp_handler,
listen_ip => "0.0.0.0",
port => 443,
secret => <<"d0d6e111bada5511fcce9584deadbeef">>,
tag => <<"dcbe8f1493fa4cd9ab300891c0b5b326">>}
]},
{allowed_protocols, [mtp_fake_tls]},
{policy, [
{in_table, tls_domain, personal_domains},
{max_connections, [tls_domain], 100}
]}
]}
Registrace domény
mtp_proxy eval '
mtp_policy_table:add(personal_domains, tls_domain, "alice42.example.com").'
Doména je aktivována okamžitě.
Co je důležité
- Osobní SNI domény zajišťují kontrolu přístupu a analýzu bez změny základního tajného klíče.
- Politiky jsou kontrolovány za O(1), škálují se na tisíce uživatelů.
- Erlang garantuje izolaci spojení a nulový výpadek.
- Tabulky politik jsou spravovány za běhu prostřednictvím Erlang RPC.
- Limit 30 spojení na doménu zabraňuje zneužívání.
— Editorial Team
Zatím žádné komentáře.