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:
- 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:
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.
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-TLSport_name— nombre del puertoclient_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_domainenpersonal_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
Aún no hay comentarios.