Creăm instanța noastră Webogram cu proxy prin nginx

Hei Habr!

Recent m-am trezit într-o situație în care era necesar să lucrez în interiorul unei rețele corporative cu acces incomplet la Internet și, după cum poți ghici din titlu, Telegram a fost blocat în ea. Sunt sigur că această situație este familiară pentru mulți.

Mă descurc fără mesagerie instant, dar Telegram aveam nevoie pentru muncă. Nu a fost posibilă instalarea clientului pe o mașină de lucru și nici nu a fost posibilă utilizarea unui laptop personal. O altă soluție pare să fie folosirea ei versiune web oficială, dar, după cum puteți ghici, a fost, de asemenea, indisponibil. Trimit imediat varianta de a cauta o oglinda neoficiala (sper din motive evidente).

Din fericire, Webogram este un proiect open source al cărui cod sursă este disponibil în github autorului său (pentru care îi mulțumesc mult!)
Instalarea și lansarea în sine nu sunt dificile, totuși, în condițiile de funcționare într-o rețea cu acces blocat la serverele Telegram, veți fi mai probabil să fiți dezamăgit decât reușit, deoarece versiunea web trimite solicitări către serverele Telegram de pe computerul utilizatorului.

Din fericire, aceasta este o soluție destul de simplă (dar nu foarte evidentă). Aș dori să vă avertizez că nu eu sunt autorul acestei soluții. Am reusit sa-l gasesc in ramură, care a discutat o problemă asemănătoare cu a mea. Soluție sugerată de utilizatorul github tecknojock, m-a ajutat foarte mult, totuși, sunt sigur că poate ajuta pe altcineva, așa că m-am hotărât să scriu acest tutorial.

Sub tăietură veți găsi configurarea pas cu pas a oglinzii dvs. Webogram și configurarea proxy-ului cererilor sale către serverele Telegram folosind nginx.

De exemplu, am ales un Ubuntu Server 18.04.3 proaspăt instalat și actualizat.

Atenție: Acest tutorial nu va include instrucțiuni despre configurarea unui domeniu în nginx. Trebuie să faci asta singur. Tutorialul presupune că ați configurat deja un domeniu cu ssl și că serverul însuși pe care intenționați să îl configurați are acces la serverele Telegram (în orice mod doriți)

Să presupunem că ip-ul acestui server este 10.23.0.3, iar numele domeniului este mywebogram.localhost

Pe baza acestor convenții, voi da exemple de configurații. Nu uitați să schimbați valorile cu propriile dvs.

Deci, să începem:

Pentru a rula Webogram, avem nevoie de nodejs. În mod implicit, dacă îl instalăm din depozitele Ubuntu, vom obține versiunea 8.x a nodejs. Avem nevoie de 12.x:

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

Alegem locul unde se va baza Webograma.

De exemplu, să-l plasăm în rădăcina directorului principal. Pentru a face acest lucru, clonați depozitul oficial pe serverul nostru:

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

Următorul pas este să instalați toate dependențele necesare pentru a rula aplicația:

cd webogram && npm install

Să încercăm un test de rulare. Rulați comanda:

npm start

După aceea, încercăm să-l deschidem în browser

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

Dacă până în acest moment ați făcut totul corect, se va deschide pagina de autorizare Webogram.

Acum trebuie să configuram aplicația să ruleze ca serviciu. Pentru a face acest lucru, să creăm un fișier

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

deschideți-l în orice editor și dați-i următorul aspect (introduceți calea către 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

Apoi rulăm următoarele comenzi:

Aplicarea modificărilor

sudo systemctl daemon-reload

Activați rularea automată:

sudo systemctl enable webogram.service

Să începem serviciul:

sudo systemctl start webogram.service

După finalizarea pașilor, Webogram va continua să fie disponibil pe portul 8000.

Deoarece vom configura accesul la Webograma prin nginx, vom închide portul 8000 pentru solicitările din exterior.

Folosim utilitarul udf pentru aceasta (sau orice metodă convenabilă pentru dvs.):

sudo ufw deny 8000

În cazul în care tot decideți să utilizați udf, dar este dezactivat pe server, adăugați mai multe reguli (pentru ca totul să nu se destrame) și activați udf:

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

În continuare, să începem să schimbăm configurația nginx.

După cum am avertizat mai sus, se presupune că un domeniu cu ssl este deja configurat pe serverul dumneavoastră. Vă voi atrage atenția doar asupra a ceea ce va trebui adăugat la fișierul de configurare a domeniului pentru ca acesta să funcționeze corect:


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

Ce adăugăm la configurația nginx:

  • Schimbăm locația rădăcină, care va trimite solicitările proxy către portul 8000, la care răspunde Webogram
  • Închidem locația rădăcină folosind basic-auth. Acesta este un pas pur simbolic pentru a închide aplicația noastră de privirile indiscrete și roboții. (Și, de asemenea, pentru a evita problemele cu blocarea)
  • O grămadă de locații cu proxy_path pe serverul Telegram sunt exact punctele noastre finale prin care vom trimite cererile noastre.

De asemenea, să creăm un fișier /etc/nginx/passwd.htpasswd;astfel încât nginx să aibă cu ce să verifice parolele utilizatorilor.

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

Creăm instanța noastră Webogram cu proxy prin nginx

Reporniți nginx:

sudo systemctl restart nginx

Acum Webogram va fi disponibil doar la mywebogram.localhost/app/index.html după ce sunt introduse datele de conectare și parola pe care le-ați definit la crearea comenzii htpasswd.

A mai rămas puțin: vom face mici modificări proiectului în sine.

Deschideți fișierul într-un editor ~/webogram/app/js/lib/mtproto.js

Și aduceți începutul său la următoarea formă:

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

După aceasta, trebuie să reîmprospătați pagina aplicației în browser.

Deschideți consola browserului și uitați-vă la solicitările de rețea ale aplicației. Dacă totul funcționează și solicitările XHR ajung la serverul dvs., atunci totul este făcut corect, iar Webogram este acum trimis prin proxy prin nginx.

Creăm instanța noastră Webogram cu proxy prin nginx

Sper că acest tutorial va fi de folos altcuiva în afară de mine.

Multumesc mult tuturor celor care au citit pana la sfarsit.

Dacă cineva are dificultăți sau am făcut inexactități, voi răspunde cu plăcere și voi încerca să vă ajut în comentarii sau în PM.

Sursa: www.habr.com

Adauga un comentariu