Webogram-példányunkat nginx-en keresztüli proxyval hozzuk létre

Szia Habr!

Nemrég olyan helyzetbe kerültem, hogy egy vállalati hálózaton belül kellett dolgozni, hiányos internet-hozzáféréssel, és ahogy a címből sejthető, a Telegram blokkolva volt benne. Biztos vagyok benne, hogy ez a helyzet sokak számára ismerős.

Megteszem az azonnali üzenetküldőket, de a Telegramra volt szükségem a munkához. Nem lehetett munkagépre telepíteni a klienst, és nem lehetett személyes laptopot sem használni. Egy másik megoldásnak tűnik a használata hivatalos webes verzió, de ahogy sejthető, ez sem volt elérhető. Azonnal kihúzom a nem hivatalos tükör keresésének lehetőségét (remélem érthető okokból).

Szerencsére a Webogram egy nyílt forráskódú projekt, amelynek forráskódja elérhető GitHub szerzője (Miért köszönet neki!)
Maga a telepítés és az indítás nem nehéz, azonban a Telegram-szerverekhez való blokkolt hozzáférésű hálózaton belüli működési feltételek mellett nagyobb valószínűséggel lesz csalódott, mint sikeres, mivel a webes verzió kéréseket küld a Telegram-kiszolgálóknak a felhasználó gépéről.

Szerencsére ez egy meglehetősen egyszerű (de nem túl nyilvánvaló) javítás. Szeretném figyelmeztetni, hogy ennek a megoldásnak nem én vagyok a szerzője. Sikerült megtalálnom benne ág, amely az enyémhez hasonló problémát tárgyalt. Github felhasználó által javasolt megoldás tecknojock, nekem nagyon sokat segített, de biztos vagyok benne, hogy másnak is tud segíteni, ezért úgy döntöttem, megírom ezt az oktatóanyagot.

A kivágás alatt a Webogram tükör lépésről lépésre történő beállítását és a kérések Telegram szerverekhez történő proxyjának beállítását találja az nginx használatával.

Példaként egy frissen telepített és frissített Ubuntu Server 18.04.3-at választottam.

Megjegyzés: Ez az oktatóanyag nem tartalmaz utasításokat a domain beállításához az nginxben. Ezt magának kell megtennie. Az oktatóanyag feltételezi, hogy már konfigurált egy tartományt az ssl-lel, és maga a kiszolgáló, amelyen konfigurálni szeretné, hozzáfér a Telegram-szerverekhez (bármilyen módon).

Tegyük fel, hogy ennek a szervernek az ip-je 10.23.0.3, a domain neve pedig mywebogram.localhost

Ezen konvenciók alapján adok példákat a konfigurációkra. Ne felejtse el megváltoztatni az értékeket a sajátjára.

Tehát kezdjük:

A Webogram futtatásához nodejs-ekre van szükségünk. Alapértelmezés szerint, ha az Ubuntu tárolókból telepítjük, akkor a nodejs 8.x verzióját kapjuk. Szükségünk van a 12.x-re:

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

Webogramunk székhelyét mi választjuk ki.

Például helyezzük el a saját könyvtár gyökerébe. Ehhez klónozza a hivatalos adattárat a szerverünkre:

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

A következő lépés az alkalmazás futtatásához szükséges összes függőség telepítése:

cd webogram && npm install

Próbáljunk meg egy próbaüzemet. Futtassa a parancsot:

npm start

Ezt követően megpróbáljuk megnyitni a böngészőben

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

Ha eddig a pontig mindent helyesen csinált, megnyílik a Webogram engedélyezési oldal.

Most be kell állítanunk az alkalmazást, hogy szolgáltatásként fusson. Ehhez hozzunk létre egy fájlt

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

nyissa meg bármelyik szerkesztőben, és adja meg a következő megjelenést (adja meg a WorkDirectory elérési útját)

[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

Ezután a következő parancsokat futtatjuk:

A változtatások alkalmazása

sudo systemctl daemon-reload

Automatikus indítás engedélyezése:

sudo systemctl enable webogram.service

Kezdjük a szolgáltatással:

sudo systemctl start webogram.service

A lépések elvégzése után a Webogram továbbra is elérhető lesz a 8000-es porton.

Mivel a Webogramunkhoz való hozzáférést az nginx-en keresztül fogjuk beállítani, a 8000-es portot lezárjuk a külső kérések számára.

Ehhez az udf segédprogramot használjuk (vagy bármely Önnek megfelelő módszert):

sudo ufw deny 8000

Abban az esetben, ha továbbra is az udf használata mellett dönt, de az le van tiltva a szerveren, adjon hozzá további szabályokat (hogy minden ne essen szét), és engedélyezze az udf-et:

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

Ezután kezdjük el módosítani az nginx konfigurációját.

Ahogy fentebb figyelmeztettem, feltételezzük, hogy az ssl-t használó tartomány már be van állítva a szerveren. Csak arra hívom fel a figyelmet, hogy mit kell hozzáadni a tartománykonfigurációs fájlhoz, hogy megfelelően működjön:


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

Amit hozzáadunk az nginx konfigurációhoz:

  • Megváltoztatjuk a gyökér helyét, amely proxy kéréseket küld a 8000-es portra, amelyen a Webogram válaszol
  • Bezárjuk a gyökér helyét a basic-auth használatával. Ez pusztán szimbolikus lépés az alkalmazásunk bezárásához a kíváncsiskodó szemek és botok elől. (És a blokkolással kapcsolatos problémák elkerülése érdekében)
  • A Telegram szerveren lévő proxy_path azonosítójú helyek egy csomó pontja pontosan a végpontjaink, amelyeken keresztül proxyzni fogjuk kéréseinket

Ezenkívül hozzunk létre egy fájlt /etc/nginx/passwd.htpasswd;hogy az nginxnek legyen mivel ellenőriznie a felhasználói jelszavakat.

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

Webogram-példányunkat nginx-en keresztüli proxyval hozzuk létre

Indítsa újra az nginxet:

sudo systemctl restart nginx

A Webogram mostantól csak a címen lesz elérhető mywebogram.localhost/app/index.html a htpasswd parancs létrehozásakor megadott bejelentkezési név és jelszó megadása után.

Már alig van hátra: apró változtatásokat hajtunk végre magán a projekten.

Nyissa meg a fájlt egy szerkesztőben ~/webogram/app/js/lib/mtproto.js

És hozza az elejét a következő formába:

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

Ezt követően frissítenie kell az alkalmazás oldalát a böngészőben.

Nyissa meg a böngészőkonzolt, és nézze meg az alkalmazás hálózati kéréseit. Ha minden működik, és az XHR-kérések a kiszolgálóra érkeznek, akkor minden megfelelően történik, és a Webogram most az nginx-en keresztül proxyzik.

Webogram-példányunkat nginx-en keresztüli proxyval hozzuk létre

Remélem, hogy ez az oktatóanyag másnak is hasznos lesz rajtam kívül.

Nagyon köszönöm mindenkinek, aki a végéig elolvasta.

Ha valakinek nehézségei vannak, vagy pontatlanságot követtem el, szívesen válaszolok és próbálok segíteni kommentben vagy PM-ben.

Forrás: will.com

Hozzászólás