Hallo, Habr!
Onlangs kwam ik in een situatie terecht waarin ik binnen een bedrijfsnetwerk moest werken met beperkte toegang tot internet en zoals je kunt raden uit de titel - Telegram was geblokkeerd. Ik ben er zeker van dat veel mensen met deze situatie vertrouwd zijn.
Ik kan zonder berichtenapps, maar juist Telegram had ik nodig voor mijn werk. De client op de werkcomputer installeren was niet mogelijk, en mijn persoonlijke laptop gebruiken ook niet. Een andere oplossing leek de , maar zoals je kunt raden - die was ook niet beschikbaar. De optie om een niet-officiƫle mirror te zoeken schrap ik meteen (hoop dat om nogal voor de hand liggende redenen).
Gelukkig is Webogram een open-source project, waarvan de broncode beschikbaar is in zijn auteur (Daarvoor veel dank!)
De installatie en het opstarten zijn eenvoudig, maar in een omgeving met geblokkeerde toegang tot de Telegram-servers zul je waarschijnlijk teleurgesteld zijn eerder dan succesvol zijn, omdat de webversie verzoeken naar de Telegram-servers vanaf de gebruikersmachine verzendt.
Gelukkig is dit vrij eenvoudig (maar niet zo voor de hand liggend) te verhelpen. Ik wil je waarschuwen dat ik de auteur van deze oplossing niet ben. Ik vond het in , waar een probleem dat vergelijkbaar is met het mijne werd besproken. De oplossing die de gebruiker github , voorstelde, hielp me enorm, maar ik ben er zeker van dat het ook anderen kan helpen, daarom besloot ik deze tutorial te schrijven.
Onder de kat wacht een stapsgewijze configuratie van je Webogram-mirror en het configureren van proxyverzoeken naar de Telegram-servers met behulp van nginx.
Als voorbeeld heb ik net een geconfigureerde en bijgewerkte Ubuntu Server 18.04.3 gekozen.
Let op: In deze tutorial worden er geen instructies gegeven over het configureren van een domein in nginx. Dit moet je zelf doen. De tutorial gaat ervan uit dat je al een domein met ssl hebt ingesteld, en dat de server waarvoor de configuratie is bedoeld toegang heeft tot de Telegram-servers (op welke manier dan ook die je verkiest).
Stel dat het IP van deze server 10.23.0.3 is, en de domeinnaam mywebogram.localhost.
Uitgaande van deze voorwaarden, zal ik voorbeelden van configuraties geven. Vergeet niet om waarden om je eigen te vervangen.
Laten we beginnen:
Om Webogram te starten, hebben we nodejs nodig. Standaard, als we het uit de Ubuntu-repositories installeren, krijgen we 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 nodejsKies een locatie waar onze Webogram zal worden gehost.
Bijvoorbeeld ā laten we het in de hoofdmap van de home-directory plaatsen. Hiervoor klonen we de officiĆ«le repository naar onze server:
cd ~ && git clone https://github.com/zhukov/webogram.gitDe volgende stap is om alle afhankelijkheden te installeren die nodig zijn om de applicatie te starten:
cd webogram && npm installLaten we een teststart uitvoeren. Voer het volgende commando uit:
npm startDaarna proberen we het in de browser te openen
http://10.23.0.3:8000/app/index.htmlAls je tot dit punt alles correct hebt gedaan, zou de inlogpagina van Webogram moeten openen.
Nu moeten we de applicatie configureren om als service te draaien. Hiervoor maken we een bestand aan
sudo touch /lib/systemd/system/webogram.serviceopen het in een editor naar keuze en geef het de volgende structuur (vervang je eigen pad naar 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
Voer daarna de volgende commando's uit:
Pas de wijzigingen toe
sudo systemctl daemon-reloadSchakel de automatische opstart in:
sudo systemctl enable webogram.serviceStart de service:
sudo systemctl start webogram.serviceNa deze acties blijft Webogram beschikbaar op poort 8000.
Aangezien we toegang tot onze Webogram via nginx gaan instellen, sluiten we poort 8000 voor externe verzoeken.
Gebruik hiervoor het hulpprogramma udf (of een andere methode die voor jou handig is):
sudo ufw deny 8000Voor het geval dat je toch besloten hebt om udf te gebruiken, maar het is uitgeschakeld op de server ā voegen we nog enkele regels toe (zodat alles niet instort) en schakelen we udf in:
sudo ufw allow ssh
sudo ufw allow 80
sudo ufw allow 443
sudo ufw enableLaten we nu de configuratie van nginx aanpassen.
Zoals eerder vermeld ā ik neem aan dat je domein al is ingesteld met ssl op je server. Ik wil je er alleen op wijzen dat je het configuratiebestand van het domein moet wijzigen voor een correcte werking:
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 voegen we toe aan de nginx-configuratie:
- We passen de hoofdlocatie aan die aanvragen naar poort 8000 zal proxy'en, waarop Webogram reageert.
- We beveiligen de hoofdlocatie met basic-auth. Dit is een puur symbolische stap om onze applicatie te beschermen tegen nieuwsgierige ogen en bots. (En om problemen met blokkeringen te voorkomen.)
- De vele locaties met proxy_path naar Telegram-servers zijn precies onze eindpunten, waarlangs we onze aanvragen zullen proxy'en.
Laten we ook een bestand aanmaken /etc/nginx/passwd.htpasswd;, zodat nginx een referentie heeft voor de gebruikerswachtwoorden.
sudo apt install apache2-utils
sudo htpasswd -c /etc/nginx/passwd.htpasswd tg 
We herstarten nginx:
sudo systemctl restart nginxNu is Webogram alleen toegankelijk via het adres na het invoeren van de gebruikersnaam en het wachtwoord die je hebt ingesteld bij het maken van de htpasswd-opdracht.
Er is nog een beetje werk te doen: we zullen enkele kleine wijzigingen aan het project aanbrengen.
Open het bestand in een editor ~/webogram/app/js/lib/mtproto.js
En pas het begin aan naar het volgende formaat:
/*!
* 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
}
...
Daarna moet je de webpagina van de applicatie in de browser verversen.
Open de browserconsole en kijk naar de netwerkverzoeken van de applicatie. Als alles werkt en de XHR-verzoeken naar jouw server gaan, dan is alles correct gedaan en wordt Webogram nu door nginx geproxied.

Ik hoop dat deze tutorial ook nuttig zal zijn voor anderen naast mij.
Hartelijk dank aan iedereen die tot het einde heeft gelezen.
Als iemand problemen heeft of ik heb onnauwkeurigheden gemaakt, beantwoord ik graag jullie vragen en probeer ik te helpen in de reacties of via een privƩbericht.
Bron: habr.com
