Hé Habr!
Onlangs bevond ik me in een situatie waarin het nodig was om binnen een bedrijfsnetwerk te werken met onvolledige toegang tot internet en, zoals je uit de titel kunt raden, werd Telegram daarin geblokkeerd. Ik weet zeker dat deze situatie voor velen bekend is.
Ik kan zonder instant messengers, maar het was Telegram dat ik nodig had voor mijn werk. Het was niet mogelijk om de client op een werkcomputer te installeren, noch was het mogelijk om een persoonlijke laptop te gebruiken. Een andere oplossing lijkt te zijn om het te gebruiken
Gelukkig is Webogram een open source-project waarvan de broncode beschikbaar is
De installatie en lancering zelf is niet moeilijk, maar onder omstandigheden binnen een netwerk met geblokkeerde toegang tot Telegram-servers zul je eerder teleurgesteld dan succesvol zijn, aangezien de webversie vanaf de machine van de gebruiker verzoeken naar Telegram-servers stuurt.
Gelukkig is dit een vrij eenvoudige (maar niet erg voor de hand liggende) oplossing. Ik wil u waarschuwen dat ik niet de auteur van deze oplossing ben. Ik heb het erin weten te vinden
Onder de afbeelding vindt u de stapsgewijze installatie van uw Webogram-mirror en de configuratie van het proxyen van zijn verzoeken aan Telegram-servers met behulp van nginx.
Als voorbeeld heb ik een vers geïnstalleerde en bijgewerkte Ubuntu Server 18.04.3 gekozen.
Opmerking: Deze tutorial bevat geen instructies voor het instellen van een domein in nginx. U moet dit zelf doen. De tutorial gaat ervan uit dat je al een domein met SSL hebt geconfigureerd en dat de server zelf waarop je het wilt configureren toegang heeft tot de Telegram-servers (op welke manier dan ook)
Laten we aannemen dat het ip-adres van deze server 10.23.0.3 is en dat de domeinnaam mywebogram.localhost is
Op basis van deze conventies zal ik voorbeelden van configuraties geven. Vergeet niet de waarden naar uw eigen waarden te wijzigen.
Vraag, antwoord:
Om Webogram uit te voeren, hebben we nodejs nodig. Als we het vanuit de Ubuntu-repository's installeren, krijgen we standaard nodejs versie 8.x. We hebben 12.x nodig:
curl -sL https://deb.nodesource.com/setup_12.x | sudo -E bash -
sudo apt update && sudo apt -y install nodejs
We kiezen de plaats waar ons webogram zal worden gebaseerd.
Laten we het bijvoorbeeld in de hoofdmap van de thuismap plaatsen. Om dit te doen, kloont u de officiële repository naar onze server:
cd ~ && git clone https://github.com/zhukov/webogram.git
De volgende stap is het installeren van alle afhankelijkheden die nodig zijn om de applicatie uit te voeren:
cd webogram && npm install
Laten we een proefrit proberen. Voer de opdracht uit:
npm start
Daarna proberen we het in de browser te openen
http://10.23.0.3:8000/app/index.html
Als u tot nu toe alles correct heeft gedaan, wordt de Webogram-autorisatiepagina geopend.
Nu moeten we de applicatie configureren om als een service te draaien. Om dit te doen, gaan we een bestand maken
sudo touch /lib/systemd/system/webogram.service
open het in een willekeurige editor en geef het het volgende uiterlijk (voer uw pad naar WorkDirectory in)
[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
Vervolgens voeren we de volgende opdrachten uit:
Het toepassen van de wijzigingen
sudo systemctl daemon-reload
Automatisch uitvoeren inschakelen:
sudo systemctl enable webogram.service
Laten we de dienst starten:
sudo systemctl start webogram.service
Na het voltooien van de stappen blijft Webogram beschikbaar op poort 8000.
Omdat we de toegang tot ons Webogram via nginx gaan opzetten, sluiten we poort 8000 voor verzoeken van buitenaf.
We gebruiken hiervoor het udf-hulpprogramma (of een andere methode die voor u geschikt is):
sudo ufw deny 8000
Als je toch besluit om udf te gebruiken, maar het is uitgeschakeld op de server, voeg dan meer regels toe (zodat alles niet uit elkaar valt) en schakel udf in:
sudo ufw allow ssh
sudo ufw allow 80
sudo ufw allow 443
sudo ufw enable
Laten we vervolgens beginnen met het wijzigen van de nginx-configuratie.
Zoals ik hierboven waarschuwde, wordt ervan uitgegaan dat er al een domein met SSL op uw server is geconfigureerd. Ik zal alleen uw aandacht vestigen op wat er aan het domeinconfiguratiebestand moet worden toegevoegd om het correct te laten werken:
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;
}
}
Wat we toevoegen aan de nginx-configuratie:
- We wijzigen de hoofdlocatie, die verzoeken naar poort 8000 zal proxyeren, waarop Webogram reageert
- We sluiten de hoofdlocatie af met basic-authenticatie. Dit is een puur symbolische stap om onze applicatie af te sluiten voor nieuwsgierige blikken en bots. (En ook om problemen met blokkeren te voorkomen)
- Een aantal locaties met proxy_path op de Telegram-server zijn precies onze eindpunten waarmee we onze verzoeken zullen proxyen
Laten we ook een bestand maken /etc/nginx/passwd.htpasswd;
zodat nginx iets heeft om gebruikerswachtwoorden mee te controleren.
sudo apt install apache2-utils
sudo htpasswd -c /etc/nginx/passwd.htpasswd tg
Start nginx opnieuw:
sudo systemctl restart nginx
Nu is Webogram alleen beschikbaar op
Er blijft weinig over: we zullen kleine wijzigingen aanbrengen in het project zelf.
Open het bestand in een editor ~/webogram/app/js/lib/mtproto.js
En breng het begin ervan in de volgende vorm:
/*!
* 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
}
...
Hierna moet u de applicatiepagina in de browser vernieuwen.
Open uw browserconsole en bekijk de netwerkverzoeken van de applicatie. Als alles werkt en XHR-verzoeken naar uw server gaan, is alles correct gedaan en wordt Webogram nu via nginx geproxyd.
Ik hoop dat deze tutorial nuttig zal zijn voor iemand anders naast mij.
Hartelijk dank aan iedereen die tot het einde heeft gelezen.
Als iemand problemen heeft of als ik onnauwkeurigheden heb gemaakt, zal ik graag antwoorden en proberen je te helpen in de reacties of in PM.
Bron: www.habr.com