Cześć, Habr!
Niedawno znalazłem się w sytuacji, w której musiałem pracować w sieci korporacyjnej z ograniczonym dostępem do internetu, a jak zapewne się domyślacie z tytułu — Telegram był w niej zablokowany. Jestem pewien, że ta sytuacja jest znana wielu osobom.
Zdecydowanie mogę obyć się bez komunikatorów, jednak właśnie Telegram był mi potrzebny do pracy. Zainstalowanie klienta na służbowej maszynie nie było możliwe, a użycie osobnego laptopa również nie wchodziło w grę. Innym rozwiązaniem wydawało się skorzystanie z , ale jak można się domyślić — ta również była niedostępna. Opcję szukania nieoficjalnego lustra od razu skreślam (mam nadzieję, że z oczywistych powodów).
Na szczęście, Webogram to projekt opensource, a jego kod źródłowy jest dostępny w jego autora (Bardzo dziękuję mu za to!)
Sam proces instalacji i uruchomienia nie jest skomplikowany, jednak w warunkach użytkowania w sieci z zablokowanym dostępem do serwerów Telegram raczej czeka cię rozczarowanie niż sukces, ponieważ wersja internetowa wysyła zapytania do serwerów Telegram z maszyny użytkownika.
Na szczęście, to dość proste (ale nie bardzo oczywiste) do naprawienia. Chcę jednak ostrzec, że nie jestem autorem tego rozwiązania. Udało mi się je znaleźć w , w którym omawiano problem podobny do mojego. Rozwiązanie, które zaproponował użytkownik github , bardzo mi pomogło, jednak jestem pewien, że może pomóc jeszcze komuś, dlatego postanowiłem napisać ten poradnik.
Pod spodem znajdziesz krok po kroku konfigurację swojego lustra Webogram i skonfigurowanie proxy dla jego zapytań do serwerów Telegram z użyciem nginx.
Jako przykład wybrałem właśnie zainstalowany i zaktualizowany Ubuntu Server 18.04.3.
Uwaga: W ramach tego poradnika nie będzie instrukcji dotyczących konfiguracji domeny w nginx. Należy to zrobić samodzielnie. Poradnik zakłada, że masz już skonfigurowaną domenę z ssl, a także, że sam serwer, na którym planowana jest konfiguracja, ma dostęp do serwerów Telegram (w dowolny sposób, jaki wybierzesz)
Zakładając, że ip tego serwera to 10.23.0.3, a nazwa domeny to mywebogram.localhost
Na podstawie tych założeń będę przedstawiał przykłady konfiguracji. Nie zapomnij zmienić wartości na własne.
Zatem, zaczynajmy:
Aby uruchomić Webogram, potrzebujemy nodejs. Domyślnie, jeśli instalujemy go z repozytoriów Ubuntu, otrzymamy wersję 8.x. Potrzebujemy wersji 12.x:
curl -sL https://deb.nodesource.com/setup_12.x | sudo -E bash -
sudo apt update && sudo apt -y install nodejsWybieramy miejsce, w którym będzie bazować nasz Webogram.
Na przykład umieścimy go w katalogu domowym. W tym celu klonujemy oficjalne repozytorium na nasz serwer:
cd ~ && git clone https://github.com/zhukov/webogram.gitNastępny krok to zainstalowanie wszystkich zależności potrzebnych do uruchomienia aplikacji:
cd webogram && npm installSpróbujemy wykonać testowe uruchomienie. Wykonaj polecenie:
npm startPo czym spróbuj otworzyć w przeglądarce
http://10.23.0.3:8000/app/index.htmlJeśli do tego momentu wszystko robiłeś poprawnie, otworzy się strona logowania Webogram.
Teraz musimy skonfigurować uruchamianie aplikacji jako usługę. W tym celu tworzymy plik
sudo touch /lib/systemd/system/webogram.serviceotwieramy go w dowolnym edytorze i nadajemy mu następujący wygląd (wpisujemy swoją ścieżkę do WorkDirectory)
[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
Następnie wykonujemy następujące polecenia:
Zastosowujemy zmiany
sudo systemctl daemon-reloadWłączamy autostart:
sudo systemctl enable webogram.serviceUruchamiamy usługę:
sudo systemctl start webogram.servicePo wykonaniu tych działań Webogram będzie dostępny na porcie 8000.
Ponieważ będziemy konfigurować dostęp do naszego Webogram przez nginx, zamkniemy port 8000 dla zapytań z zewnątrz.
Użyjemy do tego narzędzia udf (lub dowolnego, które Ci odpowiada):
sudo ufw deny 8000Na wypadek, gdybyśmy zdecydowali się używać udf, ale jest wyłączone na serwerze, dodajemy jeszcze zasady (aby wszystko nie zawaliło się) i włączamy udf:
sudo ufw allow ssh
sudo ufw allow 80
sudo ufw allow 443
sudo ufw enableTeraz przystąpimy do zmiany konfiguracji nginx.
Jak wcześniej wspomniałem, zakładam, że na Twoim serwerze jest już skonfigurowana domena z ssl. Zwracam uwagę, że należy dodać do pliku konfiguracyjnego domeny dla poprawnej pracy:
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;
}
}
Co dodajemy do konfiguracji nginx:
- Zmieniamy główną lokalizację, która będzie proxy'ować żądania na port 8000, na którym odpowiada Webogram.
- Główną lokalizację zabezpieczamy za pomocą basic-auth. To czysto symboliczny krok, aby zamknąć naszą aplikację przed ciekawskimi i botami. (A także, aby nie było problemów z blokadami).
- Wiele lokalizacji z proxy_path na serwery Telegram to właśnie nasze punkty końcowe, przez które będziemy proxy'ować nasze żądania.
Również stworzymy plik /etc/nginx/passwd.htpasswd;, aby nginx miał z czym porównywać hasła użytkowników.
sudo apt install apache2-utils
sudo htpasswd -c /etc/nginx/passwd.htpasswd tg 
Restartujemy nginx:
sudo systemctl restart nginxTeraz Webogram będzie dostępny tylko pod adresem po tym, jak zostaną wprowadzone login i hasło, które określiłeś podczas tworzenia polecenia htpasswd.
Zostało jeszcze trochę: wprowadzimy niewielkie zmiany w samym projekcie.
Otwórz w edytorze plik ~/webogram/app/js/lib/mtproto.js
I zmień jego początek na następujący sposób:
/*!
* 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
}
...
Po tym, należy odświeżyć stronę z aplikacją w przeglądarce.
Otwórz konsolę przeglądarki i sprawdź zapytania sieciowe aplikacji. Jeśli wszystko działa, a zapytania XHR są kierowane na twój serwer — oznacza to, że wszystko zostało zrobione poprawnie, a Webogram jest teraz proxy'owany przez nginx.

Mam nadzieję, że ten poradnik okaże się przydatny dla kogoś innego oprócz mnie.
Bardzo dziękuję wszystkim, którzy dotarli do końca.
Jeśli ktoś napotkał trudności lub popełniłem jakieś nieścisłości — chętnie odpowiem i postaram się pomóc w komentarzach lub wiadomości prywatnej.
Źródło: habr.com
