Erhöhen Sie Ihre Webogram-Instanz mit Proxy über Nginx

Hallo Habr!

Ich bin kürzlich in eine Situation geraten, in der es notwendig war, in einem Unternehmensnetzwerk mit unvollständigem Internetzugang zu arbeiten, und wie Sie aus der Überschrift ersehen können, war das Telegramm darin blockiert. Ich bin sicher, dass diese Situation vielen bekannt ist.

Ich kann auf Boten verzichten, aber es war ein Telegramm, das ich für die Arbeit brauchte. Es war nicht möglich, den Client auf einem funktionierenden Computer zu installieren oder einen persönlichen Laptop zu verwenden. Eine andere Lösung scheint darin zu bestehen, die offizielle Webversion zu verwenden , aber wie Sie sich vorstellen können, war sie auch nicht verfügbar. Ich lösche die Option sofort mit der Suche nach einem inoffiziellen Spiegel (ich hoffe aus offensichtlichen Gründen).

Glücklicherweise ist Webogram ein Open-Source-Projekt, dessen Quellcode auf github verfügbar istsein Autor (wofür ich ihm vielmals danke!)
Die Installation und der Start selbst sind keine große Sache. Unter Betriebsbedingungen innerhalb des Netzwerks mit blockiertem Zugriff auf Telegrammserver werden Sie jedoch eher enttäuscht als erfolgreich sein, da die Webversion Anfragen nach sendet Telegrammserver vom Computer des Benutzers.

Glücklicherweise ist dies recht einfach (aber nicht sehr offensichtlich) zu beheben. Ich möchte Sie warnen, dass ich nicht der Autor dieser Lösung bin. Ich habe es in einem Thread gefunden , in dem ein ähnliches Problem wie ich besprochen wurde. Die vom Benutzer github tecknojock vorgeschlagene Lösung hat mir sehr geholfen. Ich bin mir jedoch sicher, dass sie jemand anderem helfen kann. Deshalb habe ich beschlossen, dieses Tutorial zu schreiben.

Unter der Katze finden Sie eine schrittweise Konfiguration Ihres Webogram-Spiegels und Proxy-Einstellungen seiner Anforderungen an Telegrammserver mit nginx.

Als Beispiel habe ich den gerade installierten und aktualisierten Ubuntu Server 18.04.3 ausgewählt.

Hinweis: In diesem Lernprogramm finden Sie keine Anweisungen zum Einrichten einer Domain in Nginx. Dies muss unabhängig erfolgen. In diesem Lernprogramm wird davon ausgegangen, dass Sie bereits eine Domain mit ssl konfiguriert haben und der Server, auf dem Sie konfigurieren möchten, Zugriff auf Telegrammserver hat (wie Sie

möchten ). Angenommen, die IP-Adresse dieses Servers lautet 10.23.0.3 und der Domainname lautet mywebogram. localhost

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

Also

los geht's : Um Webogram auszuführen, benötigen wir nodejs. Wenn Sie es standardmäßig 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, an dem unser Webogramm basiert.

Zum Beispiel - wir werden es in einem Stammverzeichnis eines Home-Verzeichnisses ablegen. Dazu klonen wir 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 durchzuführen. Führen Sie den folgenden Befehl aus:

npm start

Danach versuchen wir im Browser zu öffnen

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

Wenn Sie bis zu diesem Zeitpunkt alles richtig gemacht haben, wird Ihre Webogramm-Autorisierungsseite geöffnet.

Jetzt müssen wir den Start der Anwendung als Dienst konfigurieren. Erstellen Sie dazu eine Datei

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

Öffnen Sie es in einem beliebigen Editor und sehen Sie folgendermaßen aus (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:

Übernehmen Sie die Änderungen

sudo systemctl daemon-reload

Autostart einschalten:

sudo systemctl enable webogram.service

Wir starten den Service:

sudo systemctl start webogram.service

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

Da wir den Zugriff auf unser Webogramm über nginx konfigurieren, schließen wir Port 8000 für Anfragen von außerhalb.

Wir verwenden dazu das Dienstprogramm udf (oder eine für Sie geeignete Methode):

sudo ufw deny 8000

Falls Sie sich immer noch für udf entscheiden, es aber auf dem Server deaktiviert ist, fügen Sie weitere Regeln hinzu (damit nicht alles auseinander fällt) und aktivieren Sie udf:

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

Als nächstes ändern wir die Nginx-Konfiguration.

Wie ich oben gewarnt habe, wird davon ausgegangen, dass auf Ihrem Server bereits eine Domain mit SSL konfiguriert ist. Ich werde Ihre Aufmerksamkeit nur auf die Tatsache lenken, dass es notwendig ist, die Konfigurationsdatei der Domäne für den korrekten Betrieb hinzuzufügen:


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 der Nginx-Konfiguration hinzufügen:

  • Wir ändern den Stammspeicherort, der Anfragen an Port 8000 weiterleitet, auf den Webogram antwortet
  • Schließen Sie den Stammspeicherort mit basic-auth. Dies ist ein rein symbolischer Schritt, um unsere Anwendung vor neugierigen Blicken und Bots zu schützen. (Und auch, dass es keine Probleme mit Schlössern gab)
  • Der Speicherortheap mit proxy_path auf dem Telegrammserver ist nur unser Endpunkt, über den wir unsere Anforderungen weiterleiten

Erstellen Sie außerdem eine Datei, /etc/nginx/passwd.htpasswd;damit nginx Benutzerkennwörter vergleichen kann.

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

Bild

Starten Sie nginx neu:

sudo systemctl restart nginx

Jetzt ist das Webogramm nur unter mywebogram.localhost / app / index.html verfügbar, nachdem die Anmeldung und das Kennwort eingegeben wurden, die Sie beim Erstellen des Befehls htpasswd definiert haben.

Es bleibt wenig übrig: Nehmen Sie kleine Änderungen am Projekt selbst vor.

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

und bringen Sie den Anfang in das folgende Formular:

/*!
 * 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 Browserkonsole und sehen Sie sich die Netzwerkanforderungen der Anwendung an. Wenn alles funktioniert und XHR-Anforderungen an Ihren Server gesendet werden, wird alles korrekt ausgeführt, und Webogram wird jetzt über nginx übertragen.



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

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

Wenn jemand irgendwelche Schwierigkeiten hat oder ich einige Ungenauigkeiten gemacht habe, werde ich gerne antworten und versuchen, Ihnen in den Kommentaren oder der PM zu helfen.

Source: https://habr.com/ru/post/undefined/


All Articles