
Tunelización de tráfico de Internet a través de WhatsApp

Esto es un fragmento de código basado en Baileys que permite tunelizar datos TCP a través de dos cuentas de Whatsapp.
Esto puede ser útil en diferentes situaciones, por ejemplo, operadores de red que ofrecen datos ilimitados de whatsapp o aviones donde también se obtienen datos ilimitados de redes sociales.
Utiliza Baileys ya que es una biblioteca de Whatsapp multidispositivo basada en WS y, por lo tanto, podría usarse en Android en el futuro, usando Termux por ejemplo.
La idea es usarlo con una configuración de proxy en el servidor de esta manera: [Cliente (acceso restringido) -> Whatsapp -> Servidor -> Proxy -> Internet]
Disculpas de antemano ya que Javascript no es uno de mis lenguajes de programación principales :/
Usar solo con fines educativos.
Envía paquetes de red TCP a través de mensajes de texto y archivos de WhatsApp, dependiendo de la cantidad de caracteres los divide en diferentes mensajes de texto o archivos.
Para no ser desconectado por WhatsApp por defecto está limitado a 20k caracteres por mensaje, por el momento está codificado en wasocket.js.
He realizado múltiples pruebas y cualquier cosa por debajo de eso puede hacer que te prohiban por enviar demasiados mensajes y cualquier cosa por encima de 80k puede provocar un tiempo de espera.
Si un paquete de red supera el límite (20k caracteres por defecto) se enviará como archivo si está habilitado. También si se almacenan en caché múltiples paquetes de red, usará el mismo criterio.
Los mensajes de archivo se envían como archivos binarios, las respuestas TCP se concatenan con un delimitador y se comprimen usando brotli para reducir el uso de datos.
Almacena en caché las respuestas de los sockets TCP para agruparlas y enviar la máxima cantidad de datos en un mensaje, reduciendo así la cantidad de mensajes, mejorando la velocidad y reduciendo la probabilidad de ser prohibido.
Before: (without files and no response caching)
curl -x localhost:12345 https://www.youtube.com
- 50-80 messages
- 30-40 seconds
After: (with files and response caching)
curl -x localhost:12345 https://www.youtube.com
- 6-8 messages
- 7-15 seconds
En caso de que no se permita enviar archivos, use la bandera --disable-files al iniciar el servidor y el cliente para deshabilitar esta funcionalidad.
La idea me llegó mientras viajaba por Sudamérica, los datos de red en los operadores suelen estar restringidos a no muchos GB, pero WhatsApp suele ser ilimitado. Intenté crear esta biblioteca ya que no encontré ninguna utilizable en la fecha.
Debes tener acceso a dos cuentas de Whatsapp, una para el servidor y otra para el cliente. Puedes reenviar un puerto local o usar un proxy externo.
Clona el repositorio en tu servidor e instala las dependencias de node.
cd path/to/wa-tunnelnpm installLuego puedes iniciar el servidor con el siguiente comando, donde puerto es el puerto del proxy y host es el host del proxy que deseas reenviar. Y número es el número de WhatsApp del cliente con el código de país junto y sin +.
npm run server host port number
Puedes usar un servidor proxy local de la siguiente manera:
npm run server localhost 3128 12345678901
O puedes usar un servidor proxy normal de la siguiente manera:
npm run server 192.168.0.1 3128 12345678901
Clona el repositorio en tu servidor e instala las dependencias de node.
cd path/to/wa-tunnelnpm installLuego puedes iniciar el servidor con el siguiente comando, donde puerto es el puerto local al que te conectarás y número es el número de WhatsApp del servidor con el código de país junto y sin +.
npm run client port number
Por ejemplo
npm run client 8080 1234567890
La primera vez que abras el script, Baileys te pedirá que escanees el código QR con la aplicación de whatsapp, después de eso la sesión se guarda para uso posterior.
Puede fallar, eso es normal, después de eso simplemente reinicia el script y tendrás tu cliente/servidor listo.
Una vez que tengas tanto el cliente como el servidor listos, puedes probar usando curl y ver la magia suceder.
curl -v -x proxyHost:proxyPort https://httpbin.org/ip
Con los comandos de ejemplo sería:
curl -v -x localhost:8080 https://httpbin.org/ip
También ha sido probado con un navegador normal como Firefox, es lento pero se puede usar.
También puedes reenviar otros puertos de protocolo como SSH configurando el servidor de esta manera:
npm run server localhost 22 12345678901
Y luego conectar al servidor usando en el cliente:
ssh root@localhost -p 8080
Para usar en Android, puedes usarlo con Termux usando los siguientes comandos:
pkg update && pkg upgrade
pkg install git nodejs -y
git clone https://github.com/aleixrodriala/wa-tunnel.git
cd wa-tunnel
npm install
El uso de esta biblioteca puede llevar a la suspensión de tu cuenta de WhatsApp, usa un número temporal o bajo tu propio riesgo.