We verhogen onze Webogram-instantie met proxying via nginx

Hé Habr!

Onlangs bevond ik me in een situatie waarin het nodig was om binnen een bedrijfsnetwerk te werken met onvolledige toegang tot internet en, zoals je uit de titel kunt raden, werd Telegram daarin geblokkeerd. Ik weet zeker dat deze situatie voor velen bekend is.

Ik kan zonder instant messengers, maar het was Telegram dat ik nodig had voor mijn werk. Het was niet mogelijk om de client op een werkcomputer te installeren, noch was het mogelijk om een ​​persoonlijke laptop te gebruiken. Een andere oplossing lijkt te zijn om het te gebruiken officiële webversie, maar zoals je kunt raden, was deze ook niet beschikbaar. Ik streep onmiddellijk de optie door om naar een onofficiële spiegel te zoeken (ik hoop om voor de hand liggende redenen).

Gelukkig is Webogram een ​​open source-project waarvan de broncode beschikbaar is GitHub de auteur (waarvoor veel dank aan hem!)
De installatie en lancering zelf is niet moeilijk, maar onder omstandigheden binnen een netwerk met geblokkeerde toegang tot Telegram-servers zul je eerder teleurgesteld dan succesvol zijn, aangezien de webversie vanaf de machine van de gebruiker verzoeken naar Telegram-servers stuurt.

Gelukkig is dit een vrij eenvoudige (maar niet erg voor de hand liggende) oplossing. Ik wil u waarschuwen dat ik niet de auteur van deze oplossing ben. Ik heb het erin weten te vinden tak, waarin een probleem werd besproken dat vergelijkbaar was met het mijne. Oplossing voorgesteld door github-gebruiker tecknojock, het heeft me veel geholpen, maar ik ben er zeker van dat het iemand anders kan helpen, dus besloot ik deze tutorial te schrijven.

Onder de afbeelding vindt u de stapsgewijze installatie van uw Webogram-mirror en de configuratie van het proxyen van zijn verzoeken aan Telegram-servers met behulp van nginx.

Als voorbeeld heb ik een vers geïnstalleerde en bijgewerkte Ubuntu Server 18.04.3 gekozen.

Opmerking: Deze tutorial bevat geen instructies voor het instellen van een domein in nginx. U moet dit zelf doen. De tutorial gaat ervan uit dat je al een domein met SSL hebt geconfigureerd en dat de server zelf waarop je het wilt configureren toegang heeft tot de Telegram-servers (op welke manier dan ook)

Laten we aannemen dat het ip-adres van deze server 10.23.0.3 is en dat de domeinnaam mywebogram.localhost is

Op basis van deze conventies zal ik voorbeelden van configuraties geven. Vergeet niet de waarden naar uw eigen waarden te wijzigen.

Vraag, antwoord:

Om Webogram uit te voeren, hebben we nodejs nodig. Als we het vanuit de Ubuntu-repository's installeren, krijgen we standaard nodejs versie 8.x. We hebben 12.x nodig:

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

We kiezen de plaats waar ons webogram zal worden gebaseerd.

Laten we het bijvoorbeeld in de hoofdmap van de thuismap plaatsen. Om dit te doen, kloont u de officiële repository naar onze server:

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

De volgende stap is het installeren van alle afhankelijkheden die nodig zijn om de applicatie uit te voeren:

cd webogram && npm install

Laten we een proefrit proberen. Voer de opdracht uit:

npm start

Daarna proberen we het in de browser te openen

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

Als u tot nu toe alles correct heeft gedaan, wordt de Webogram-autorisatiepagina geopend.

Nu moeten we de applicatie configureren om als een service te draaien. Om dit te doen, gaan we een bestand maken

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

open het in een willekeurige editor en geef het het volgende uiterlijk (voer uw pad naar 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

Vervolgens voeren we de volgende opdrachten uit:

Het toepassen van de wijzigingen

sudo systemctl daemon-reload

Automatisch uitvoeren inschakelen:

sudo systemctl enable webogram.service

Laten we de dienst starten:

sudo systemctl start webogram.service

Na het voltooien van de stappen blijft Webogram beschikbaar op poort 8000.

Omdat we de toegang tot ons Webogram via nginx gaan opzetten, sluiten we poort 8000 voor verzoeken van buitenaf.

We gebruiken hiervoor het udf-hulpprogramma (of een andere methode die voor u geschikt is):

sudo ufw deny 8000

Als je toch besluit om udf te gebruiken, maar het is uitgeschakeld op de server, voeg dan meer regels toe (zodat alles niet uit elkaar valt) en schakel udf in:

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

Laten we vervolgens beginnen met het wijzigen van de nginx-configuratie.

Zoals ik hierboven waarschuwde, wordt ervan uitgegaan dat er al een domein met SSL op uw server is geconfigureerd. Ik zal alleen uw aandacht vestigen op wat er aan het domeinconfiguratiebestand moet worden toegevoegd om het correct te laten werken:


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 we toevoegen aan de nginx-configuratie:

  • We wijzigen de hoofdlocatie, die verzoeken naar poort 8000 zal proxyeren, waarop Webogram reageert
  • We sluiten de hoofdlocatie af met basic-authenticatie. Dit is een puur symbolische stap om onze applicatie af te sluiten voor nieuwsgierige blikken en bots. (En ook om problemen met blokkeren te voorkomen)
  • Een aantal locaties met proxy_path op de Telegram-server zijn precies onze eindpunten waarmee we onze verzoeken zullen proxyen

Laten we ook een bestand maken /etc/nginx/passwd.htpasswd;zodat nginx iets heeft om gebruikerswachtwoorden mee te controleren.

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

We verhogen onze Webogram-instantie met proxying via nginx

Start nginx opnieuw:

sudo systemctl restart nginx

Nu is Webogram alleen beschikbaar op mijnwebogram.localhost/app/index.html nadat de login en het wachtwoord zijn ingevoerd die u hebt gedefinieerd bij het maken van de opdracht htpasswd.

Er blijft weinig over: we zullen kleine wijzigingen aanbrengen in het project zelf.

Open het bestand in een editor ~/webogram/app/js/lib/mtproto.js

En breng het begin ervan in de volgende vorm:

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

Hierna moet u de applicatiepagina in de browser vernieuwen.

Open uw browserconsole en bekijk de netwerkverzoeken van de applicatie. Als alles werkt en XHR-verzoeken naar uw server gaan, is alles correct gedaan en wordt Webogram nu via nginx geproxyd.

We verhogen onze Webogram-instantie met proxying via nginx

Ik hoop dat deze tutorial nuttig zal zijn voor iemand anders naast mij.

Hartelijk dank aan iedereen die tot het einde heeft gelezen.

Als iemand problemen heeft of als ik onnauwkeurigheden heb gemaakt, zal ik graag antwoorden en proberen je te helpen in de reacties of in PM.

Bron: www.habr.com

Voeg een reactie