Podižemo našu Webogram instancu sa proxying-om putem nginxa

Hej Habr!

Nedavno sam se našao u situaciji u kojoj je bilo potrebno raditi unutar korporativne mreže s nepotpunim pristupom internetu i, kao što možete pretpostaviti iz naslova, Telegram je u njoj bio blokiran. Siguran sam da je ova situacija mnogima poznata.

Mogu bez instant messengera, ali za posao mi je bio potreban Telegram. Nije bilo moguće instalirati klijenta na radnu mašinu, niti je bilo moguće koristiti lični laptop. Čini se da je još jedno rješenje koristiti ga službena web verzija, ali kao što možete pretpostaviti i on je bio nedostupan. Odmah precrtavam opciju traženja nezvaničnog ogledala (nadam se iz očiglednih razloga).

Srećom, Webogram je projekat otvorenog koda čiji je izvorni kod dostupan GitHub njegovog autora (za šta mu veliko hvala!)
Sama instalacija i pokretanje nije teška, međutim, u uvjetima rada unutar mreže sa blokiranim pristupom Telegram serverima, vjerojatnije je da ćete biti razočarani nego uspješni, jer web verzija šalje zahtjeve Telegram serverima sa računara korisnika.

Srećom, ovo je prilično jednostavno (ali ne baš očigledno) rješenje. Upozoravam da ja nisam autor ovog rješenja. Uspeo sam da ga nađem grana, koji je raspravljao o problemu sličnom mom. Rješenje koje je predložio korisnik github-a tecknojock, meni je puno pomogao, međutim, siguran sam da može pomoći još nekome, pa sam odlučio da napišem ovaj tutorijal.

Ispod reza ćete pronaći korak po korak podešavanje vašeg Webogram ogledala i podešavanje proxyja njegovih zahtjeva na Telegram servere koristeći nginx.

Kao primjer, izabrao sam svježe instalirani i ažurirani Ubuntu Server 18.04.3.

Upozorenje: Ovaj vodič neće uključivati ​​upute o postavljanju domene u nginxu. Ovo morate sami da uradite. Tutorijal pretpostavlja da ste već konfigurisali domenu sa ssl-om i da sam server na kojem planirate da ga konfigurišete ima pristup Telegram serverima (na koji god način želite)

Pretpostavimo da je ip ovog servera 10.23.0.3, a ime domene mywebogram.localhost

Na osnovu ovih konvencija dat ću primjere konfiguracija. Ne zaboravite da promijenite vrijednosti u svoje.

Hajde da počnemo:

Za pokretanje Webograma potrebni su nam nodejs. Podrazumevano, ako ga instaliramo iz Ubuntu repozitorija, dobićemo nodejs verziju 8.x. Trebamo 12.x:

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

Mi biramo mjesto gdje će se nalaziti naš Webogram.

Na primjer, stavimo ga u korijen matičnog direktorija. Da biste to učinili, klonirajte službeno spremište na naš server:

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

Sljedeći korak je instaliranje svih zavisnosti potrebnih za pokretanje aplikacije:

cd webogram && npm install

Pokušajmo probno. Pokrenite naredbu:

npm start

Nakon toga pokušavamo da ga otvorimo u pretraživaču

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

Ako ste do ovog trenutka sve uradili kako treba, otvoriće se stranica za autorizaciju Webograma.

Sada moramo konfigurirati aplikaciju da radi kao servis. Da bismo to učinili, napravimo datoteku

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

otvorite ga u bilo kojem uređivaču i dajte mu sljedeći izgled (unesite svoju putanju do 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

Zatim pokrećemo sljedeće komande:

Primjena promjena

sudo systemctl daemon-reload

Omogući automatsko pokretanje:

sudo systemctl enable webogram.service

Pokrenimo uslugu:

sudo systemctl start webogram.service

Nakon dovršetka koraka, Webogram će i dalje biti dostupan na portu 8000.

Budući da ćemo podesiti pristup našem Webogramu putem nginxa, zatvorit ćemo port 8000 za zahtjeve izvana.

Za ovo koristimo udf uslužni program (ili bilo koju metodu koja vam odgovara):

sudo ufw deny 8000

U slučaju da se ipak odlučite koristiti udf, ali je na serveru onemogućen, dodajte još pravila (da se sve ne raspadne) i omogućite udf:

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

Zatim počnimo mijenjati nginx konfiguraciju.

Kao što sam prethodno upozorio, pretpostavlja se da je domen sa ssl već konfigurisan na vašem serveru. Skrenut ću vam pažnju samo na ono što je potrebno dodati u konfiguracijski fajl domene da bi ispravno funkcionisao:


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

Šta dodajemo u nginx konfiguraciju:

  • Mijenjamo korijensku lokaciju, koja će proxy zahtjeve na port 8000, na koji Webogram odgovara
  • Zatvaramo korijensku lokaciju koristeći basic-auth. Ovo je čisto simboličan korak za zatvaranje naše aplikacije od znatiželjnih očiju i botova. (A i da biste izbjegli probleme sa blokiranjem)
  • Gomila lokacija sa proxy_path na Telegram serveru su upravo naše krajnje tačke preko kojih ćemo proxy naše zahtjeve

Takođe, napravimo fajl /etc/nginx/passwd.htpasswd;tako da nginx ima čime provjeriti korisničke lozinke.

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

Podižemo našu Webogram instancu sa proxying-om putem nginxa

Ponovo pokrenite nginx:

sudo systemctl restart nginx

Sada će Webogram biti dostupan samo na adresi mywebogram.localhost/app/index.html nakon što se unese prijava i lozinka koje ste definirali prilikom kreiranja naredbe htpasswd.

Ostalo je malo: napravićemo male izmene u samom projektu.

Otvorite datoteku u uređivaču ~/webogram/app/js/lib/mtproto.js

I dovesti njegov početak u sljedeći oblik:

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

Nakon toga morate osvježiti stranicu aplikacije u pretraživaču.

Otvorite konzolu pretraživača i pogledajte mrežne zahtjeve aplikacije. Ako sve radi i XHR zahtjevi idu na vaš server, onda je sve urađeno kako treba, a Webogram je sada proksi preko nginxa.

Podižemo našu Webogram instancu sa proxying-om putem nginxa

Nadam se da će ovaj tutorijal biti koristan još nekome osim meni.

Veliko hvala svima koji su pročitali do kraja.

Ako neko ima poteškoća ili sam napravio neke nepreciznosti, rado ću odgovoriti i pokušati vam pomoći u komentarima ili PM.

izvor: www.habr.com

Dodajte komentar