Creamos a nosa instancia de Webogram con proxy a través de nginx

Ola Habr!

Recentemente atopeime nunha situación na que era necesario traballar dentro dunha rede corporativa con acceso incompleto a Internet e, como podes supoñer polo título, Telegram estaba bloqueado nela. Estou seguro de que esta situación é coñecida para moitos.

Podo prescindir de mensaxería instantánea, pero era Telegram o que necesitaba para traballar. Non era posible instalar o cliente nunha máquina de traballo, nin se podía utilizar un portátil persoal. Outra solución parece ser usalo versión web oficial, pero como podes supoñer, tampouco estaba dispoñible. Tacho inmediatamente a opción de buscar un espello non oficial (espero que por razóns obvias).

Afortunadamente, Webogram é un proxecto de código aberto cuxo código fonte está dispoñible en GitHub o seu autor (polo que moitas grazas!)
A instalación e o lanzamento en si non son difíciles, non obstante, en condicións de funcionamento dentro dunha rede con acceso bloqueado aos servidores de Telegram, será máis probable que te decepcione que teña éxito, xa que a versión web envía solicitudes aos servidores de Telegram desde a máquina do usuario.

Afortunadamente, esta é unha solución bastante sinxela (pero non moi obvia). Quero avisar de que non son o autor desta solución. Conseguín atopalo rama, que discutía un problema semellante ao meu. Solución suxerida polo usuario de github tecknojock, axudoume moito, con todo, estou seguro de que pode axudar a outra persoa, así que decidín escribir este tutorial.

Debaixo do corte atoparás a configuración paso a paso do teu espello de Webogram e a configuración para enviar as súas solicitudes aos servidores de Telegram mediante nginx.

Como exemplo, escollín un Ubuntu Server 18.04.3 recén instalado e actualizado.

Внимание: Este tutorial non incluirá instrucións sobre como configurar un dominio en nginx. Debes facelo ti mesmo. O titorial asume que xa configuraches un dominio con ssl, e que o propio servidor no que pensas configuralo ten acceso aos servidores de Telegram (do que queiras)

Supoñamos que a ip deste servidor é 10.23.0.3 e o nome de dominio é mywebogram.localhost

En base a estas convencións, darei exemplos de configuracións. Non esquezas cambiar os valores polos teus.

Entón, imos comezar:

Para executar Webogram, necesitamos nodejs. Por defecto, se o instalamos desde os repositorios de Ubuntu, obteremos a 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

Escollemos o lugar onde se baseará o noso Webogram.

Por exemplo, colocámolo na raíz do directorio home. Para iso, clona o repositorio oficial no noso servidor:

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

O seguinte paso é instalar todas as dependencias necesarias para executar a aplicación:

cd webogram && npm install

Probemos unha proba. Executar o comando:

npm start

Despois diso, tentamos abrilo no navegador

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

Se ata este momento fixeches todo correctamente, abrirase a páxina de autorización de Webogram.

Agora necesitamos configurar a aplicación para que se execute como servizo. Para iso, imos crear un ficheiro

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

ábreo en calquera editor e dálle a seguinte aparencia (introduce o teu camiño 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

Despois executamos os seguintes comandos:

Aplicando os cambios

sudo systemctl daemon-reload

Activar a execución automática:

sudo systemctl enable webogram.service

Comezamos o servizo:

sudo systemctl start webogram.service

Despois de completar os pasos, Webogram seguirá estando dispoñible no porto 8000.

Xa que configuraremos o acceso ao noso Webogram a través de nginx, pecharemos o porto 8000 para solicitudes de fóra.

Usamos a utilidade udf para iso (ou calquera método conveniente para vostede):

sudo ufw deny 8000

No caso de que aínda decidas usar udf, pero está desactivado no servidor, engade máis regras (para que non se desmorone todo) e habilite udf:

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

A continuación, imos comezar a cambiar a configuración de nginx.

Como advertín anteriormente, suponse que un dominio con ssl xa está configurado no teu servidor. Só chamarei a súa atención sobre o que será necesario engadir ao ficheiro de configuración do 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;
  }
}

O que engadimos á configuración de nginx:

  • Cambiamos a localización raíz, que enviará as solicitudes de proxy ao porto 8000, ao que responde Webogram
  • Pechamos a localización raíz usando basic-auth. Este é un paso puramente simbólico para pechar a nosa aplicación de miradas indiscretas e bots. (E tamén para evitar problemas co bloqueo)
  • Unha morea de localizacións con proxy_path no servidor de Telegram son exactamente os nosos puntos finais a través dos cales enviaremos as nosas solicitudes por proxy

Ademais, imos crear un ficheiro /etc/nginx/passwd.htpasswd;para que nginx teña algo para comprobar os contrasinais dos usuarios.

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

Creamos a nosa instancia de Webogram con proxy a través de nginx

Reiniciar nginx:

sudo systemctl restart nginx

Agora Webogram só estará dispoñible en mywebogram.localhost/app/index.html despois de introducir o inicio de sesión e o contrasinal que definiu ao crear o comando htpasswd.

Xa queda pouco: faremos pequenos cambios no propio proxecto.

Abre o ficheiro nun editor ~/webogram/app/js/lib/mtproto.js

E leva o seu inicio á seguinte 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
      }
...
 

Despois diso, cómpre actualizar a páxina da aplicación no navegador.

Abre a consola do teu navegador e mira as solicitudes de rede da aplicación. Se todo funciona e as solicitudes de XHR van ao teu servidor, entón todo está feito correctamente e Webogram agora envíase un proxy a través de nginx.

Creamos a nosa instancia de Webogram con proxy a través de nginx

Espero que este tutorial sexa útil para alguén ademais de min.

Moitas grazas a todos os que ledes ata o final.

Se alguén ten algunha dificultade ou fixen algunha imprecisión, estarei encantado de responder e tratar de axudarche nos comentarios ou en MP.

Fonte: www.habr.com

Engadir un comentario