Webogram örneğimizi nginx aracılığıyla proxy kullanarak yükseltiyoruz

Ey Habr!

Son zamanlarda kendimi internete tam erişimi olmayan bir kurumsal ağ içinde çalışmanın gerekli olduğu ve başlıktan da tahmin edebileceğiniz gibi Telegram'ın engellendiği bir durumda buldum. Bu durumun birçok kişiye tanıdık geldiğinden eminim.

Anlık mesajlaşma programları olmadan da yapabilirim ama iş için ihtiyacım olan şey Telegram'dı. İstemciyi bir iş makinesine kurmak mümkün olmadığı gibi kişisel bir dizüstü bilgisayar kullanmak da mümkün değildi. Başka bir çözüm onu ​​kullanmak gibi görünüyor resmi web sürümü, ancak tahmin edebileceğiniz gibi o da mevcut değildi. Resmi olmayan bir ayna arama seçeneğini hemen çiziyorum (umarım bariz nedenlerden dolayı).

Neyse ki Webogram, kaynak kodu şu adreste bulunan açık kaynaklı bir projedir: github yazarı (Bunun için ona çok teşekkürler!)
Kurulum ve başlatmanın kendisi zor değildir, ancak Telegram sunucularına erişimin engellendiği bir ağ içindeki çalışma koşullarında, web sürümü kullanıcının makinesinden Telegram sunucularına istekler gönderdiğinden, başarılı olmaktan çok hayal kırıklığına uğrama olasılığınız daha yüksektir.

Neyse ki, bu oldukça basit (ama çok açık olmayan) bir çözüm. Bu çözümün yazarı olmadığım konusunda sizi uyarmak isterim. onu bulmayı başardım şubebenimkine benzer bir sorunu tartışıyordu. Github kullanıcısı tarafından önerilen çözüm teknojock, bana çok yardımcı oldu, ancak başka birine de yardımcı olabileceğinden eminim, bu yüzden bu eğitimi yazmaya karar verdim.

Kesimin altında Webogram aynanızın adım adım kurulumunu ve isteklerini nginx kullanarak Telegram sunucularına proxy olarak gönderme kurulumunu bulacaksınız.

Örnek olarak yeni kurulmuş ve güncellenmiş bir Ubuntu Sunucusu 18.04.3'ü seçtim.

Not: Bu eğitimde nginx'te alan adı kurulumuna ilişkin talimatlar yer almayacaktır. Bunu kendin yapmalısın. Eğitim, zaten SSL ile bir alan adı yapılandırdığınızı ve bunu yapılandırmayı planladığınız sunucunun Telegram sunucularına (istediğiniz şekilde) erişimi olduğunu varsayar.

Bu sunucunun IP’sinin 10.23.0.3, alan adının ise mywebogram.localhost olduğunu varsayalım.

Bu sözleşmelere dayanarak konfigürasyon örnekleri vereceğim. Değerleri kendinize göre değiştirmeyi unutmayın.

Yani, başlayalım:

Webogram'ı çalıştırmak için nodejs'e ihtiyacımız var. Varsayılan olarak Ubuntu depolarından kurarsak nodejs 8.x sürümünü alacağız. 12.x'e ihtiyacımız var:

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

Webogramımızın dayanacağı yeri seçiyoruz.

Örneğin, onu ana dizinin kök dizinine yerleştirelim. Bunu yapmak için resmi depoyu sunucumuza kopyalayın:

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

Bir sonraki adım, uygulamayı çalıştırmak için gereken tüm bağımlılıkları yüklemektir:

cd webogram && npm install

Bir deneme çalıştırması deneyelim. Komutu çalıştırın:

npm start

Bundan sonra tarayıcıda açmaya çalışıyoruz

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

Bu noktaya kadar her şeyi doğru yaptıysanız Webogram yetkilendirme sayfası açılacaktır.

Şimdi uygulamayı servis olarak çalışacak şekilde yapılandırmamız gerekiyor. Bunu yapmak için bir dosya oluşturalım

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

herhangi bir düzenleyicide açın ve aşağıdaki görünümü verin (WorkDirectory yolunuzu girin)

[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

Daha sonra aşağıdaki komutları çalıştırıyoruz:

Değişiklikleri uygulama

sudo systemctl daemon-reload

Otomatik çalıştırmayı etkinleştir:

sudo systemctl enable webogram.service

Hizmeti başlatalım:

sudo systemctl start webogram.service

Adımlar tamamlandıktan sonra Webogram 8000 numaralı bağlantı noktasında kullanılabilir olmaya devam edecektir.

Webogramımıza nginx üzerinden erişim ayarlayacağımız için dışarıdan gelen isteklere 8000 portunu kapatacağız.

Bunun için udf yardımcı programını (veya sizin için uygun olan herhangi bir yöntemi) kullanıyoruz:

sudo ufw deny 8000

Hala udf kullanmaya karar verirseniz ancak sunucuda devre dışı bırakılırsa, daha fazla kural ekleyin (böylece her şey dağılmaz) ve udf'yi etkinleştirin:

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

Sonra nginx yapılandırmasını değiştirmeye başlayalım.

Yukarıda da uyardığım gibi sunucunuzda zaten SSL'li bir alan adının yapılandırılmış olduğu varsayılmaktadır. Yalnızca etki alanı yapılandırma dosyasına düzgün çalışması için nelerin eklenmesi gerektiğine dikkatinizi çekeceğim:


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;
  }
}

Nginx yapılandırmasına ne ekliyoruz:

  • Proxy isteklerini Webogram'ın yanıt verdiği 8000 numaralı bağlantı noktasına yönlendirecek kök konumunu değiştiriyoruz
  • Temel kimlik doğrulamayı kullanarak kök konumu kapatıyoruz. Bu, uygulamamızı meraklı gözlerden ve botlardan kapatmak için tamamen sembolik bir adımdır. (Ayrıca engellemeyle ilgili sorunlardan kaçınmak için)
  • Telegram sunucusunda proxy_path bulunan bir dizi konum, isteklerimizi proxy olarak gerçekleştireceğimiz uç noktalarımızdır

Ayrıca bir dosya oluşturalım /etc/nginx/passwd.htpasswd;böylece nginx'in kullanıcı şifrelerini kontrol edecek bir şeyi olur.

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

Webogram örneğimizi nginx aracılığıyla proxy kullanarak yükseltiyoruz

Nginx'i yeniden başlatın:

sudo systemctl restart nginx

Artık Webogram yalnızca şu adreste mevcut olacak: mywebogram.localhost/app/index.html htpasswd komutunu oluştururken tanımladığınız kullanıcı adı ve şifre girildikten sonra.

Çok az şey kaldı: Projenin kendisinde küçük değişiklikler yapacağız.

Dosyayı bir düzenleyicide açın ~/webogram/app/js/lib/mtproto.js

Ve başlangıcını aşağıdaki forma getirin:

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

Bundan sonra tarayıcıdaki uygulama sayfasını yenilemeniz gerekir.

Tarayıcı konsolunuzu açın ve uygulamanın ağ isteklerine bakın. Her şey çalışıyorsa ve XHR istekleri sunucunuza gidiyorsa, her şey doğru yapılmış demektir ve Webogram artık nginx aracılığıyla proxy'ye tabi tutulmuştur.

Webogram örneğimizi nginx aracılığıyla proxy kullanarak yükseltiyoruz

Bu eğitimin benden başka biri için de faydalı olacağını umuyorum.

Sonuna kadar okuyan herkese çok teşekkürler.

Herhangi biri herhangi bir zorluk yaşarsa veya herhangi bir yanlışlık yaptıysam, cevaplamaktan ve yorumlarda veya PM'de size yardımcı olmaktan memnuniyet duyarım.

Kaynak: habr.com

Yorum ekle