Aumentiamo la nostra istanza Webogram con proxy tramite nginx

Ehi Habr!

Recentemente mi sono trovato in una situazione in cui era necessario lavorare all'interno di una rete aziendale con accesso incompleto a Internet e, come puoi intuire dal titolo, Telegram era bloccato al suo interno. Sono sicuro che questa situazione è familiare a molti.

Posso fare a meno della messaggistica istantanea, ma era Telegram quello di cui avevo bisogno per lavoro. Non era possibile installare il client su una macchina da lavoro, né era possibile utilizzare un laptop personale. Un'altra soluzione sembra essere quella di usarlo versione web ufficiale, ma come puoi immaginare, non era nemmeno disponibile. Escludo subito la possibilità di cercare un mirror non ufficiale (spero per ovvi motivi).

Fortunatamente, Webogram è un progetto open source il cui codice sorgente è disponibile in github il suo autore (per il quale molte grazie a lui!)
L'installazione e l'avvio in sé non sono difficili, tuttavia, in condizioni di funzionamento all'interno di una rete con accesso bloccato ai server Telegram, è più probabile che rimarrai deluso che riuscito, poiché la versione web invia richieste ai server Telegram dalla macchina dell'utente.

Fortunatamente, questa è una soluzione abbastanza semplice (ma non molto ovvia). Vorrei avvisarvi che non sono l'autore di questa soluzione. Sono riuscito a trovarlo ramo, che discuteva un problema simile al mio. Soluzione suggerita dall'utente github tecnojock, mi ha aiutato molto, tuttavia, sono sicuro che possa aiutare qualcun altro, quindi ho deciso di scrivere questo tutorial.

Sotto il taglio troverai la configurazione passo passo del tuo mirror Webogram e la configurazione dell'inoltro delle sue richieste ai server Telegram utilizzando nginx.

Ad esempio, ho scelto Ubuntu Server 18.04.3 appena installato e aggiornato.

Nota: Questo tutorial non includerà istruzioni sulla configurazione di un dominio in nginx. Devi farlo tu stesso. Il tutorial presuppone che tu abbia già configurato un dominio con SSL e che il server stesso su cui intendi configurarlo abbia accesso ai server Telegram (nel modo che preferisci)

Supponiamo che l'IP di questo server sia 10.23.0.3 e il nome di dominio sia mywebogram.localhost

Sulla base di queste convenzioni, fornirò esempi di configurazioni. Non dimenticare di modificare i valori con i tuoi.

Quindi, iniziamo:

Per eseguire Webogram, abbiamo bisogno di nodejs. Per impostazione predefinita, se lo installiamo dai repository Ubuntu, otterremo la versione 8.x di nodejs. Abbiamo bisogno di 12.x:

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

Scegliamo il luogo in cui avrà sede il nostro Webogram.

Ad esempio, posizioniamolo nella radice della directory home. Per fare ciò, clona il repository ufficiale sul nostro server:

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

Il passaggio successivo consiste nell'installare tutte le dipendenze necessarie per eseguire l'applicazione:

cd webogram && npm install

Proviamo una corsa di prova. Esegui il comando:

npm start

Successivamente, proviamo ad aprirlo nel browser

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

Se fino a questo punto hai fatto tutto correttamente si aprirà la pagina di autorizzazione di Webogram.

Ora dobbiamo configurare l'applicazione per l'esecuzione come servizio. Per fare ciò, creiamo un file

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

aprilo in qualsiasi editor e dagli il seguente aspetto (inserisci il tuo percorso verso 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

Quindi eseguiamo i seguenti comandi:

Applicazione delle modifiche

sudo systemctl daemon-reload

Abilita l'esecuzione automatica:

sudo systemctl enable webogram.service

Iniziamo il servizio:

sudo systemctl start webogram.service

Dopo aver completato i passaggi, Webogram continuerà ad essere disponibile sulla porta 8000.

Poiché configureremo l'accesso al nostro Webogram tramite nginx, chiuderemo la porta 8000 per le richieste dall'esterno.

Utilizziamo l'utilità udf per questo (o qualsiasi metodo conveniente per te):

sudo ufw deny 8000

Nel caso in cui decidi comunque di utilizzare udf, ma è disabilitato sul server, aggiungi più regole (in modo che tutto non vada in pezzi) e abilita udf:

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

Successivamente, iniziamo a modificare la configurazione di nginx.

Come ho avvertito sopra, si presuppone che sul tuo server sia già configurato un dominio con SSL. Mi limiterò a richiamare la tua attenzione su ciò che dovrà essere aggiunto al file di configurazione del dominio affinché funzioni correttamente:


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

Cosa aggiungiamo alla configurazione di nginx:

  • Modifichiamo la posizione root, che invierà le richieste alla porta 8000, su cui Webogram risponde
  • Chiudiamo la posizione root utilizzando basic-auth. Questo è un passo puramente simbolico per chiudere la nostra applicazione da occhi indiscreti e bot. (E anche per evitare problemi con il blocco)
  • Una serie di posizioni con proxy_path sul server Telegram sono esattamente i nostri endpoint attraverso i quali invieremo le nostre richieste

Inoltre, creiamo un file /etc/nginx/passwd.htpasswd;in modo che nginx abbia qualcosa con cui controllare le password degli utenti.

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

Aumentiamo la nostra istanza Webogram con proxy tramite nginx

Riavvia nginx:

sudo systemctl restart nginx

Ora Webogram sarà disponibile solo su mywebogram.localhost/app/index.html dopo aver inserito il login e la password definiti durante la creazione del comando htpasswd.

Manca poco: apporteremo piccole modifiche al progetto stesso.

Apri il file in un editor ~/webogram/app/js/lib/mtproto.js

E porta il suo inizio nella seguente 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
      }
...
 

Successivamente, è necessario aggiornare la pagina dell'applicazione nel browser.

Apri la console del browser e osserva le richieste di rete dell'applicazione. Se tutto funziona e le richieste XHR arrivano al tuo server, allora tutto è stato eseguito correttamente e Webogram viene ora proxy tramite nginx.

Aumentiamo la nostra istanza Webogram con proxy tramite nginx

Spero che questo tutorial possa essere utile a qualcun altro oltre a me.

Molte grazie a tutti coloro che hanno letto fino alla fine.

Se qualcuno ha difficoltà o ho fatto delle imprecisioni, sarò felice di rispondere e cercare di aiutarvi nei commenti o in PM.

Fonte: habr.com

Aggiungi un commento