Powrót do strony głównej

MTProto-proxy: osobiste sekrety i polityki

Artykuł opisuje realizację osobistych MTProto-proxy na Erlang z unikalnymi domenami SNI. Omawiany jest system polityk do kontroli dostępu, limitów połączeń i analityki użytkowników. Podane są przykłady konfiguracji i kodu.

Osobiste MTProto-proxy: Erlang i polityka dostępu
Advertisement 728x90

Osobiste proxy MTProto w Erlangu: system polityk i unikalne sekrety

Proxy MTProto zapewniają dostęp do Telegrama w warunkach cenzury. Tradycyjny model wykorzystuje jeden tajny klucz dla wszystkich użytkowników, co prowadzi do problemów: brak kontroli dostępu, niemożność analityki na użytkownikach i ograniczona monetyzacja. Rozwiązaniem są osobiste sekrety z unikalną domeną SNI dla każdego klienta, zaimplementowane w Erlang mtproto_proxy poprzez system polityk.

Ta implementacja skaluje się dzięki walidacji połączeń O(1) i regułom konfigurowalnym w czasie rzeczywistym. Obsługiwane są ograniczenia połączeń, odwołanie dostępu i śledzenie aktywności bez restartu serwera.

Zalety Erlanga dla proxy o wysokim obciążeniu

Erlang/OTP jest idealny dla proxy MTProto dzięki architekturze zorientowanej na miliony długotrwałych połączeń:

Google AdInline article slot
  • Izolacja procesów: każde połączenie to osobny lekki proces (~2 KB). Upadek jednego nie wpływa na inne.
  • Automatyczne skalowanie: BEAM rozdziela procesy na wszystkie rdzenie CPU bez ręcznego zarządzania.
  • Wywłaszczające wielozadaniowości: żaden klient nie monopolizuje rdzenia.
  • Bit syntax do parsowania: bezpieczne parsowanie TLS ClientHello jedną linią:
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 -> ...
  • Monitorowanie na żywo: zdalna konsola do inspekcji tabel i stanów.
  • Gorące aktualizacje: zmiana kodu i konfiguracji bez zerwania połączeń.

Całkowita objętość kodu to 3500 linii, co jest mniej niż w większości analogów.

SNI i format sekretów fake-TLS

Server Name Indication (SNI) pozwala klientowi wskazać domenę w ClientHello przed zakończeniem uzgadniania TLS. Fake-TLS imituje TLS 1.3 ClientHello z legalnym SNI, ukrywając MTProto wewnątrz zaszyfrowanych pól.

Format osobistego sekretu:

Google AdInline article slot
0xEE | <16 losowych bajtów> | <domena SNI w UTF-8>

Hex-łańcuch dla t.me/proxy:

ee<32 hex token><hex-encoded SNI>

Walidacja: HMAC ClientHello z podstawowym sekretem (jeden na port). Unikalność – według domeny SNI z rozszerzenia.

System polityk: reguły dostępu

Polityki to uporządkowana lista reguł dla każdego połączenia. Pierwsza niespełniona reguła odrzuca połączenie.

Google AdInline article slot

Typy reguł

| Reguła | Opis |

|---------|----------|

| {in_table, Key, Table} | Key w tabeli Table |

| {not_in_table, Key, Table} | Key nieobecny w Table |

| {max_connections, [Key,...], N} | Połączeń według kluczy ≤ N |

Klucze z połączenia

  • tls_domain – SNI z fake-TLS
  • port_name – nazwa portu
  • client_ipv4/client_ipv6 – IP klienta
  • {client_ipv4_subnet, Mask} – podsieć

Tabele to hash-tabele w pamięci, zachowywane przy przeładowaniu konfiguracji, tracone przy restarcie.

Polityka dla osobistych proxy

Podstawowa polityka:

{policy, [
  {in_table, tls_domain, personal_domains},
  {max_connections, [tls_domain], 30}
]}
  • Biała lista: tls_domain w personal_domains.
  • Limit: ≤30 jednoczesnych połączeń na domenę (przeciwko udostępnianiu linków).

Dodatki:

{max_connections, [client_ipv4], 30},
{not_in_table, client_ipv4, ip4_blacklist}

Uruchomienie standardowego osobistego 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}
  ]}
]}

Rejestracja domeny

mtp_proxy eval '
  mtp_policy_table:add(personal_domains, tls_domain, "alice42.example.com").'

Domena aktywowana natychmiast.

Co jest ważne

  • Osobiste domeny SNI zapewniają kontrolę dostępu i analitykę bez zmiany podstawowego sekretu.
  • Polityki sprawdzane w O(1), skalowalne do tysięcy użytkowników.
  • Erlang gwarantuje izolację połączeń i zerowy czas przestoju.
  • Tabele polityk zarządzane w czasie rzeczywistym przez Erlang RPC.
  • Limit 30 połączeń na domenę zapobiega nadużyciom.

— Editorial Team

Advertisement 728x90

Czytaj dalej