Creem la nostra instància de Webogram amb proxy mitjançant nginx

Hola Habr!

Recentment em vaig trobar en una situació en la qual era necessari treballar dins d'una xarxa corporativa amb accés incomplet a Internet i, com podeu endevinar pel títol, Telegram hi estava bloquejat. Estic segur que aquesta situació és familiar per a molts.

Puc prescindir de missatgeria instantània, però era Telegram el que necessitava per treballar. No va ser possible instal·lar el client en una màquina de treball, ni es va poder utilitzar un ordinador portàtil personal. Una altra solució sembla ser utilitzar-lo versió web oficial, però com podeu endevinar, tampoc no estava disponible. De seguida tacho l'opció de buscar un mirall no oficial (espero que per raons òbvies).

Afortunadament, Webogram és un projecte de codi obert el codi font del qual està disponible GitHub el seu autor (per això moltes gràcies a ell!)
La instal·lació i el llançament en si no són difícils, però, en condicions de funcionament dins d'una xarxa amb accés bloquejat als servidors de Telegram, serà més probable que us sentiu decebut que no pas amb èxit, ja que la versió web envia sol·licituds als servidors de Telegram des de la màquina de l'usuari.

Afortunadament, aquesta és una solució bastant senzilla (però no molt òbvia). Vull advertir-vos que no sóc l'autor d'aquesta solució. Vaig aconseguir trobar-lo branca, que parlava d'un problema semblant al meu. Solució suggerida per l'usuari de github tecnojock, em va ajudar molt, però, estic segur que pot ajudar a algú més, així que vaig decidir escriure aquest tutorial.

A sota del tall, trobareu la configuració pas a pas del vostre mirall de Webogram i la configuració de proxy de les seves sol·licituds als servidors de Telegram mitjançant nginx.

Com a exemple, vaig triar un Ubuntu Server 18.04.3 recentment instal·lat i actualitzat.

Advertència: Aquest tutorial no inclourà instruccions sobre com configurar un domini a nginx. Ho heu de fer vosaltres mateixos. El tutorial suposa que ja heu configurat un domini amb ssl, i que el propi servidor en el qual voleu configurar-lo té accés als servidors de Telegram (de la manera que vulgueu)

Suposem que la ip d'aquest servidor és 10.23.0.3 i el nom de domini és mywebogram.localhost

A partir d'aquestes convencions, donaré exemples de configuracions. No us oblideu de canviar els valors pels vostres.

Comencem

Per executar Webogram, necessitem nodejs. Per defecte, si l'instal·lem des dels repositoris d'Ubuntu, obtindrem la versió 8.x de nodejs. Necessitem 12.x:

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

Triem el lloc on es basarà el nostre Webograma.

Per exemple, col·loquem-lo a l'arrel del directori d'inici. Per fer-ho, cloneu el repositori oficial al nostre servidor:

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

El següent pas és instal·lar totes les dependències necessàries per executar l'aplicació:

cd webogram && npm install

Anem a provar una prova. Executeu l'ordre:

npm start

Després d'això, intentem obrir-lo al navegador

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

Si fins a aquest moment ho has fet tot correctament, s'obrirà la pàgina d'autorització de Webogram.

Ara hem de configurar l'aplicació perquè s'executi com a servei. Per fer-ho, creem un fitxer

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

obriu-lo en qualsevol editor i doneu-li l'aspecte següent (introduïu el vostre camí 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

Aleshores executem les ordres següents:

Aplicant els canvis

sudo systemctl daemon-reload

Activa l'execució automàtica:

sudo systemctl enable webogram.service

Comencem el servei:

sudo systemctl start webogram.service

Després de completar els passos, Webogram continuarà disponible al port 8000.

Com que configurarem l'accés al nostre Webogram a través de nginx, tancarem el port 8000 per a sol·licituds de fora.

Utilitzem la utilitat udf per a això (o qualsevol mètode que us convingui):

sudo ufw deny 8000

En cas que encara decidiu utilitzar udf, però està desactivat al servidor, afegiu-hi més regles (perquè no es desfaci tot) i activeu udf:

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

A continuació, comencem a canviar la configuració de nginx.

Com he advertit més amunt, se suposa que un domini amb ssl ja està configurat al vostre servidor. Només cridaré la vostra atenció sobre el que caldrà afegir al fitxer de configuració del domini perquè funcioni correctament:


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;
  }
}

El que afegim a la configuració de nginx:

  • Canviem la ubicació arrel, que enviarà les sol·licituds de proxy al port 8000, al qual respon Webogram
  • Tanquem la ubicació arrel mitjançant basic-auth. Aquest és un pas purament simbòlic per tancar la nostra aplicació de mirades indiscretes i robots. (I també per evitar problemes de bloqueig)
  • Un munt d'ubicacions amb proxy_path al servidor de Telegram són exactament els nostres punts finals a través dels quals enviarem les nostres sol·licituds.

A més, creem un fitxer /etc/nginx/passwd.htpasswd;de manera que nginx tingui alguna cosa per comprovar les contrasenyes dels usuaris.

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

Creem la nostra instància de Webogram amb proxy mitjançant nginx

Reinicieu nginx:

sudo systemctl restart nginx

Ara Webogram només estarà disponible a mywebogram.localhost/app/index.html després d'introduir l'inici de sessió i la contrasenya que heu definit en crear l'ordre htpasswd.

Ja queda poc: farem petits canvis al projecte en si.

Obriu el fitxer en un editor ~/webogram/app/js/lib/mtproto.js

I porta el seu començament a la forma següent:

/*!
 * 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
      }
...
 

Després d'això, heu d'actualitzar la pàgina de l'aplicació al navegador.

Obriu la consola del navegador i consulteu les sol·licituds de xarxa de l'aplicació. Si tot funciona i les sol·licituds XHR van al vostre servidor, aleshores tot es fa correctament i ara Webogram s'envia a través de nginx.

Creem la nostra instància de Webogram amb proxy mitjançant nginx

Espero que aquest tutorial sigui útil a algú més que a mi.

Moltes gràcies a tots els que heu llegit fins al final.

Si algú té alguna dificultat o he fet alguna inexactitud, estaré encantat de respondre i intentar ajudar-vos en els comentaris o en MP.

Font: www.habr.com

Afegeix comentari