Wir erhöhen unsere Webogram-Instanz mit Proxying über Nginx

Hey Habr!

Kürzlich befand ich mich in einer Situation, in der es notwendig war, in einem Unternehmensnetzwerk mit unvollständigem Zugang zum Internet zu arbeiten, und wie Sie dem Titel entnehmen können, war Telegram darin blockiert. Ich bin sicher, dass diese Situation vielen bekannt ist.

Ich kann auf Instant Messenger verzichten, aber für die Arbeit brauchte ich Telegram. Es war weder möglich, den Client auf einem Arbeitscomputer zu installieren, noch war die Verwendung eines persönlichen Laptops möglich. Eine andere Lösung scheint darin zu bestehen, es zu verwenden offizielle Webversion, aber wie Sie sich vorstellen können, war es auch nicht verfügbar. Ich streiche sofort die Option, nach einem inoffiziellen Spiegel zu suchen (hoffentlich aus offensichtlichen Gründen).

Glücklicherweise ist Webogram ein Open-Source-Projekt, dessen Quellcode in verfügbar ist github sein Autor (Vielen Dank an ihn!)
Die Installation und der Start selbst sind nicht schwierig, allerdings werden Sie unter Betriebsbedingungen in einem Netzwerk mit blockiertem Zugriff auf Telegram-Server eher enttäuscht als erfolgreich sein, da die Webversion Anfragen vom Computer des Benutzers an Telegram-Server sendet.

Glücklicherweise ist dies eine ziemlich einfache (aber nicht sehr offensichtliche) Lösung. Ich möchte Sie warnen, dass ich nicht der Autor dieser Lösung bin. Ich habe es geschafft, es darin zu finden Zweig, in dem ein ähnliches Problem wie ich besprochen wurde. Vom Github-Benutzer vorgeschlagene Lösung tecknojock, es hat mir sehr geholfen, aber ich bin sicher, dass es auch jemand anderem helfen kann, also habe ich beschlossen, dieses Tutorial zu schreiben.

Unterhalb des Ausschnitts finden Sie eine Schritt-für-Schritt-Anleitung zur Einrichtung Ihres Webogram-Spiegels und zur Einrichtung der Weiterleitung seiner Anfragen an Telegram-Server mithilfe von Nginx.

Als Beispiel habe ich einen frisch installierten und aktualisierten Ubuntu Server 18.04.3 gewählt.

Hinweis: Dieses Tutorial enthält keine Anweisungen zum Einrichten einer Domäne in Nginx. Sie müssen dies selbst tun. Das Tutorial geht davon aus, dass Sie bereits eine Domäne mit SSL konfiguriert haben und dass der Server selbst, auf dem Sie sie konfigurieren möchten, Zugriff auf die Telegram-Server hat (auf beliebige Weise).

Nehmen wir an, dass die IP dieses Servers 10.23.0.3 ist und der Domänenname mywebogram.localhost lautet

Basierend auf diesen Konventionen werde ich Beispiele für Konfigurationen geben. Vergessen Sie nicht, die Werte in Ihre eigenen zu ändern.

Also, fangen wir an:

Um Webogram auszuführen, benötigen wir NodeJS. Wenn wir es aus den Ubuntu-Repositorys installieren, erhalten wir standardmäßig NodeJS-Version 8.x. Wir brauchen 12.x:

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

Wir wählen den Ort aus, an dem unser Webogramm basieren soll.

Platzieren wir es beispielsweise im Stammverzeichnis des Home-Verzeichnisses. Klonen Sie dazu das offizielle Repository auf unseren Server:

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

Der nächste Schritt besteht darin, alle zum Ausführen der Anwendung erforderlichen Abhängigkeiten zu installieren:

cd webogram && npm install

Versuchen wir einen Testlauf. Führen Sie den Befehl aus:

npm start

Danach versuchen wir es im Browser zu öffnen

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

Wenn Sie bis hierhin alles richtig gemacht haben, öffnet sich die Webogram-Autorisierungsseite.

Jetzt müssen wir die Anwendung so konfigurieren, dass sie als Dienst ausgeführt wird. Dazu erstellen wir eine Datei

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

Öffnen Sie es in einem beliebigen Editor und geben Sie ihm das folgende Aussehen (geben Sie Ihren Pfad zu WorkDirectory ein)

[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

Dann führen wir die folgenden Befehle aus:

Anwenden der Änderungen

sudo systemctl daemon-reload

Autorun aktivieren:

sudo systemctl enable webogram.service

Starten wir den Dienst:

sudo systemctl start webogram.service

Nach Abschluss der Schritte ist Webogram weiterhin auf Port 8000 verfügbar.

Da wir den Zugriff auf unser Webogramm über Nginx einrichten, werden wir Port 8000 für Anfragen von außen schließen.

Wir verwenden hierfür das UDF-Dienstprogramm (oder eine andere für Sie geeignete Methode):

sudo ufw deny 8000

Falls Sie sich dennoch für die Verwendung von udf entscheiden, es aber auf dem Server deaktiviert ist, fügen Sie weitere Regeln hinzu (damit nicht alles auseinanderfällt) und aktivieren Sie udf:

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

Beginnen wir als Nächstes mit der Änderung der Nginx-Konfiguration.

Wie ich oben gewarnt habe, wird davon ausgegangen, dass auf Ihrem Server bereits eine Domain mit SSL konfiguriert ist. Ich möchte Sie nur darauf aufmerksam machen, was zur Domänenkonfigurationsdatei hinzugefügt werden muss, damit sie ordnungsgemäß funktioniert:


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

Was wir zur Nginx-Konfiguration hinzufügen:

  • Wir ändern den Root-Speicherort, der Anfragen an Port 8000 weiterleitet, auf den Webogram antwortet
  • Wir schließen den Root-Speicherort mit Basic-Auth. Dies ist ein rein symbolischer Schritt, um unsere Anwendung vor neugierigen Blicken und Bots zu schützen. (Und auch um Blockierungsprobleme zu vermeiden)
  • Eine Reihe von Standorten mit „proxy_path“ auf dem Telegram-Server sind genau unsere Endpunkte, über die wir unsere Anfragen weiterleiten

Lassen Sie uns außerdem eine Datei erstellen /etc/nginx/passwd.htpasswd;damit Nginx etwas hat, mit dem er Benutzerkennwörter überprüfen kann.

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

Wir erhöhen unsere Webogram-Instanz mit Proxying über Nginx

Nginx neu starten:

sudo systemctl restart nginx

Jetzt ist Webogram nur noch unter verfügbar mywebogram.localhost/app/index.html nachdem der Benutzername und das Passwort eingegeben wurden, die Sie beim Erstellen des Befehls htpasswd definiert haben.

Es bleibt nur noch wenig übrig: Wir werden kleine Änderungen am Projekt selbst vornehmen.

Öffnen Sie die Datei in einem Editor ~/webogram/app/js/lib/mtproto.js

Und bringen Sie seinen Anfang in die folgende 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
      }
...
 

Danach müssen Sie die Anwendungsseite im Browser aktualisieren.

Öffnen Sie Ihre Browserkonsole und sehen Sie sich die Netzwerkanforderungen der Anwendung an. Wenn alles funktioniert und XHR-Anfragen an Ihren Server gehen, ist alles richtig gemacht und Webogram wird jetzt über Nginx weitergeleitet.

Wir erhöhen unsere Webogram-Instanz mit Proxying über Nginx

Ich hoffe, dass dieses Tutorial auch für jemand anderen als mich nützlich sein wird.

Vielen Dank an alle, die bis zum Ende gelesen haben.

Wenn jemand Schwierigkeiten hat oder ich Ungenauigkeiten gemacht habe, werde ich gerne antworten und versuchen, Ihnen in den Kommentaren oder per PN zu helfen.

Source: habr.com

Kommentar hinzufügen