Sveiki, Habr!
Neseniai atsidūriau situacijoje, kai reikėjo dirbti įmonės tinkle su nepilna prieiga prie interneto ir, kaip galite atspėti iš pavadinimo, jame buvo užblokuota „Telegram“. Esu tikras, kad ši situacija daugeliui pažįstama.
Galiu apsieiti be momentinių pasiuntinių, bet darbui man reikėjo „Telegram“. Nebuvo įmanoma įdiegti kliento darbo mašinoje, taip pat nebuvo galima naudoti asmeninio nešiojamojo kompiuterio. Atrodo, kad kitas sprendimas yra jį naudoti , bet, kaip galite atspėti, jis taip pat buvo nepasiekiamas. Iš karto nubraukiu neoficialaus veidrodžio paieškos variantą (tikiuosi dėl suprantamų priežasčių).
Laimei, „Webogram“ yra atvirojo kodo projektas, kurio šaltinio kodas yra prieinamas jo autorius (už tai jam labai ačiū!)
Pats diegimas ir paleidimas nėra sudėtingas, tačiau veikiant tinkle su užblokuota prieiga prie „Telegram“ serverių, greičiausiai nusivilsite nei pasiseks, nes žiniatinklio versija siunčia užklausas „Telegram“ serveriams iš vartotojo įrenginio.
Laimei, tai gana paprastas (bet ne labai akivaizdus) sprendimas. Norėčiau perspėti, kad nesu šio sprendimo autorius. Man pavyko jį rasti , kuriame buvo aptarta problema, panaši į mano. Github vartotojo pasiūlytas sprendimas , man tai labai padėjo, tačiau esu tikras, kad gali padėti kam nors kitam, todėl nusprendžiau parašyti šią pamoką.
Po pjūviu rasite nuoseklią „Webogram“ veidrodžio sąranką ir tarpinio serverio užklausų „Telegram“ serveriams, naudojant „nginx“, sąranką.
Kaip pavyzdį pasirinkau naujai įdiegtą ir atnaujintą Ubuntu 18.04.3 serveris.
Įspėjimas: Šioje pamokoje nebus instrukcijų, kaip nustatyti domeną nginx. Jūs turite tai padaryti patys. Mokymo priemonėje daroma prielaida, kad jau sukonfigūravote domeną naudodami ssl, o pats serveris, kuriame planuojate jį konfigūruoti, turi prieigą prie „Telegram“ serverių (bet kokiu būdu).
Tarkime, kad šio serverio IP yra 10.23.0.3, o domeno vardas yra mywebogram.localhost
Remdamasis šiomis sutartimis, pateiksiu konfigūracijų pavyzdžius. Nepamirškite pakeisti verčių į savo.
Taigi, pradėkime:
Norint paleisti „Webogram“, mums reikia „nodejs“. Pagal numatytuosius nustatymus, jei diegiate iš saugyklų Ubuntu — gausime „nodejs“ 8.x versiją. Mums reikia 12.x versijos:
curl -sL https://deb.nodesource.com/setup_12.x | sudo -E bash -
sudo apt update && sudo apt -y install nodejsMes pasirenkame vietą, kurioje bus mūsų Webograma.
Pavyzdžiui, įdėkite jį į pagrindinio katalogo šaknį. Norėdami tai padaryti, klonuokite oficialią saugyklą į mūsų serverį:
cd ~ && git clone https://github.com/zhukov/webogram.gitKitas veiksmas yra įdiegti visas priklausomybes, reikalingas programai paleisti:
cd webogram && npm installPabandykime bandomąjį važiavimą. Paleiskite komandą:
npm startPo to bandome jį atidaryti naršyklėje
http://10.23.0.3:8000/app/index.htmlJei iki šiol viską padarėte teisingai, atsidarys Webogram autorizacijos puslapis.
Dabar turime sukonfigūruoti programą, kad ji veiktų kaip paslauga. Norėdami tai padaryti, sukurkime failą
sudo touch /lib/systemd/system/webogram.serviceatidarykite jį bet kuriame redaktoriuje ir suteikite jam tokią išvaizdą (įveskite kelią į 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
Tada vykdome šias komandas:
Pakeitimų taikymas
sudo systemctl daemon-reloadĮgalinti automatinį paleidimą:
sudo systemctl enable webogram.servicePradėkime paslaugą:
sudo systemctl start webogram.serviceAtlikus veiksmus, Webogram ir toliau bus pasiekiama 8000 prievade.
Kadangi mes nustatysime prieigą prie savo Webogram per nginx, uždarysime 8000 prievadą užklausoms iš išorės.
Tam naudojame udf įrankį (arba bet kurį jums patogų metodą):
sudo ufw deny 8000Jei vis tiek nuspręsite naudoti udf, bet jis išjungtas serveryje, pridėkite daugiau taisyklių (kad viskas nesugriūtų) ir įjunkite udf:
sudo ufw allow ssh
sudo ufw allow 80
sudo ufw allow 443
sudo ufw enableTada pradėkime keisti nginx konfigūraciją.
Kaip perspėjau aukščiau, daroma prielaida, kad jūsų serveryje jau sukonfigūruotas domenas su ssl. Atkreipsiu jūsų dėmesį tik į tai, ką reikės pridėti prie domeno konfigūracijos failo, kad jis tinkamai veiktų:
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;
}
}
Ką pridedame prie nginx konfigūracijos:
- Keičiame šakninę vietą, kuri perduos tarpinio serverio užklausas į 8000 prievadą, į kurį atsako Webograma
- Uždarome šakninę vietą naudodami pagrindinį autentifikavimą. Tai grynai simbolinis žingsnis siekiant uždaryti programą nuo smalsių akių ir robotų. (Ir taip pat norint išvengti blokavimo problemų)
- Daugybė vietų su proxy_path Telegram serveryje yra būtent mūsų galutiniai taškai, per kuriuos vykdysime savo užklausas.
Be to, sukurkime failą /etc/nginx/passwd.htpasswd;kad nginx turėtų su kuo patikrinti vartotojų slaptažodžius.
sudo apt install apache2-utils
sudo htpasswd -c /etc/nginx/passwd.htpasswd tg 
Iš naujo paleiskite nginx:
sudo systemctl restart nginxDabar „Webogram“ bus pasiekiama tik adresu po to, kai įvesite prisijungimo vardą ir slaptažodį, kuriuos nustatėte kurdami htpasswd komandą.
Liko nedaug: mažų pakeitimų darysime pačiame projekte.
Atidarykite failą redaktoriuje ~/webogram/app/js/lib/mtproto.js
Ir perkelkite jos pradžią į tokią 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
}
...
Po to turite atnaujinti programos puslapį naršyklėje.
Atidarykite naršyklės konsolę ir peržiūrėkite programos tinklo užklausas. Jei viskas veikia ir XHR užklausos patenka į jūsų serverį, tada viskas daroma teisingai, o „Webogram“ dabar yra tarpinis serveris per nginx.

Tikiuosi, kad ši pamoka bus naudinga dar kam nors be manęs.
Labai ačiū visiems, kurie perskaitė iki galo.
Jeigu kam nors kils sunkumų ar padariau netikslumų, mielai atsakysiu ir pabandysiu padėti komentaruose arba PM.
Šaltinis: www.habr.com
