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ń:
- 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:
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.
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-TLSport_name– nazwa portuclient_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_domainwpersonal_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
Brak komentarzy.