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
Laimei, „Webogram“ yra atvirojo kodo projektas, kurio šaltinio kodas yra prieinamas
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
Po pjūviu rasite nuoseklią „Webogram“ veidrodžio sąranką ir tarpinio serverio užklausų „Telegram“ serveriams, naudojant „nginx“, sąranką.
Kaip pavyzdį pasirinkau ką tik įdiegtą ir atnaujintą Ubuntu Server 18.04.3.
Į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:
Norėdami paleisti „Webogram“, mums reikia mazgų. Pagal numatytuosius nustatymus, jei įdiegsime jį iš Ubuntu saugyklų, gausime nodejs 8.x versiją. Mums reikia 12.x:
curl -sL https://deb.nodesource.com/setup_12.x | sudo -E bash -
sudo apt update && sudo apt -y install nodejs
Mes 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.git
Kitas veiksmas yra įdiegti visas priklausomybes, reikalingas programai paleisti:
cd webogram && npm install
Pabandykime bandomąjį važiavimą. Paleiskite komandą:
npm start
Po to bandome jį atidaryti naršyklėje
http://10.23.0.3:8000/app/index.html
Jei 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.service
atidarykite 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.service
Pradėkime paslaugą:
sudo systemctl start webogram.service
Atlikus 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 8000
Jei 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 enable
Tada 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 nginx
Dabar „Webogram“ bus pasiekiama tik adresu
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 <[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
}
...
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