Skip to content

Instantly share code, notes, and snippets.

@davilico05
Last active March 28, 2024 14:42
Show Gist options
  • Select an option

  • Save davilico05/424b1f371c285783d1c28cae2d4c7c36 to your computer and use it in GitHub Desktop.

Select an option

Save davilico05/424b1f371c285783d1c28cae2d4c7c36 to your computer and use it in GitHub Desktop.
Proxy Telegram Self-Hosted - MTProxy

Cómo desplegar MTProxy en un servidor VPS propio

Vámos a utilizar el protocolo de proxy oficial de Telegram y la configuración nativa de la app de Telegram.

Actualmente la guía oficial presenta un problema de compilación en el README oficial TelegramMessenger/MTProxy pero siguiendo esta guía conseguirá sortear el problema que se encuentra solucionado en una issue del repositiorio oficial.

1. Instalación

1.1. Instancie una máquina con Ubuntu 22.04 o Debian 11/12. Conectese por ssh a la máquina:

ssh root@xx.xx.xx.xx

1.2. Actualice los repositorios:

apt update && apt upgrade -y

1.3. Instale las dependencias necesarias para compilar el binario:

apt install git curl build-essential libssl-dev zlib1g-dev

1.4. Clone el repositiorio oficial de MTProxy:

git clone https://github.com/TelegramMessenger/MTProxy
cd MTProxy

1.5. Modifique el fichero Makefile

nano Makefile

1.6. Busque la linea CFLAGS (línea 15) y añada al final de la misma -fcommon, quedando así:

CFLAGS = $(ARCH) -O3 -std=gnu11 -Wall [.......] -D_FILE_OFFSET_BITS=64 -fcommon

1.7. Salga con CRTL + X y confirme con Y + Intro

1.8. Proceda a compilar el binario

make && cd objs/bin

Asegurese de que se compila sin errores

1.9. Descargue el secreto de Telegram que se utiliza para conectarse a los servidores de Telegram:

curl -s https://core.telegram.org/getProxySecret -o proxy-secret

1.10. Descargue la configuración actual de Telegram. El GitHub de Telegram especifica que se actualice diariamente, así que configuraremos un cron para hacerlo más tarde.

curl -s https://core.telegram.org/getProxyConfig -o proxy-multi.conf

1.11. Genere un secreto de 16 caracteres que usará para autenticar a los usuarios con su servidor proxy

head -c 16 /dev/urandom | xxd -ps

Obtendrá algo como esto:

c4f0ac142375049d2980ed29b3233874

1.12. Pruebe la configuración ejecutando MTProxy desde la CLI.

./mtproto-proxy -u nobody -p 8888 -H 443 -S <secret> --aes-pwd proxy-secret proxy-multi.conf -M 1

Instrucciones del GitHub oficial:

  • nobody es el usuario. mtproto-proxy llama a la función setuid() para eliminar los privilegios.
  • 443 es el puerto utilizado por los clientes para conectarse al proxy.
  • 8888 es el puerto local. Puede usarlo para obtener estadísticas de mtproto-proxy. Ej: wget localhost:8888/stats. Solo puede obtener esta estadística en local. No abras ese puerto en el firewall
  • <secret> ss el secreto generado en el paso 3. También puedes establecer varios secretos para distintos usuarios: -S <secret1> -S <secret2>.
  • proxy-secret y proxy-multi.conf se obtienen en los pasos 9 y 10.
  • 1 ss el número de workers. Puede aumentar el número de workers, si tiene un servidor potente o espera recibir mucho tráfico.

Un ejemplo de configuración simple seria el siguiente:

./mtproto-proxy -u nobody -p 8888 -H 443 -S c4f0ac142375049d2980ed29b3233874 --aes-pwd proxy-secret proxy-multi.conf -M 1

Un ejemplo de configuración con varios secretos seria el siguiente:

./mtproto-proxy -u nobody -p 8888 -H 443 -S c4f0ac142375049d2980ed29b3233874 -S 049d2980edc4f0ac14237529b3233874 --aes-pwd proxy-secret proxy-multi.conf -M 1

⚠️ No utilice ningun secreto especificado en este gist. Genere los suyos propios por seguridad.

1.13. Al ejecutar el servicio desde la CLI, deberia ver algo como esto:

root@xx.xx.xx.xx:~/MTProxy/objs/bin# ./mtproto-proxy -u nobody -p 8888 -H 443 -S c4f0ac142375049d2980ed29b3233874 --aes-pwd proxy-secret proxy-multi.conf -M 1
[xxxx][xxxx-xx-xx xx:xx:xx.xxxxxx local] Invoking engine mtproxy-0.01 compiled at xx xx xxxx xx:xx:xx by gcc 10.2.1 xxxxx 64-bit after commit xxxxxxxxxxxxxxxxxx
[xxxx][xxxx-xx-xx xx:xx:xx.xxxxxx local] config_filename = 'proxy-multi.conf'
[xxxx][xxxx-xx-xx xx:xx:xx.xxxxxx local] creating 1 workers
[xxxx][xxxx-xx-xx xx:xx:xx.xxxxxx local] Started as [0.0.0.0:8888:xxxx:xxxxxxxxxx]
[xxxx][xxxx-xx-xx xx:xx:xx.xxxxxx local] configuration file proxy-multi.conf re-read successfully (752 bytes parsed), new configuration active
[xxxx][xxxx-xx-xx xx:xx:xx.xxxxxx local] Started as [0.0.0.0:8888:xxxx:xxxxxxxxxx]
[xxxx][xxxx-xx-xx xx:xx:xx.xxxxxx local] main loop

2. Firewall

2.1. Deberá permitir el trafico entrante TCP al puerto que haya especificado (443/tcp)

2.2. Deberá permitir el trafico saliente TCP del proxy a los servidores de telegram (8888/tcp)

3. Aplicación de Telegram

3.1. Lo más sencillo será crear un enlace rápido para agregar el proxy:

https://t.me//proxy?server=<SERVER_IP>&port=<PORT&>secret=<SECRET>

Donde:

  • SERVER_IP es la IP de su servidor
  • PORT es el puerto especificado (443)
  • SECRET es uno de los secretos permitidos (c4f0ac142375049d2980ed29b3233874)

Ejemplo:

https://t.me//proxy?server=1.2.3.4&port=443&secret=c4f0ac142375049d2980ed29b3233874

ℹ️ Nota sobre privacidad

Debido a que algunos ISP detectan MTProxy por tamaños de paquete, se puede agregar relleno aleatorio a los paquetes si dicho modo está habilitado. Solo para los clientes que lo solicitan.

Agregue el prefijo dd al inicio del secreto (cafe...babe => ddcafe...babe) para habilitar este modo en el lado del cliente.

Ejemplo:

App Telegram:
SECRET -> c4f0ac142375049d2980ed29b3233874
SECRET -> ddc4f0ac142375049d2980ed29b3233874

Si todo está correcto, procedemos a crear un servicio para que se ejecute en segundo plano.

4. Servicio MTProxy

4.1. Mueva el binario a /opt/MTProxy

mkdir /opt/MTProxy
cp /root/MTProxy/objs/bin/* /opt/MTProxy/

4.2. Navegue a la nueva ubicación:

cd /opt/MTProxy

4.3. Automatice la descarga periódica de configuración de Telegram y el reinicio del servicio

nano /opt/MTProxy/proxy-multi.sh

4.4. Pegue lo siguiente:

#!/bin/bash
# Script to fetch proxy-multi.conf
cd /opt/MTProxy
curl https://core.telegram.org/getProxyConfig > proxy-multi.conf
systemctl restart MTProxy.service

4.5. Cree un usuario mtproxy para ejecutar el proxy:

useradd -m -s /bin/false mtproxy

4.6. Actualice los permisos del directorio MTProxy al nuevo usuario

chown -R mtproxy:mtproxy /opt/MTProxy

4.7. Creee un nuevo servicio de systemd para ejecutar el proxy

nano /etc/systemd/system/MTProxy.service

4.8. Copie la configuración:

[Unit]
Description=MTProxy
After=network.target

[Service]
Type=simple
WorkingDirectory=/opt/MTProxy
ExecStart=/opt/MTProxy/mtproto-proxy -u mtproxy -p 8888 -H <PORT> -S <SECRET> --aes-pwd proxy-secret proxy-multi.conf -M 1
Restart=on-failure

[Install]
WantedBy=multi-user.target

4.9. Modifique las variables como en el paso 1.12:

  • PORT es el puerto especificado (443)
  • SECRET es uno de los secretos permitidos (c4f0ac142375049d2980ed29b3233874)

4.10. Guarde y salga con CTRL + X y Y + Intro

4.11. Reinicie los systemd daemons:

systemctl daemon-reload

4.12. Reincie el servicio y verifique que se ha iniciado correctamente:

systemctl restart MTProxy.service

# Compruebe el estado
systemctl status MTProxy.service

4.13. Habilite el inicio automatico del servicio:

systemctl enable MTProxy.service

4.14. Abra su archivo crontab

crontab -e

4.15. Pegue lo siguiente al final del mismo

0 0 * * * /bin/bash /opt/MTProxy/proxy-multi.sh

¡Su servidor proxy está listo!

Ahora debería poder conectarse al proxy dentro de Telegram usando un enlace como:

tg://proxy?server=<SERVER_IP>&port=<PORT>&secret=<SECRET>

https://t.me//proxy?server=<SERVER_IP>&port=<PORT>&secret=<SECRET>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment