Vi hever Webogram-forekomsten vår med proxying via nginx

Hei Habr!

Nylig befant jeg meg i en situasjon der det var nødvendig å jobbe i et bedriftsnettverk med ufullstendig tilgang til Internett, og som du kan gjette fra tittelen, ble Telegram blokkert i det. Jeg er sikker på at denne situasjonen er kjent for mange.

Jeg kan klare meg uten instant messengers, men det var Telegram jeg trengte på jobb. Det var ikke mulig å installere klienten på en arbeidsmaskin, og det var heller ikke mulig å bruke en personlig bærbar PC. En annen løsning ser ut til å være å bruke den offisiell nettversjon, men som du kan gjette, var den også utilgjengelig. Jeg krysser umiddelbart av muligheten for å søke etter et uoffisielt speil (håper jeg av åpenbare grunner).

Heldigvis er Webogram et åpen kildekode-prosjekt hvis kildekode er tilgjengelig i GitHub forfatteren (som mange takk til ham!)
Selve installasjonen og lanseringen er ikke vanskelig, men under driftsforhold i et nettverk med blokkert tilgang til Telegram-servere, vil du være mer sannsynlig å bli skuffet enn vellykket, siden webversjonen sender forespørsler til Telegram-servere fra brukerens maskin.

Heldigvis er dette en ganske enkel (men ikke veldig åpenbar) løsning. Jeg vil advare deg om at jeg ikke er forfatteren av denne løsningen. Jeg klarte å finne den inn gren, som diskuterte et problem som ligner på mitt. Løsning foreslått av github-bruker tecknojock, det hjalp meg mye, men jeg er sikker på at det kan hjelpe noen andre, så jeg bestemte meg for å skrive denne opplæringen.

Under kuttet finner du trinn-for-trinn-oppsett av Webogram-speilet ditt og oppsett for proxying av forespørsler til Telegram-servere ved hjelp av nginx.

Som et eksempel valgte jeg en nyinstallert og oppdatert Ubuntu Server 18.04.3.

Advarsel: Denne opplæringen vil ikke inneholde instruksjoner om å sette opp et domene i nginx. Du må gjøre dette selv. Opplæringen forutsetter at du allerede har konfigurert et domene med ssl, og at selve serveren som du planlegger å konfigurere den på har tilgang til Telegram-serverne (på hvilken som helst måte du vil)

La oss anta at ip-en til denne serveren er 10.23.0.3, og domenenavnet er mywebogram.localhost

Med utgangspunkt i disse konvensjonene vil jeg gi eksempler på konfigurasjoner. Ikke glem å endre verdiene til dine egne.

Så la oss komme i gang:

For å kjøre Webogram trenger vi nodejs. Som standard, hvis vi installerer det fra Ubuntu-repositoriene, får vi nodejs versjon 8.x. Vi trenger 12.x:

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

Vi velger stedet hvor webprogrammet vårt skal være basert.

La oss for eksempel plassere den i roten til hjemmekatalogen. For å gjøre dette, klone det offisielle depotet til serveren vår:

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

Det neste trinnet er å installere alle avhengighetene som kreves for å kjøre applikasjonen:

cd webogram && npm install

La oss prøve en prøvekjøring. Kjør kommandoen:

npm start

Etter det prøver vi å åpne den i nettleseren

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

Hvis du til dette punktet har gjort alt riktig, åpnes webogram-autorisasjonssiden.

Nå må vi konfigurere applikasjonen til å kjøre som en tjeneste. For å gjøre dette, la oss lage en fil

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

åpne den i hvilken som helst editor og gi den følgende utseende (skriv inn banen til 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

Deretter kjører vi følgende kommandoer:

Bruker endringene

sudo systemctl daemon-reload

Aktiver autorun:

sudo systemctl enable webogram.service

La oss starte tjenesten:

sudo systemctl start webogram.service

Etter å ha fullført trinnene, vil Webogram fortsette å være tilgjengelig på port 8000.

Siden vi skal sette opp tilgang til webgrammet vårt via nginx, vil vi stenge port 8000 for forespørsler utenfra.

Vi bruker udf-verktøyet for dette (eller en hvilken som helst metode som er praktisk for deg):

sudo ufw deny 8000

I tilfelle du fortsatt bestemmer deg for å bruke udf, men den er deaktivert på serveren, legg til flere regler (slik at alt ikke faller fra hverandre) og aktiver udf:

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

La oss deretter begynne å endre nginx-konfigurasjonen.

Som jeg advarte ovenfor, antas det at et domene med ssl allerede er konfigurert på serveren din. Jeg vil bare gjøre deg oppmerksom på hva som må legges til i domenekonfigurasjonsfilen for at den skal fungere riktig:


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

Hva vi legger til nginx-konfigurasjonen:

  • Vi endrer rotplasseringen, som vil proxy-forespørsler til port 8000, som Webogram svarer på
  • Vi lukker rotplasseringen ved å bruke basic-auth. Dette er et rent symbolsk skritt for å lukke applikasjonen vår fra nysgjerrige øyne og roboter. (Og også for å unngå problemer med blokkering)
  • En haug med lokasjoner med proxy_path på Telegram-serveren er nøyaktig våre endepunkter som vi vil proxy-tjene våre forespørsler gjennom

La oss også lage en fil /etc/nginx/passwd.htpasswd;slik at nginx har noe å sjekke brukerpassord med.

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

Vi hever Webogram-forekomsten vår med proxying via nginx

Start nginx på nytt:

sudo systemctl restart nginx

Nå vil Webogram kun være tilgjengelig kl mywebogram.localhost/app/index.html etter at påloggingsnavnet og passordet du definerte da du opprettet htpasswd-kommandoen er angitt.

Det er lite igjen: vi skal gjøre små endringer i selve prosjektet.

Åpne filen i et redigeringsprogram ~/webogram/app/js/lib/mtproto.js

Og bring begynnelsen til følgende 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
      }
...
 

Etter dette må du oppdatere applikasjonssiden i nettleseren.

Åpne nettleserkonsollen og se på applikasjonens nettverksforespørsler. Hvis alt fungerer og XHR-forespørsler går til serveren din, er alt gjort riktig, og Webogram er nå proxy via nginx.

Vi hever Webogram-forekomsten vår med proxying via nginx

Jeg håper at denne opplæringen vil være nyttig for noen andre enn meg.

Tusen takk til alle som leser til slutt.

Hvis noen har noen problemer eller jeg har gjort noen unøyaktigheter, svarer jeg gjerne og prøver å hjelpe deg i kommentarfeltet eller i PM.

Kilde: www.habr.com

Legg til en kommentar