Telegram Messenger tiene soporte para diferentes tipos de servidores proxy: un servidor proxy SOCKS5 estándar y un servidor proxy MTProto.

En este tutorial aprenderemos a construir un servidor proxy MTProto. Este estilo de proxy puede ayudarte a evitar la censura en ciertos países.

A continuación aprenderemos a crear un servidor proxy MTProto que implemente el protocolo TLS falso en el mismo host que el servidor web.

Requisitos básicos

Para hacer este tutorial necesitaremos un servidor cloud o VPS que disponga de IP de un país el cual Telegram no se encuentre bloqueado.

Este tutorial lo realizaremos con Debian 12, pero se puede usar con diferentes distribuciones de GNU/Linux basadas en Debian.

Necesitaremos también acceso root completo por SSH. Además, también necesitaremos un nombre de dominio que apunte al servidor.

Paso 1: Conectarse al servidor

Lo primero que haremos será conectarnos al servidor. Para ello usaremos SSH y el usuario root. Para conectarnos ejecutaremos lo siguiente:

ssh root@[IP_SERVIDOR]

Con esto, después de introducir la contraseña, ya estaremos conectados al servidor.

root@proxy:~# 

Paso 2: Configurar el Firewall de tu servidor

Muchos proveedores de servidores disponen de un Firewall, en este cortafuegos tendremos que configurarlo de manera que tengamos los siguientes puertos habilitados:

Puerto Uso
22/tcp Acceso SSH, puedes configurar otro si quieres
443/tcp Acceso HTTPS y de MTProto

Paso 3: Instalación de Nginx

Instalamos ahora Nginx, para ello ejecutamos el siguiente comando:

apt install nginx

Luego editamos /etc/nginx/sites-enabled/default y añadimos el server_name con nuestro dominio:

server_name proxy.voidnull.es;

Guardamos y recargamos Nginx:

systemctl reload nginx

Paso 4: Instalación del SSL

Ahora creamos el certificado SSL con Let's Encrypt siguiendo este otro tutorial:

Cómo utilizar Certbot para configurar un SSL de Let’s Encrypt en GNU/Linux
Certbot es una maravillosa herramienta que puedes utilizar para generar un certificado SSL con Let’s Encrypt e instalarlo y configurar automáticamente en tu servidor web.

Paso 5: Instalación del lenguaje Go

Para instalar el lenguaje Go en nuestro servidor, deberemos de seguir este otro tutorial que explica el proceso detalladamente:

Cómo instalar Go (GoLang) en GNU/Linux
Go, también conocido como GoLang, es un lenguaje de programación. Es de código abierto desarrollado por un equipo de Google y muchos otros colaboradores de la comunidad.

Paso 6: Instalación de Mtg

Ahora tendremos que descargar el repositorio donde se encuentra el Proxy MTProto, así que tendremos que tener instalado Git:

apt install git

Y luego descargamos el repositorio:

git clone https://github.com/9seconds/mtg.git

Accedemos al directorio creado:

cd mtg

Y compilamos el código con Go:

go build

Salida del comando

go build

go: downloading github.com/alecthomas/kong v0.6.1
go: downloading github.com/rs/zerolog v1.27.0
go: downloading github.com/yl2chen/cidranger v1.0.2
go: downloading github.com/OneOfOne/xxhash v1.2.8
go: downloading github.com/tylertreat/BoomFilters v0.0.0-20210315201527-1a82519a3e43
go: downloading github.com/alecthomas/units v0.0.0-20211218093645-b94a6e3cc137
go: downloading github.com/pelletier/go-toml v1.9.5
go: downloading github.com/panjf2000/ants/v2 v2.5.0
go: downloading github.com/babolivier/go-doh-client v0.0.0-20201028162107-a76cff4cb8b6
go: downloading github.com/txthinking/socks5 v0.0.0-20220615051428-39268faee3e6
go: downloading golang.org/x/sys v0.0.0-20220804214406-8e32c043e418
go: downloading github.com/prometheus/client_golang v1.13.0
go: downloading github.com/smira/go-statsd v1.3.2
go: downloading github.com/mattn/go-colorable v0.1.12
go: downloading golang.org/x/crypto v0.0.0-20220722155217-630584e8d5aa
go: downloading github.com/patrickmn/go-cache v2.1.0+incompatible
go: downloading github.com/txthinking/runnergroup v0.0.0-20220212043759-8da8edb7dae8
go: downloading github.com/txthinking/x v0.0.0-20210326105829-476fab902fbe
go: downloading github.com/beorn7/perks v1.0.1
go: downloading github.com/cespare/xxhash/v2 v2.1.2
go: downloading github.com/golang/protobuf v1.5.2
go: downloading github.com/prometheus/client_model v0.2.0
go: downloading github.com/prometheus/common v0.37.0
go: downloading github.com/prometheus/procfs v0.8.0
go: downloading google.golang.org/protobuf v1.28.1
go: downloading github.com/mattn/go-isatty v0.0.14
go: downloading github.com/matttproud/golang_protobuf_extensions v1.0.1

Copiamos el ejecutable compilado a la siguiente ruta:

cp mtg /usr/local/bin

Paso 7: Generando la configuración del Proxy

Tendremos que generar un código que usaremos luego para conectarnos, para ello deberemos de escribir este comando con nuestro dominio:

mtg generate-secret proxy.voidnull.es

Obtendremos un código, deberemos de guardarlo para más tarde.

Creamos el fichero /etc/mtg.toml con el siguiente contenido:

secret = "[EL CODIGO QUE HEMOS GENERADO ANTES]"
bind-to = "0.0.0.0:443"
concurrency = 1024
domain-fronting-port = 8443

Paso 8: Crear un servicio para SystemD

Para poder gestionar el servicio más fácilmente, lo que haremos será configurar un servicio de SystemD, creamos el fichero /usr/lib/systemd/system/mtg.service

[Unit]
Description=mtg - MTProto proxy server
Documentation=https://github.com/9seconds/mtg
After=network.target

[Service]
ExecStart=/usr/local/bin/mtg run /etc/mtg.toml
Restart=always
RestartSec=3
DynamicUser=true
AmbientCapabilities=CAP_NET_BIND_SERVICE

[Install]
WantedBy=multi-user.target

Y lo iniciamos:

systemctl daemon-reload
systemctl enable mtg
systemctl start mtg

Servicio levantado

# systemctl status mtg
● mtg.service - mtg - MTProto proxy server
Loaded: loaded (/etc/systemd/system/mtg.service; enabled; preset: enabled)
Active: active (running) since Sat 2024-03-23 21:50:55 CET; 5min ago
Docs: https://github.com/9seconds/mtg
Main PID: 859 (mtg)
Tasks: 15 (limit: 2307)
Memory: 13.7M
CPU: 113ms
CGroup: /system.slice/mtg.service
└─859 /usr/local/bin/mtg run /etc/mtg.toml

Mar 23 21:50:55 proxy systemd[1]: Started mtg.service - mtg - MTProto proxy server.

Paso 9: Conectarse al Proxy desde Telegram

Para conectarnos, deberemos primero de generar un enlace para conectarnos, para ello ejecutaremos el siguiente comando:

mtg access /etc/mtg.toml

Y obtendremos una respuesta similar a esta:

{
  "ipv4": {
    "ip": "XX.XX.XX.XX",
    "port": 443,
    "tg_url": "tg://proxy?port=443&secret=7uD1GulbFgXXXXXXXXX91ZA&server=XX.XX.XX.XX",
    "tg_qrcode": "https://api.qrserver.com/v1/create-qr-code?data=tg%3A%2F%2Fproxy%3Fport%3D443%26secret%3D7uD1GuxXXXXXXXXXG91ZA%26server%3DXX.XX.XX.XX&format=svg&qzone=4",
    "tme_url": "https://t.me/proxy?port=443&secret=7uD1GulbXXXXXXXXXXXXbG91ZA&server=XX.XX.XX.XX",
    "tme_qrcode": "https://api.qrserver.com/v1/create-qr-code?data=https%3A%2F%2Ft.me%2Fproxy%3Fport%3D443%26secret%3D7uDXXXXP9f9auvpwcm94eXXXXXXXXXXX1ZA%26server%3DXX.XX.XX.XX&format=svg&qzone=4"
  },
  "secret": {
    "hex": "eee0f51ae95b160c447881cfXXX617272656c2e636c6f7564",
    "base64": "7uXXXXXXXXXXwcm94eS5hcnJlbC5jbG91ZA"
  }
}

Ahora podremos obtener el enlace tg_url y abrirlo desde Telegram y nos aparecerá lo siguiente para conectarnos:

Le hacemos a Conecta al servidor y nos aparecerá un aviso donde nos avisa de que estamos conectados al Proxy. En este punto todos los datos de Telegram pasarán por ese servidor.

Haz que cada palabra cuente: tu donación nos inspira a seguir creando contenido. Accede al apartado de Donación para hacer tu aportación