Pokrećemo svoj Webogram instancu sa proxiranjem preko nginx

Hello, Habr!

Nedavno sem se znašel v situaciji, kjer je bilo treba delati znotraj korporativne mreže z omejenim dostopom do interneta, in kot lahko uganite iz naslova — Telegram je bil v njej blokiran. Prepričan sem, da je ta situacija znana mnogim.

Zlahka se lahko znajdem brez sporočilnikov, vendar sem potreboval prav Telegram za delo. Namestitev odjemalca na delovno napravo ni bila mogoča, prav tako uporaba osebnega prenosnika. Druga možnost, ki se zdi izvedljiva, je uporaba njegove uradne spletne različice, vendar kot lahko uganite — tudi ta ni bila dostopna. Možnost iskanja neformalnega zrcala takoj izključujem (upam, da iz povsem očitnih razlogov).

Na srečo je Webogram odprtokodni projekt, katerega izvorna koda je dostopna na github njegovi strani (velika hvala avtorju!)
Namestitev in zagon samega projekta nista zapletena, vendar boste v pogojih delovanja znotraj mreže z blokiranim dostopom do strežnikov Telegram verjetno doživeli razočaranje, kot pa uspeh, saj spletna različica pošilja zahteve na strežnike Telegram iz uporabniške naprave.

Na srečo je to dokaj preprosto (vendar ne zelo očitno) popraviti. Želim opozoriti, da nisem avtor tega rešenja. Uspelo mi je najti to v temi, kjer je bila obravnavana težava, podobna moji. Rešitev, ki jo je predlagal uporabnik github tecknojock, mi je zelo pomagala, vendar sem prepričan, da bo v pomoč tudi drugim, zato sem se odločil napisati ta vodič.

Pod katom vas čaka korak-po-koraku nastavitev svojega zrcala Webogram in nastavitev posredovanja njegovih zahtev do strežnikov Telegram z uporabo nginx.

Kot primer sem izbral pravkar nameščen in posodobljen Ubuntu Server 18.04.3.

Attention: V tem vodiču ne bo navodil za nastavitev domene v nginx. To morate narediti sami. Vodič predpostavlja, da imate že nastavljeno domeno z ssl, pa tudi, da ima sam strežnik, na katerem se načrtuje nastavitev, dostop do strežnikov Telegram (na kakršenkoli način, ki vam ustreza)

Predpostavimo, da je ip tega strežnika 10.23.0.3, domensko ime mywebogram.localhost

Na podlagi teh predpostavk bom prinašal primere konfiguracij. Ne pozabite zamenjati vrednosti s svojimi.

Torej, začnimo:

Za zagon Webograma potrebujemo nodejs. Privzeto, če ga namestimo iz repozitorijev Ubuntu, bomo dobili nodejs različice 8.x. Potrebujemo 12.x:

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

Izberemo mesto, kjer bo naš Webogram.

Kot primer — ga postavimo v koren domače mape. Zato kloniramo uradni repozitorij na naš strežnik:

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

Naslednji korak je namestitev vseh odvisnosti, potrebnih za zagon aplikacije:

cd webogram && npm install

Poskusimo izvesti testni zagon. Izvedite ukaz:

npm start

Nato poskusite odpreti v brskalniku

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

Če ste do te točke vse izvajali pravilno, se vam bo odprla stran za prijavo v Webogram.

Zdaj moramo nastaviti zagon aplikacije kot storitev. Zato ustvarimo datoteko

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

jo odprite v katerem koli urejevalniku in ji dajte naslednjo obliko (vpišite svojo pot 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

Nato izvedemo naslednje ukaze:

Prijavimo spremembe

sudo systemctl daemon-reload

Omogočimo samodejni zagon:

sudo systemctl enable webogram.service

Zaženite storitev:

sudo systemctl start webogram.service

Po izvedenih dejanjih bo Webogram še naprej dostopen na portu 8000.

Ker bomo nastavili dostop do našega Webograma preko nginx, bomo zaprli port 8000 za zunanje zahteve.

Za to uporabimo orodje udf (ali katero koli drugo primerno metodo):

sudo ufw deny 8000

V primeru, da bi se vseeno odločili uporabiti udf, vendar je onemogočen na strežniku — dodamo še pravila (da se vse ne podre) in omogočimo udf:

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

Nato se lotimo spreminjanja konfiguracije nginx.

Kot sem opozoril zgoraj — domnevamo, da je na vašem strežniku že nastavljen domena s ssl. Opozarjam vas le na to, da bo treba dodati v konfiguracijsko datoteko domene za pravilno delovanje:


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

Kaj dodajamo v nginx konfiguracijo:

  • Spremenimo osnovno lokacijo, ki bo posredovala zahtevke na port 8000, na katerem odgovarja Webogram.
  • Osnovno lokacijo zaščitimo s basic-auth. To je povsem simbolni korak, da zaščitimo našo aplikacijo pred radovednimi očmi in botom. (Prav tako, da ne bi bilo težav z blokadami.)
  • Množica lokacij s proxy_path do strežnikov Telegram je točno to, kar bomo uporabili za posredovanje naših zahtevkov.

Prav tako, ustvarimo datoteko /etc/nginx/passwd.htpasswd;, da bo imel nginx s čim preveriti uporabniške gesle.

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

Pokrećemo svoj Webogram instancu sa proxiranjem preko nginx

Ponovno zaženemo nginx:

sudo systemctl restart nginx

Sedaj bo Webogram dostopen le na naslovu mywebogram.localhost/app/index.html potem ko vnesete uporabniško ime in geslo, ki ste ga določili pri ustvarjanju ukaza htpasswd.

Zdaj je še malo: naredimo drobne spremembe v samem projektu.

Odprite v urejevalniku datoteko ~/webogram/app/js/lib/mtproto.js

In spremenite njen začetek v naslednji obliki:

/*!
 * Webogram v0.7.0 - messaging web application for MTProto
 * https://github.com/zhukov/webogram
 * Copyright (C) 2014 Igor Zhukov <igor.beatle@gmail.com>
 * 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
      }
...
 

Po tem je potrebno osvežiti stran z aplikacijo v brskalniku.

Odprite konzolo brskalnika in poglejte omrežne zahtevke aplikacije. Če vse deluje in XHR zahtevki gredo na vaš strežnik, potem je vse opravljeno pravilno in Webogram zdaj posreduje preko nginx.

Pokrećemo svoj Webogram instancu sa proxiranjem preko nginx

Upam, da bo ta vodič koristen še nekomu, poleg mene.

Le hvala vsem, ki so to prebrali do konca.

Če ima kdo težave ali sem naredil kakšne napake — z veseljem bom odgovoril ter vam poskušal pomagati v komentarjih ali sporočilih.

Izvor: habr.com

Kupite zanesljivo gostovanje za spletne strani z zaščito pred DDoS, VPS VDS strežniki 🔥 Kupite zanesljivo gostovanje za spletne strani z zaščito pred DDoS, VPS VDS strežniki | ProHoster