Podnosimy naszą instancję Webogramu za pomocą proxy przez Nginx

Hej Habra!

Ostatnio znalazłem się w sytuacji, w której konieczna była praca w sieci firmowej z niepełnym dostępem do Internetu i jak można się domyślić z tytułu, Telegram został w niej zablokowany. Jestem pewien, że ta sytuacja jest znana wielu.

Obejdę się bez komunikatorów internetowych, ale do pracy potrzebowałem Telegramu. Nie było możliwości zainstalowania klienta na komputerze służbowym, nie było też możliwości korzystania z laptopa osobistego. Innym rozwiązaniem wydaje się być jego wykorzystanie oficjalna wersja internetowa, ale jak można się domyślić, również był niedostępny. Od razu skreślam opcję poszukiwania nieoficjalnego lustra (mam nadzieję, że z wiadomych powodów).

Na szczęście Webogram jest projektem typu open source, którego kod źródłowy jest dostępny w GitHub jego autor (za co mu serdecznie dziękujemy!)
Sama instalacja i uruchomienie nie jest trudne, jednak w warunkach pracy w sieci z zablokowanym dostępem do serwerów Telegramu bardziej prawdopodobne jest rozczarowanie niż sukces, ponieważ wersja internetowa wysyła żądania do serwerów Telegramu z komputera użytkownika.

Na szczęście jest to dość proste (ale niezbyt oczywiste) rozwiązanie. Pragnę uprzedzić, że nie jestem autorem tego rozwiązania. Udało mi się to znaleźć Oddział, w którym omówiono problem podobny do mojego. Rozwiązanie sugerowane przez użytkownika githuba tecknojock, bardzo mi to pomogło, jednak jestem pewien, że może pomóc komuś innemu, więc zdecydowałem się napisać ten poradnik.

Poniżej znajdziesz szczegółową konfigurację swojego serwera lustrzanego Webogram i konfigurację proxy jego żądań do serwerów Telegramu za pomocą nginx.

Jako przykład wybrałem świeżo zainstalowany i zaktualizowany Ubuntu Server 18.04.3.

Uwaga: Ten samouczek nie będzie zawierał instrukcji dotyczących konfigurowania domeny w Nginx. Musisz to zrobić sam. W tutorialu założono, że masz już skonfigurowaną domenę za pomocą ssl i że sam serwer, na którym planujesz ją skonfigurować, ma dostęp do serwerów Telegramu (w dowolny sposób)

Załóżmy, że adres IP tego serwera to 10.23.0.3, a nazwa domeny to mywebogram.localhost

W oparciu o te konwencje podam przykłady konfiguracji. Nie zapomnij zmienić wartości na własne.

A więc zacznijmy:

Aby uruchomić Webogram, potrzebujemy nodejs. Domyślnie, jeśli zainstalujemy go z repozytoriów Ubuntu, otrzymamy wersję nodejs 8.x. Potrzebujemy 12.x:

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

Wybieramy miejsce, w którym będzie oparty nasz Webogram.

Na przykład umieśćmy go w katalogu głównym katalogu domowego. W tym celu sklonuj oficjalne repozytorium na nasz serwer:

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

Następnym krokiem jest instalacja wszystkich zależności wymaganych do uruchomienia aplikacji:

cd webogram && npm install

Spróbujmy uruchomić test. Uruchom polecenie:

npm start

Następnie próbujemy otworzyć go w przeglądarce

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

Jeśli do tego momentu wszystko wykonałeś poprawnie, otworzy się strona autoryzacji Webogramu.

Teraz musimy skonfigurować aplikację tak, aby działała jako usługa. Aby to zrobić, utwórzmy plik

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

otwórz go w dowolnym edytorze i nadaj mu następujący wygląd (wpisz 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 uruchamiamy następujące polecenia:

Stosowanie zmian

sudo systemctl daemon-reload

Włącz automatyczne uruchamianie:

sudo systemctl enable webogram.service

Uruchommy usługę:

sudo systemctl start webogram.service

Po wykonaniu tych kroków Webogram będzie nadal dostępny na porcie 8000.

Ponieważ będziemy konfigurować dostęp do naszego Webogramu za pośrednictwem Nginx, zamkniemy port 8000 dla żądań z zewnątrz.

Używamy do tego narzędzia udf (lub dowolnej dogodnej dla Ciebie metody):

sudo ufw deny 8000

Jeśli nadal decydujesz się na użycie udf, ale jest ono wyłączone na serwerze, dodaj więcej reguł (aby wszystko się nie rozpadło) i włącz udf:

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

Następnie zacznijmy zmieniać konfigurację nginx.

Jak ostrzegałem powyżej, zakłada się, że domena z protokołem SSL jest już skonfigurowana na Twoim serwerze. Zwrócę tylko uwagę na to, co trzeba będzie dodać do pliku konfiguracyjnego domeny, aby działała poprawnie:


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 lokalizację root, która będzie przesyłać żądania proxy do portu 8000, na który odpowiada Webogram
  • Zamykamy lokalizację główną za pomocą podstawowego uwierzytelniania. To czysto symboliczny krok, aby zamknąć naszą aplikację przed ciekawskimi oczami i botami. (A także, aby uniknąć problemów z blokowaniem)
  • Kilka lokalizacji z proxy_path na serwerze Telegramu to dokładnie nasze punkty końcowe, przez które będziemy przesyłać proxy nasze żądania

Utwórzmy także plik /etc/nginx/passwd.htpasswd;aby nginx miał coś do sprawdzania haseł użytkowników.

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

Podnosimy naszą instancję Webogramu za pomocą proxy przez Nginx

Uruchom ponownie Nginxa:

sudo systemctl restart nginx

Teraz Webogram będzie dostępny tylko pod adresem mywebogram.localhost/app/index.html po wpisaniu loginu i hasła, które zdefiniowałeś podczas tworzenia komendy htpasswd.

Niewiele zostało: drobne zmiany wprowadzimy w samym projekcie.

Otwórz plik w edytorze ~/webogram/app/js/lib/mtproto.js

I sprowadź jego początek do następującej postaci:

/*!
 * 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
      }
...
 

Następnie musisz odświeżyć stronę aplikacji w przeglądarce.

Otwórz konsolę przeglądarki i przejrzyj żądania sieciowe aplikacji. Jeśli wszystko działa i żądania XHR trafiają do Twojego serwera, oznacza to, że wszystko zostało wykonane poprawnie, a Webogram jest teraz przesyłany przez serwer proxy przez Nginx.

Podnosimy naszą instancję Webogramu za pomocą proxy przez Nginx

Mam nadzieję, że ten tutorial przyda się komuś innemu oprócz mnie.

Serdecznie dziękuję wszystkim, którzy doczytali do końca.

Jeżeli ktoś miałby jakieś trudności lub popełniłem jakieś nieścisłości chętnie odpowiem i postaram się pomóc w komentarzach lub na PW.

Źródło: www.habr.com

Dodaj komentarz