Hallo, Habr!
Vor Kurzem befand ich mich in einer Situation, in der ich innerhalb eines Unternehmensnetzwerks mit eingeschränktem Internetzugang arbeiten musste, und wie Sie dem Titel entnehmen können, war Telegram dort blockiert. Ich bin sicher, dass viele mit dieser Situation vertraut sind.
Ich kann zwar gut ohne Messenger auskommen, aber gerade Telegram benötigte ich für die Arbeit. Es war nicht möglich, den Client auf dem Arbeitsgerät zu installieren, und meinen persönlichen Laptop konnte ich ebenfalls nicht verwenden. Eine weitere Lösung schien, die , aber wie Sie sich denken können, war auch diese nicht verfügbar. Die Option, ein inoffizielles Spiegelbild zu finden, schließe ich sofort aus (hoffentlich aus ganz offensichtlichen Gründen).
Zum Glück ist Webogram ein Open-Source-Projekt, dessen Quellcode in seinem Autor (danke für die großartige Arbeit!)
Die Installation und das Setup sind nicht schwierig, jedoch werden Sie in einer Umgebung mit blockiertem Zugang zu den Telegram-Servern eher enttäuscht sein als erfolgreich, da die Webversion Anfragen von dem Benutzergerät an die Telegram-Server sendet.
Glücklicherweise ist es ziemlich einfach (aber nicht sehr offensichtlich), das zu beheben. Ich möchte darauf hinweisen, dass ich nicht der Autor dieser Lösung bin. Ich habe sie in , in dem ein Problem ähnlich meinem diskutiert wurde, gefunden. Die Lösung, die der Benutzer github vorgeschlagen hat, hat mir sehr geholfen, und ich bin mir sicher, dass sie auch anderen helfen kann, weshalb ich mich entschlossen habe, dieses Tutorial zu schreiben.
Im Folgenden finden Sie eine schrittweise Anleitung zur Einrichtung Ihres Webogram-Spiegels und zur Konfiguration der Proxy-Abfragen an die Telegram-Server mit nginx.
Als Beispiel habe ich ein neu installiertes und aktualisiertes Ubuntu Server 18.04.3 gewählt.
Achtung: In diesem Tutorial werden keine Anweisungen zur Domain-Konfiguration in nginx gegeben. Dies müssen Sie selbstständig erledigen. Das Tutorial setzt voraus, dass Sie bereits eine Domain mit SSL eingerichtet haben und dass der Server, auf dem die Konfiguration erfolgen soll, Zugang zu den Telegram-Servern hat (auf beliebige Weise, die Ihnen gefällt).
Nehmen wir an, dass die IP dieses Servers 10.23.0.3 und der Domainname mywebogram.localhost ist.
Ausgehend von diesen Annahmen werde ich Beispielkonfigurationen angeben. Vergessen Sie nicht, die Werte durch Ihre eigenen zu ersetzen.
Also, lassen Sie uns beginnen:
Um Webogram zu starten, benötigen wir nodejs. Standardmäßig erhalten wir bei der Installation aus den Ubuntu-Repositories nodejs in der 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 nodejsWählen Sie den Ort aus, an dem unser Webogram basieren soll.
Für dieses Beispiel platzieren wir es im Stammverzeichnis des Home-Verzeichnisses. Dazu klonen wir das offizielle Repository auf unseren Server:
cd ~ && git clone https://github.com/zhukov/webogram.gitDer nächste Schritt ist die Installation aller Abhängigkeiten, die für den Start der Anwendung erforderlich sind:
cd webogram && npm installVersuchen wir, einen Testlauf durchzuführen. Führen Sie den Befehl aus:
npm startDanach versuchen wir, im Browser zu öffnen.
http://10.23.0.3:8000/app/index.htmlWenn Sie bis zu diesem Punkt alles richtig gemacht haben, wird die Anmeldeseite von Webogram angezeigt.
Jetzt müssen wir den Start der Anwendung als Dienst einrichten. Dazu erstellen wir eine Datei:
sudo touch /lib/systemd/system/webogram.serviceÖffnen Sie diese in einem beliebigen Editor und gestalten Sie sie wie folgt (geben 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
Führen Sie danach die folgenden Befehle aus:
Änderungen übernehmen
sudo systemctl daemon-reloadAktivieren des Autostarts:
sudo systemctl enable webogram.serviceStarten Sie den Dienst:
sudo systemctl start webogram.serviceNach diesen Schritten bleibt Webogram weiterhin auf Port 8000 erreichbar.
Da wir den Zugang zu unserem Webogram über nginx konfigurieren, schließen wir Port 8000 für externe Anfragen.
Wir verwenden dafür das Tool udf (oder eine andere Methode Ihrer Wahl):
sudo ufw deny 8000Für den Fall, dass Sie dennoch udf benutzen möchten, es aber auf dem Server deaktiviert ist, fügen wir einige weitere Regeln hinzu (um die Funktionalität nicht zu beeinträchtigen) und aktivieren udf:
sudo ufw allow ssh
sudo ufw allow 80
sudo ufw allow 443
sudo ufw enableAls Nächstes werden wir die nginx-Konfiguration ändern.
Wie bereits oben angemerkt, gehen wir davon aus, dass auf Ihrem Server bereits eine Domain mit SSL eingerichtet ist. Ich möchte Sie lediglich darauf hinweisen, dass Sie in die Konfigurationsdatei der Domain hinzufügen müssen, um die korrekte Funktion sicherzustellen:
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-Standort, der Anfragen an den Port 8000 weiterleitet, auf dem Webogram antwortet.
- Den Root-Standort schützen wir mit Basic-Auth. Dies ist nur ein symbolischer Schritt, um unsere Anwendung vor neugierigen Augen und Bots zu schützen. (So vermeiden wir auch mögliche Blockierungen.)
- Eine Vielzahl von Standorten mit proxy_path auf die Telegram-Server sind genau die 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 starten Nginx neu:
sudo systemctl restart nginxJetzt wird Webogram nur unter der Adresse nach Eingabe des Benutzernamens und Passworts, das Sie beim Erstellen des htpasswd-Befehls festgelegt haben, verfügbar sein.
Es bleibt nicht mehr viel: Wir werden einige kleine Änderungen im Projekt vornehmen.
Öffnen Sie die Datei ~/webogram/app/js/lib/mtproto.js
in einem Editor und bringen Sie den 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 haben Sie alles richtig gemacht, und Webogram wird jetzt über Nginx weitergeleitet.

Ich hoffe, dieses Tutorial ist auch für andere nützlich.
Vielen Dank an alle, die bis zum Ende gelesen haben.
Wenn jemand Schwierigkeiten hat oder ich Fehler gemacht habe – ich beantworte gerne Fragen und helfe in den Kommentaren oder per Direktnachricht.
Quelle: habr.com
