Podižemo našu instancu Webograma s proxyjem putem nginxa

Hej Habr!

Nedavno sam se našao u situaciji da 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 i bez instant messengera, ali Telegram mi je trebao za posao. Klijenta nije bilo moguće instalirati na radni stroj, niti je bilo moguće koristiti osobno prijenosno računalo. Čini se da je drugo rješenje koristiti ga službena web verzija, ali kao što možete pretpostaviti, također je bio nedostupan. Odmah križam opciju traženja neslužbenog ogledala (nadam se iz očitih razloga).

Srećom, Webogram je projekt otvorenog koda čiji je izvorni kod dostupan u Github njegov autor (na čemu mu veliko hvala!)
Sama instalacija i pokretanje nije teško, međutim, u uvjetima rada unutar mreže s blokiranim pristupom Telegram poslužiteljima, vjerojatnije je da ćete biti razočarani nego uspješni, budući da web verzija šalje zahtjeve Telegram poslužiteljima s korisnikovog stroja.

Srećom, ovo je prilično jednostavno (ali ne baš očito) rješenje. Upozoravam vas da ja nisam autor ovog rješenja. Uspio sam to pronaći podružnica, koji je raspravljao o problemu sličnom mom. Rješenje koje je predložio korisnik githuba tecknojock, meni je puno pomogao, ali siguran sam da može pomoći i nekom drugom, pa sam odlučio napisati ovaj tutorial.

Ispod presjeka pronaći ćete korak po korak postavljanje vašeg Webogram mirrora i postavljanje proxyja njegovih zahtjeva Telegram poslužiteljima pomoću nginxa.

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

Upozorenje: Ovaj vodič neće sadržavati upute o postavljanju domene u nginxu. Ovo morate učiniti sami. Udžbenik pretpostavlja da ste već konfigurirali domenu s ssl-om i da sam poslužitelj na kojem ga planirate konfigurirati ima pristup Telegramovim poslužiteljima (kako god želite)

Pretpostavimo da je ip ovog poslužitelja 10.23.0.3, a naziv domene mywebogram.localhost

Na temelju ovih konvencija, dat ću primjere konfiguracija. Ne zaboravite promijeniti vrijednosti na svoje.

Pa krenimo:

Za pokretanje Webograma potrebni su nam nodejs. Prema zadanim postavkama, ako ga instaliramo iz Ubuntu repozitorija, dobit ć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 naš Webogram nalaziti.

Na primjer, smjestimo ga u korijen matičnog direktorija. Da biste to učinili, klonirajte službeni repozitorij na naš poslužitelj:

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

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

cd webogram && npm install

Pokušajmo s probnim radom. Pokrenite naredbu:

npm start

Nakon toga ga pokušavamo otvoriti u pregledniku

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

Ako ste do ove točke sve učinili ispravno, otvorit će se stranica za autorizaciju Webograma.

Sada moramo konfigurirati aplikaciju da radi kao usluga. Da bismo to učinili, stvorimo 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 WorkDirectoryja)

[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 naredbe:

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 priključku 8000.

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

Za to koristimo uslužni program udf (ili bilo koji način koji vam odgovara):

sudo ufw deny 8000

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

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

Zatim počnimo mijenjati konfiguraciju nginxa.

Kao što sam prethodno upozorio, pretpostavlja se da je domena sa ssl-om već konfigurirana na vašem poslužitelju. Samo ću vam skrenuti pozornost na ono što je potrebno dodati konfiguracijskoj datoteci domene da bi ispravno radila:


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

Što dodajemo nginx konfiguraciji:

  • Mijenjamo root lokaciju, koja će proxy zahtjeve uputiti na port 8000, na koji Webogram odgovara
  • Zatvaramo korijensku lokaciju pomoću osnovne autentifikacije. Ovo je čisto simboličan korak za zatvaranje naše aplikacije od znatiželjnih očiju i botova. (I također kako bi izbjegli probleme s blokiranjem)
  • Hrpa lokacija s proxy_path na Telegram serveru upravo su naše krajnje točke preko kojih ćemo proxy svoje zahtjeve

Također, kreirajmo datoteku /etc/nginx/passwd.htpasswd;tako da nginx ima čime provjeravati korisničke lozinke.

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

Podižemo našu instancu Webograma s proxyjem putem nginxa

Ponovno pokrenite nginx:

sudo systemctl restart nginx

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

Ostalo je još malo: napravit ćemo male izmjene u samom projektu.

Otvorite datoteku u editoru ~/webogram/app/js/lib/mtproto.js

I dovedite 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 pregledniku.

Otvorite konzolu preglednika i pogledajte mrežne zahtjeve aplikacije. Ako sve radi i XHR zahtjevi idu na vaš poslužitelj, onda je sve učinjeno ispravno, a Webogram je sada proksiran putem nginxa.

Podižemo našu instancu Webograma s proxyjem putem nginxa

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

Veliko hvala svima koji su pročitali do kraja.

Ako netko ima bilo kakvih poteškoća ili sam napravio bilo kakve netočnosti, rado ću odgovoriti i pokušati vam pomoći u komentarima ili PM-u.

Izvor: www.habr.com

Dodajte komentar