Volver al inicio

MTProto proxy: secretos y políticas personales

El artículo describe la implementación de proxies MTProto personales en Erlang con dominios SNI únicos. Cubre el sistema de políticas para control de acceso, límites de conexiones y analíticas de usuario. Se proporcionan ejemplos de configuración y código.

Proxies MTProto Personales: Erlang y Política de Acceso
Advertisement 728x90

Proxies MTProto Personales en Erlang: Sistema de Políticas y Secretos Únicos

Los proxies MTProto permiten acceder a Telegram bajo censura. El modelo tradicional utiliza una única clave secreta para todos los usuarios, lo que genera problemas: falta de control de acceso, incapacidad para analizar la actividad del usuario y monetización limitada. La solución son secretos personales con un dominio SNI único para cada cliente, implementado en Erlang mtproto_proxy mediante un sistema de políticas.

Esta implementación escala mediante validación de conexión O(1) y reglas configurables en tiempo de ejecución. Admite límites de conexión, revocación de acceso y seguimiento de actividad sin reiniciar el servidor.

Ventajas de Erlang para Proxies de Alta Carga

Erlang/OTP es ideal para proxies MTProto debido a su arquitectura diseñada para millones de conexiones de larga duración:

Google AdInline article slot
  • Aislamiento de procesos: Cada conexión es un proceso ligero separado (~2 KB). Un fallo en uno no afecta a los demás.
  • Escalado automático: BEAM distribuye los procesos entre todos los núcleos de la CPU sin gestión manual.
  • Multitarea preventiva: Ningún cliente puede monopolizar un núcleo.
  • Sintaxis de bits para análisis: Análisis seguro de TLS ClientHello en una línea:
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 -> ...
  • Monitorización en vivo: Consola remota para inspeccionar tablas y estados.
  • Actualizaciones en caliente: Cambiar código y configuración sin interrumpir conexiones.

El volumen total de código es de 3500 líneas, menos que la mayoría de las alternativas.

Formato SNI y Secreto Fake-TLS

Server Name Indication (SNI) permite que un cliente especifique un dominio en ClientHello antes de completar el protocolo de enlace TLS. Fake-TLS imita TLS 1.3 ClientHello con un SNI legítimo, ocultando MTProto dentro de campos cifrados.

Formato del secreto personal:

Google AdInline article slot
0xEE | <16 bytes aleatorios> | <dominio SNI en UTF-8>

Cadena hexadecimal para t.me/proxy:

ee<32 token hexadecimal><SNI codificado en hexadecimal>

Validación: HMAC ClientHello con un secreto base (uno por puerto). La unicidad se basa en el dominio SNI de la extensión.

Sistema de Políticas: Reglas de Acceso

Las políticas son una lista ordenada de reglas para cada conexión. La primera regla no cumplida rechaza la conexión.

Google AdInline article slot

Tipos de Reglas

| Regla | Descripción |

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

| {in_table, Key, Table} | La clave está en la tabla |

| {not_in_table, Key, Table} | La clave no está en la tabla |

| {max_connections, [Key,...], N} | Conexiones por claves ≤ N |

Claves de la Conexión

  • tls_domain — SNI de fake-TLS
  • port_name — nombre del puerto
  • client_ipv4/client_ipv6 — IP del cliente
  • {client_ipv4_subnet, Mask} — subred

Las tablas son tablas hash en memoria, guardadas al recargar la configuración, perdidas al reiniciar.

Política para Proxies Personales

Política básica:

{policy, [
  {in_table, tls_domain, personal_domains},
  {max_connections, [tls_domain], 30}
]}
  • Lista blanca: tls_domain en personal_domains.
  • Límite: ≤30 conexiones simultáneas por dominio (evita compartir enlaces).

Adiciones:

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

Lanzamiento de un Proxy Personal Estándar

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}
  ]}
]}

Registro de Dominio

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

El dominio se activa al instante.

Puntos Clave

  • Los dominios SNI personales permiten control de acceso y análisis sin cambiar el secreto base.
  • Las políticas se verifican en O(1), escalando a miles de usuarios.
  • Erlang garantiza aislamiento de conexiones y tiempo de inactividad cero.
  • Las tablas de políticas se gestionan en tiempo de ejecución mediante Erlang RPC.
  • Un límite de 30 conexiones por dominio previene abusos.

— Editorial Team

Advertisement 728x90

Leer después