Wir heben unsere Webogram-Instanz mit Proxys über nginx an

Hallo, Habra!

Kürzlich befand ich mich in einer Situation, in der ich innerhalb eines Unternehmensnetzwerks mit eingeschränktem Internetzugang arbeiten musste, und wie Sie aus dem Titel erahnen können – Telegram war darin blockiert. Ich bin mir sicher, dass diese Situation vielen bekannt ist.

Ich kann problemlos ohne Messenger auskommen, dennoch benötigte ich gerade Telegram für die Arbeit. Es war nicht möglich, den Client auf dem Arbeitsgerät zu installieren, und die Nutzung meines persönlichen Laptops war ebenfalls nicht möglich. Eine weitere Lösung wäre, die offizielle Webversion, aber wie Sie sich denken können – auch die war nicht verfügbar. Ich schließe die Option aus, ein inoffizielles Spiegelbild zu suchen (aus hoffentlich offensichtlichen Gründen).

Glücklicherweise ist Webogram ein Open-Source-Projekt, dessen Quellcode in github seinem Repository verfügbar ist (Dafür danke ich ihm sehr!)
Die Installation und der Start sind nicht kompliziert, jedoch erwartet Sie in einer Umgebung mit blockiertem Zugang zu den Telegram-Servern eher Enttäuschung als Erfolg, da die Webversion Anfragen von dem Nutzergerät an die Telegram-Server sendet.

Glücklicherweise lässt sich dies ziemlich einfach (wenn auch nicht sehr offensichtlich) beheben. Ich möchte darauf hinweisen, dass ich nicht der Autor dieser Lösung bin. Ich konnte sie finden in einem Thread, in dem ein Problem besprochen wurde, das meinem ähnlich war. Die Lösung, die der Benutzer github tecknojockvorgeschlagen hat, hat mir sehr geholfen, aber ich bin mir sicher, dass sie auch anderen helfen kann, weshalb ich mich entschlossen habe, dieses Tutorial zu schreiben.

Unter dem Cut erwartet Sie eine Schritt-für-Schritt-Anleitung zur Einrichtung Ihres eigenen Webogram-Spiegels und zur Konfiguration der Proxy-Weiterleitung seiner Anfragen an die Telegram-Server unter Verwendung von nginx.

Als Beispiel habe ich das gerade installierte und aktualisierte Ubuntu Server 18.04.3 gewählt.

Achtung: In diesem Tutorial werden keine Anweisungen zur Konfiguration der Domain in nginx gegeben. Dies müssen Sie selbst erledigen. Das Tutorial geht davon aus, dass Sie bereits eine Domain mit SSL eingerichtet haben und dass der Server, auf dem die Einrichtung geplant ist, Zugang zu den Telegram-Servern hat (auf jede erdenkliche Weise)

Nehmen wir an, dass die IP dieses Servers 10.23.0.3 ist und der Domainname mywebogram.localhost

Ausgehend von diesen Annahmen werde ich Beispiele für Konfigurationen angeben. Vergessen Sie nicht, die Werte durch Ihre eigenen zu ersetzen.

Fangen wir an:

Um Webogram zu starten, benötigen wir Node.js. Standardmäßig, wenn wir es aus den Ubuntu-Repositories installieren, erhalten wir Node.js Version 8.x. Wir benötigen jedoch 12.x:

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

Wählen wir den Ort, an dem unser Webogram gehostet werden soll.

Als Beispiel platzieren wir es im Wurzelverzeichnis des Home-Verzeichnisses. Dafür klonen wir das offizielle Repository auf unseren Server:

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

Der nächste Schritt besteht darin, alle Abhängigkeiten zu installieren, die für den Betrieb der Anwendung erforderlich sind:

cd webogram && npm install

Lassen Sie uns einen Teststart durchführen. Führen Sie den folgenden Befehl aus:

npm start

Danach versuchen wir, es im Browser zu öffnen.

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

Wenn Sie bis zu diesem Punkt alles richtig gemacht haben, öffnet sich die Anmeldeseite von Webogram.

Jetzt müssen wir den Start der Anwendung als Dienst einrichten. Dazu erstellen wir die Datei

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

wir öffnen sie in einem beliebigen Editor und geben ihr das folgende Aussehen (füllen Sie Ihren Pfad zum 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

Danach führen wir die folgenden Befehle aus:

Wir wenden die Änderungen an:

sudo systemctl daemon-reload

Wir aktivieren den Autostart:

sudo systemctl enable webogram.service

Starten Sie den Dienst:

sudo systemctl start webogram.service

Nach den durchgeführten Aktionen bleibt Webogram auf Port 8000 verfügbar.

Da wir den Zugang zu unserem Webogram über Nginx einrichten werden, schließen wir Port 8000 für externe Anfragen.

Verwenden Sie dazu das Dienstprogramm udf (oder eine für Sie bequeme Methode):

sudo ufw deny 8000

Für den Fall, dass Sie sich dennoch entscheiden, udf zu verwenden, es jedoch auf dem Server deaktiviert ist – fügen Sie einige Regeln hinzu (damit alles nicht zusammenbricht) und aktivieren Sie udf:

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

Als Nächstes beginnen wir mit der Änderung der Nginx-Konfiguration.

Wie ich oben erwähnt habe – es wird vorausgesetzt, dass auf Ihrem Server bereits eine Domain mit SSL eingerichtet ist. Ich weise nur darauf hin, dass Sie in die Konfigurationsdatei der Domain für eine korrekte Funktion eintragen müssen:


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 Hauptstandort, der Anfragen an Port 8000 weiterleitet, auf dem Webogram antwortet.
  • Der Hauptstandort wird durch basic-auth geschützt. Dies ist ein rein symbolischer Schritt, um unsere Anwendung vor fremden Augen und Bots zu schützen. (Außerdem um Probleme mit Sperrungen zu vermeiden)
  • Eine Menge Standorte mit proxy_path auf Telegram-Server — das sind genau unsere Endpunkte, über die wir unsere Anfragen weiterleiten werden.

Außerdem erstellen wir eine Datei /etc/nginx/passwd.htpasswd;, damit Nginx die Passwörter der Benutzer überprüfen kann.

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

Wir heben unsere Webogram-Instanz mit Proxys über nginx an

Wir starten Nginx neu:

sudo systemctl restart nginx

Jetzt wird Webogram nur unter der Adresse verfügbar sein mywebogram.localhost/app/index.html nachdem der Benutzername und das Passwort eingegeben wurden, die Sie bei der Erstellung des htpasswd-Befehls festgelegt haben.

Es bleibt noch etwas zu tun: Wir nehmen einige kleine Änderungen am Projekt selbst vor.

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

und bringen Sie ihren Anfang in die folgende Form:

/*!
 * Webogram v0.7.0 - messaging web application for MTProto
 * https://github.com/zhukov/webogram
 * Copyright (C) 2014 Igor Zhukov <igor.beatle@gmail.com>
 * 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 Seite mit der Anwendung im Browser aktualisieren.

Öffnen Sie die Browser-Konsole und überprüfen Sie die Netzwerk-Anfragen der Anwendung. Wenn alles funktioniert und die XHR-Anfragen an Ihren Server gesendet werden – dann ist alles richtig gemacht, und Webogram wird nun über Nginx weitergeleitet.

Wir heben unsere Webogram-Instanz mit Proxys über nginx an

Ich hoffe, dass dieses Tutorial auch anderen nützlich sein wird, nicht nur mir.

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

Wenn jemand auf Schwierigkeiten gestoßen ist oder ich Unstimmigkeiten gemacht habe – ich beantworte gerne Fragen und versuche, euch in den Kommentaren oder per privater Nachricht zu helfen.

Quelle: habr.com

60GB SSD 8Gb DDR4