Zurück zur Startseite

MTProto-Proxy: persönliche Geheimnisse und Richtlinien

Der Artikel beschreibt die Implementierung persönlicher MTProto-Proxies auf Erlang mit eindeutigen SNI-Domains. Er behandelt das Richtliniensystem für Zugriffskontrolle, Verbindungsbeschränkungen und Benutzeranalysen. Beispiele für Konfiguration und Code werden bereitgestellt.

Persönliche MTProto-Proxies: Erlang und Zugriffsrichtlinie
Advertisement 728x90

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:

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

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

Google AdInline article slot

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-TLS
  • port_name — Port-Name
  • client_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_domain in personal_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

Advertisement 728x90

Weiterlesen