Persönliche MTProto-Proxys mit Erlang: Policy-System und individuelle Secrets
MTProto-Proxys ermöglichen den Zugang zu Telegram unter Zensur. Das traditionelle Modell nutzt einen einzigen Secret-Key für alle Nutzer, was zu Problemen führt: fehlende Zugriffskontrolle, keine Analyse der Nutzeraktivität und eingeschränkte Monetarisierung. Die Lösung sind persönliche Secrets mit einer eindeutigen SNI-Domain für jeden Client, implementiert in Erlang mtproto_proxy über ein Policy-System.
Diese Implementierung skaliert durch O(1)-Verbindungsvalidierung und zur Laufzeit konfigurierbare Regeln. Sie unterstützt Verbindungslimits, Zugriffswiderruf und Aktivitätsverfolgung ohne Server-Neustart.
Vorteile von Erlang für Hochlast-Proxys
Erlang/OTP ist ideal für MTProto-Proxys dank seiner Architektur, die für Millionen langlebiger Verbindungen ausgelegt ist:
- Prozessisolierung: Jede Verbindung ist ein separater Leichtgewichtsprozess (~2 KB). Ein Absturz beeinflusst andere nicht.
- Automatische Skalierung: BEAM verteilt Prozesse auf alle CPU-Kerne ohne manuelle Verwaltung.
- Präemptives Multitasking: Kein einzelner Client kann einen Kern monopolisieren.
- Bit-Syntax für Parsing: Sicheres Parsen von TLS ClientHello in einer Zeile:
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 -> ...
- Live-Monitoring: Remote-Konsole zur Inspektion von Tabellen und Zuständen.
- Hot Updates: Änderungen am Code und der Konfiguration ohne Unterbrechung von Verbindungen.
Der Gesamtcode umfasst 3500 Zeilen, weniger als die meisten Alternativen.
SNI und Fake-TLS Secret-Format
Server Name Indication (SNI) erlaubt einem Client, eine Domain im ClientHello vor Abschluss des TLS-Handshakes anzugeben. Fake-TLS imitiert TLS 1.3 ClientHello mit einer legitimen SNI und versteckt MTProto in verschlüsselten Feldern.
Persönliches Secret-Format:
0xEE | <16 zufällige Bytes> | <SNI-Domain in UTF-8>
Hex-String für t.me/proxy:
ee<32 hex token><hex-kodierte SNI>
Validierung: HMAC ClientHello mit einem Basis-Secret (eines pro Port). Die Eindeutigkeit basiert auf der SNI-Domain aus der Erweiterung.
Policy-System: Zugriffsregeln
Policies sind eine geordnete Liste von Regeln für jede Verbindung. Die erste nicht erfüllte Regel lehnt die Verbindung ab.
Regeltypen
| Regel | Beschreibung |
|------|-------------|
| {in_table, Key, Table} | Key ist in Table |
| {not_in_table, Key, Table} | Key ist nicht in Table |
| {max_connections, [Key,...], N} | Verbindungen pro Keys ≤ N |
Keys aus der Verbindung
tls_domain— SNI aus Fake-TLSport_name— Port-Nameclient_ipv4/client_ipv6— Client-IP{client_ipv4_subnet, Mask}— Subnetz
Tabellen sind In-Memory-Hash-Tabellen, gespeichert beim Neuladen der Konfiguration, verloren beim Neustart.
Policy für persönliche Proxys
Basis-Policy:
{policy, [
{in_table, tls_domain, personal_domains},
{max_connections, [tls_domain], 30}
]}
- Whitelist:
tls_domaininpersonal_domains. - Limit: ≤30 gleichzeitige Verbindungen pro Domain (verhindert Link-Sharing).
Ergänzungen:
{max_connections, [client_ipv4], 30},
{not_in_table, client_ipv4, ip4_blacklist}
Starten eines Standard-Personal-Proxys
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}
]}
]}
Domain-Registrierung
mtp_proxy eval '
mtp_policy_table:add(personal_domains, tls_domain, "alice42.example.com").'
Domain wird sofort aktiv.
Wichtige Punkte
- Persönliche SNI-Domains ermöglichen Zugriffskontrolle und Analysen ohne Änderung des Basis-Secrets.
- Policies werden in O(1) geprüft, skalieren auf Tausende Nutzer.
- Erlang gewährleistet Verbindungsisolierung und Null-Ausfallzeit.
- Policy-Tabellen werden zur Laufzeit über Erlang RPC verwaltet.
- Ein 30-Verbindungs-Limit pro Domain verhindert Missbrauch.
— Editorial Team
Noch keine Kommentare.