Levantamos nuestra instancia de Webogram con proxy vía nginx

¡Hola, Habr!

Recientemente me encontré en una situación en la que era necesario trabajar dentro de una red corporativa con acceso incompleto a Internet y, como puedes adivinar por el título, Telegram estaba bloqueado en ella. Estoy seguro de que esta situación les resulta familiar a muchos.

Puedo prescindir de la mensajería instantánea, pero era Telegram lo que necesitaba para trabajar. No fue posible instalar el cliente en una máquina de trabajo, ni tampoco utilizar un portátil personal. Otra solución parece ser utilizarlo. versión web oficial, pero como puedes adivinar, tampoco estaba disponible. Inmediatamente tacho la opción de buscar un espejo no oficial (espero que por razones obvias).

Por suerte, Webogram es un proyecto de código abierto cuyo código fuente está disponible en gitHub su autor (¡Por lo cual muchas gracias a él!)
La instalación y el lanzamiento en sí no son difíciles, sin embargo, en condiciones de funcionamiento dentro de una red con acceso bloqueado a los servidores de Telegram, es más probable que se sienta decepcionado que exitoso, ya que la versión web envía solicitudes a los servidores de Telegram desde la máquina del usuario.

Afortunadamente, esta es una solución bastante simple (pero no muy obvia). Me gustaría advertirles que no soy el autor de esta solución. logré encontrarlo en rama, que discutió un problema similar al mío. Solución sugerida por el usuario de github tecknojock, me ayudó mucho, sin embargo, estoy seguro de que puede ayudar a alguien más, así que decidí escribir este tutorial.

Debajo del corte encontrará la configuración paso a paso de su espejo de Webogram y la configuración para enviar sus solicitudes a los servidores de Telegram usando nginx.

Como ejemplo, elegí un Ubuntu Server 18.04.3 recién instalado y actualizado.

Atencion: Este tutorial no incluirá instrucciones sobre cómo configurar un dominio en nginx. Tienes que hacerlo tú mismo. El tutorial asume que ya has configurado un dominio con ssl, y que el propio servidor en el que planeas configurarlo tiene acceso a los servidores de Telegram (de la forma que quieras)

Supongamos que la ip de este servidor es 10.23.0.3 y el nombre de dominio es mywebogram.localhost

Basado en estas convenciones, daré ejemplos de configuraciones. No olvides cambiar los valores por los tuyos propios.

Así que vamos a empezar:

Para ejecutar Webogram, necesitamos nodejs. Por defecto, si lo instalamos desde los repositorios de Ubuntu, obtendremos la versión 8.x de nodejs. Necesitamos 12.x:

curl -sL https://deb.nodesource.com/setup_12.x | sudo -E bash - 
sudo apt update && sudo apt -y install nodejs

Elegimos el lugar donde tendrá su sede nuestro Webogram.

Por ejemplo, coloquémoslo en la raíz del directorio de inicio. Para ello clonamos el repositorio oficial a nuestro servidor:

cd ~ && git clone https://github.com/zhukov/webogram.git

El siguiente paso es instalar todas las dependencias necesarias para ejecutar la aplicación:

cd webogram && npm install

Intentemos una prueba. Ejecute el comando:

npm start

Después de eso, intentamos abrirlo en el navegador.

 http://10.23.0.3:8000/app/index.html

Si hasta este punto has hecho todo correctamente, se abrirá la página de autorización de Webogram.

Ahora necesitamos configurar la aplicación para que se ejecute como un servicio. Para hacer esto, creemos un archivo.

sudo touch /lib/systemd/system/webogram.service

ábrelo en cualquier editor y dale la siguiente apariencia (ingresa tu ruta a WorkDirectory)

[Unit]
Description=Webogram mirror
[Service]
WorkingDirectory=/home/tg/webogram
ExecStart=/usr/bin/npm start
SuccessExitStatus=143
TimeoutStopSec=10
Restart=on-failure
RestartSec=5
[Install]
WantedBy=multi-user.target

Luego ejecutamos los siguientes comandos:

Aplicando los cambios

sudo systemctl daemon-reload

Habilitar ejecución automática:

sudo systemctl enable webogram.service

Comencemos el servicio:

sudo systemctl start webogram.service

Después de completar los pasos, Webogram seguirá estando disponible en el puerto 8000.

Dado que configuraremos el acceso a nuestro Webogram a través de nginx, cerraremos el puerto 8000 para solicitudes externas.

Usamos la utilidad udf para esto (o cualquier método que le resulte conveniente):

sudo ufw deny 8000

En caso de que aún decidas usar udf, pero esté deshabilitado en el servidor, agrega más reglas (para que no todo se desmorone) y habilita udf:

sudo ufw allow ssh
sudo ufw allow 80
sudo ufw allow 443
sudo ufw enable

A continuación, comencemos a cambiar la configuración de nginx.

Como advertí anteriormente, se supone que ya hay un dominio con ssl configurado en su servidor. Solo llamaré su atención sobre lo que será necesario agregar al archivo de configuración del dominio para que funcione correctamente:


server {
...
  location ^~ /pluto/apiw1/ {
    proxy_pass https://pluto.web.telegram.org/apiw1/;
  }
  location ^~ /venus/apiw1/ {
    proxy_pass https://venus.web.telegram.org/apiw1/;
  }
  location ^~ /aurora/apiw1/ {
    proxy_pass https://aurora.web.telegram.org/apiw1/;
  }
  location ^~ /vesta/apiw1/ {
    proxy_pass https://vesta.web.telegram.org/apiw1/;
  }
  location ^~ /flora/apiw1/ {
    proxy_pass https://flora.web.telegram.org/apiw1/;
  }
  location ^~ /pluto-1/apiw1/ {
    proxy_pass https://pluto-1.web.telegram.org/apiw1/;
  }
  location ^~ /venus-1/apiw1/ {
    proxy_pass https://venus-1.web.telegram.org/apiw1/;
  }
  location ^~ /aurora-1/apiw1/ {
    proxy_pass https://aurora-1.web.telegram.org/apiw1/;
  }
  location ^~ /vesta-1/apiw1/ {
    proxy_pass https://vesta-1.web.telegram.org/apiw1/;
  }
  location ^~ /flora-1/apiw1/ {
    proxy_pass https://flora-1.web.telegram.org/apiw1/;
  }
  location ^~ /DC1/ {
    proxy_pass http://149.154.175.10:80/;
  }
  location ^~ /DC2/ {
    proxy_pass http://149.154.167.40:80/;
  }
  location ^~ /DC3/ {
    proxy_pass http://149.154.175.117:80/;
  }
  location ^~ /DC4/ {
    proxy_pass http://149.154.175.50:80/;
  }
  location ^~ /DC5/ {
    proxy_pass http://149.154.167.51:80/;
  }
  location ^~ /DC6/ {
    proxy_pass http://149.154.175.100:80/;
  }
  location ^~ /DC7/ {
    proxy_pass http://149.154.167.91:80/;
  }
  location ^~ /DC8/ {
    proxy_pass http://149.154.171.5:80/;
  }
 location / {
    auth_basic "tg";
    auth_basic_user_file /etc/nginx/passwd.htpasswd;
    proxy_pass http://localhost:8000/;
    proxy_read_timeout 90s;
    proxy_connect_timeout 90s;
    proxy_send_timeout 90s;
    proxy_set_header Host $http_host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $remote_addr;
  }
}

Lo que agregamos a la configuración de nginx:

  • Cambiamos la ubicación raíz, que enviará las solicitudes al puerto 8000, al que Webogram responde
  • Cerramos la ubicación raíz usando basic-auth. Este es un paso puramente simbólico para cerrar nuestra aplicación a miradas indiscretas y robots. (Y también para evitar problemas con el bloqueo)
  • Un montón de ubicaciones con proxy_path en el servidor de Telegram son exactamente nuestros puntos finales a través de los cuales enviaremos nuestras solicitudes.

Además, creemos un archivo. /etc/nginx/passwd.htpasswd;para que nginx tenga algo con qué verificar las contraseñas de los usuarios.

sudo apt install apache2-utils
sudo htpasswd -c /etc/nginx/passwd.htpasswd tg

Levantamos nuestra instancia de Webogram con proxy vía nginx

Reinicie nginx:

sudo systemctl restart nginx

Ahora Webogram sólo estará disponible en mywebogram.localhost/app/index.html después de ingresar el nombre de usuario y la contraseña que definió al crear el comando htpasswd.

Ya queda poco: haremos pequeños cambios en el proyecto en sí.

Abra el archivo en un editor. ~/webogram/app/js/lib/mtproto.js

Y lleve su comienzo a la siguiente forma:

/*!
 * Webogram v0.7.0 - messaging web application for MTProto
 * https://github.com/zhukov/webogram
 * Copyright (C) 2014 Igor Zhukov <[email protected]>
 * https://github.com/zhukov/webogram/blob/master/LICENSE
 */

angular.module('izhukov.mtproto', ['izhukov.utils'])

  .factory('MtpDcConfigurator', function () {
    var sslSubdomains = ['pluto', 'venus', 'aurora', 'vesta', 'flora']

    var dcOptions = Config.Modes.test
      ? [
        {id: 1, host: 'mywebogram.localhost/DC1',  port: 80},
        {id: 2, host: 'mywebogram.localhost/DC2',  port: 80},
        {id: 3, host: 'mywebogram.localhost/DC3', port: 80}
      ]
      : [
        {id: 1, host: 'mywebogram.localhost/DC4',  port: 80},
        {id: 2, host: 'mywebogram.localhost/DC5',  port: 80},
        {id: 3, host: 'mywebogram.localhost/DC6', port: 80},
        {id: 4, host: 'mywebogram.localhost/DC7',  port: 80},
        {id: 5, host: 'mywebogram.localhost/DC8',   port: 80}
      ]

    var chosenServers = {}

    function chooseServer (dcID, upload) {
      if (chosenServers[dcID] === undefined) {
        var chosenServer = false,
          i, dcOption

        if (Config.Modes.ssl || !Config.Modes.http) {
          var subdomain = sslSubdomains[dcID - 1] + (upload ? '-1' : '')
          var path = Config.Modes.test ? 'apiw_test1' : '/apiw1/'
          chosenServer = 'https://mywebogram.localhost/' + subdomain + path
          return chosenServer
        }
       for (i = 0; i < dcOptions.length; i++) {
          dcOption = dcOptions[i]
          if (dcOption.id == dcID) {
            chosenServer = 'http://' + dcOption.host + '/apiw1'
            break
          }
        }
        chosenServers[dcID] = chosenServer
      }
...
 

Después de esto, deberá actualizar la página de la aplicación en el navegador.

Abra la consola de su navegador y observe las solicitudes de red de la aplicación. Si todo funciona y las solicitudes XHR van a su servidor, entonces todo se hace correctamente y Webogram ahora se envía mediante proxy a través de nginx.

Levantamos nuestra instancia de Webogram con proxy vía nginx

Espero que este tutorial sea útil para alguien más además de mí.

Muchas gracias a todos los que leyeron hasta el final.

Si alguien tiene alguna dificultad o cometí alguna inexactitud, estaré encantado de responder e intentar ayudarle en los comentarios o por mensaje privado.

Fuente: habr.com

Añadir un comentario