Ons verhoog ons Webogram-instansie met proxying deur nginx

Haai Habr!

Ek het onlangs in 'n situasie beland waarin dit nodig was om binne 'n korporatiewe netwerk te werk met onvolledige toegang tot die internet en, soos u uit die titel kan raai, is Telegram daarin geblokkeer. Ek is seker dat hierdie situasie aan baie bekend is.

Ek kan sonder kitsboodskappers klaarkom, maar dit was Telegram wat ek nodig gehad het vir werk. Dit was nie moontlik om die kliënt op 'n werkende masjien te installeer nie, en dit was ook onmoontlik om 'n persoonlike skootrekenaar te gebruik. Nog 'n oplossing blyk te wees om dit te gebruik amptelike webweergawe, maar soos jy kan raai - dit was ook nie beskikbaar nie. Ek trek dadelik die opsie deur om 'n nie-amptelike spieël te vind (ek hoop om redelike ooglopende redes).

Gelukkig is Webogram 'n oopbronprojek waarvan die bronkode beskikbaar is in Github sy skrywer (waarvoor baie dankie aan hom!)
Die installering en bekendstelling self is nie moeilik nie, maar in bedryfsomstandighede binne 'n netwerk met geblokkeerde toegang tot Telegram-bedieners, sal u meer geneig wees om teleurgesteld te wees as suksesvol, aangesien die webweergawe versoeke na Telegram-bedieners stuur vanaf die gebruiker se masjien.

Gelukkig is dit 'n redelik eenvoudige (maar nie baie ooglopende) oplossing. Ek wil jou waarsku dat ek nie die skrywer van hierdie besluit is nie. Ek het daarin geslaag om dit in te vind tak, wat 'n probleem soortgelyk aan myne bespreek het. Oplossing voorgestel deur github gebruiker tekkie, dit het my baie gehelp, maar ek is seker dat dit iemand anders kan help, so ek het besluit om hierdie tutoriaal te skryf.

Onder die snit vind u 'n stap-vir-stap-opstelling van u Webogram-spieël en die opstel van proxying van sy versoeke aan Telegram-bedieners met behulp van nginx.

As voorbeeld het ek 'n vars geïnstalleerde en bygewerkte Ubuntu Server 18.04.3 gekies.

waarskuwing: Binne hierdie handleiding sal daar geen instruksies wees vir die opstel van 'n domein in nginx nie. Dit moet op jou eie gedoen word. Die handleiding neem aan dat jy reeds 'n domein met ssl gekonfigureer het, sowel as die bediener self, waarop die konfigurasie beplan word, het toegang tot die Telegram-bedieners (op enige manier wat jy wil)

Kom ons neem aan dat die ip van hierdie bediener 10.23.0.3 is, en die domeinnaam is mywebogram.localhost

Op grond van hierdie konvensies sal ek voorbeelde van konfigurasies gee. Moenie vergeet om die waardes na jou eie te verander nie.

Kom ons begin dus:

Om Webogram te laat loop, het ons nodejs nodig. By verstek, as jy dit installeer vanaf die Ubuntu-bewaarplekke, sal ons nodejs weergawe 8.x kry. Ons benodig 12.x:

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

Ons kies die plek waar ons Webogram gebaseer sal wees.

Kom ons plaas dit byvoorbeeld in die wortel van die tuisgids. Om dit te doen, kloon ons die amptelike bewaarplek na ons bediener:

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

Die volgende stap is om al die afhanklikhede te installeer wat nodig is om die toepassing te laat loop:

cd webogram && npm install

Kom ons probeer 'n toetslopie. Voer die opdrag uit:

npm start

Probeer daarna om in die blaaier oop te maak

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

As jy alles tot op hierdie punt korrek gedoen het, sal die Webogram-magtigingsbladsy oopmaak.

Nou moet ons die toepassing opstel om as 'n diens te loop. Om dit te doen, kom ons skep 'n lêer

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

maak dit oop in enige redigeerder en gee dit die volgende voorkoms (voer jou pad na die WorkDirectory in)

[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

Dan voer ons die volgende opdragte uit:

Pas veranderinge toe

sudo systemctl daemon-reload

Aktiveer outorun:

sudo systemctl enable webogram.service

Ons begin die diens:

sudo systemctl start webogram.service

Na die voltooide aksies sal Webogram steeds beskikbaar wees op poort 8000.

Aangesien ons toegang tot ons Webogram deur nginx sal konfigureer, sal ons poort 8000 sluit vir versoeke van buite.

Ons gebruik die udf-nutsding hiervoor (of enige metode wat vir jou gerieflik is):

sudo ufw deny 8000

As jy steeds besluit om udf te gebruik, maar dit is gedeaktiveer op die bediener, voeg meer reëls by (sodat alles nie uitmekaar val nie) en aktiveer udf:

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

Kom ons begin dan om die nginx-konfigurasie te verander.

Soos ek hierbo gewaarsku het, word aanvaar dat 'n domein met ssl reeds op u bediener opgestel is. Ek sal net u aandag vestig op wat by die domeinkonfigurasielêer gevoeg moet word vir korrekte werking:


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

Wat voeg ons by die nginx-konfigurasie:

  • Ons verander die wortelligging, wat proxy-versoeke sal na poort 8000, waarop Webogram reageer, sal verander
  • Ons sluit die wortelligging met basic-auth. Dit is 'n suiwer simboliese stap om ons toepassing te sluit van gierige oë en bots. (En ook sodat daar geen probleme met slotte is nie)
  • 'n Klomp liggings met proxy_path op die Telegram-bedieners is net ons eindpunte waardeur ons ons versoeke sal instaan

Kom ons skep ook 'n lêer /etc/nginx/passwd.htpasswd;sodat nginx iets het om gebruikerswagwoorde mee na te gaan.

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

Ons verhoog ons Webogram-instansie met proxying deur nginx

Herbegin nginx:

sudo systemctl restart nginx

Nou sal Webogram slegs beskikbaar wees by mywebogram.localhost/app/index.html nadat die gebruikersnaam en wagwoord wat jy gespesifiseer het toe jy die htpasswd-opdrag geskep het, ingevoer is.

Daar is nie veel oor nie: ons sal klein veranderinge aan die projek self maak.

Maak die lêer in die redigeerder oop ~/webogram/app/js/lib/mtproto.js

En laat dit so lyk:

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

Daarna moet u die bladsy met die toepassing in die blaaier verfris.

Maak die blaaierkonsole oop en kyk na die toepassing se netwerkversoeke. As alles werk, en XHR-versoeke gaan na jou bediener, dan word alles korrek gedoen, en Webogram word nou deur nginx gevolmagtig.

Ons verhoog ons Webogram-instansie met proxying deur nginx

Ek hoop dat hierdie tutoriaal nuttig sal wees vir iemand anders behalwe my.

Baie dankie aan almal wat tot die einde gelees het.

As iemand enige probleme het of ek het 'n paar onakkuraathede gemaak, sal ek met plesier antwoord en probeer om jou te help in die kommentaar of PM.

Bron: will.com

Voeg 'n opmerking