Zpět na domů

MTProto-proxy: osobní tajemství a politiky

Článek popisuje implementaci osobních MTProto-proxy na Erlang s unikátními SNI-doménami. Zahrnuje systém politik pro kontrolu přístupu, limitů připojení a analytiku uživatelů. Uvádí příklady konfigurace a kódu.

Osobní MTProto-proxy: Erlang a politika přístupu
Advertisement 728x90

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í:

Google AdInline article slot
  • 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:

Google AdInline article slot
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í.

Google AdInline article slot

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-TLS
  • port_name — název portu
  • client_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_domain v personal_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

Advertisement 728x90

Číst dál