Ehi Habr!
Recentemente mi sono trovato in una situazione in cui era necessario lavorare all'interno di una rete aziendale con accesso incompleto a Internet e, come puoi intuire dal titolo, Telegram era bloccato al suo interno. Sono sicuro che questa situazione è familiare a molti.
Posso fare a meno della messaggistica istantanea, ma era Telegram quello di cui avevo bisogno per lavoro. Non era possibile installare il client su una macchina da lavoro, né era possibile utilizzare un laptop personale. Un'altra soluzione sembra essere quella di usarlo
Fortunatamente, Webogram è un progetto open source il cui codice sorgente è disponibile in
L'installazione e l'avvio in sé non sono difficili, tuttavia, in condizioni di funzionamento all'interno di una rete con accesso bloccato ai server Telegram, è più probabile che rimarrai deluso che riuscito, poiché la versione web invia richieste ai server Telegram dalla macchina dell'utente.
Fortunatamente, questa è una soluzione abbastanza semplice (ma non molto ovvia). Vorrei avvisarvi che non sono l'autore di questa soluzione. Sono riuscito a trovarlo
Sotto il taglio troverai la configurazione passo passo del tuo mirror Webogram e la configurazione dell'inoltro delle sue richieste ai server Telegram utilizzando nginx.
Ad esempio, ho scelto Ubuntu Server 18.04.3 appena installato e aggiornato.
Nota: Questo tutorial non includerà istruzioni sulla configurazione di un dominio in nginx. Devi farlo tu stesso. Il tutorial presuppone che tu abbia già configurato un dominio con SSL e che il server stesso su cui intendi configurarlo abbia accesso ai server Telegram (nel modo che preferisci)
Supponiamo che l'IP di questo server sia 10.23.0.3 e il nome di dominio sia mywebogram.localhost
Sulla base di queste convenzioni, fornirò esempi di configurazioni. Non dimenticare di modificare i valori con i tuoi.
Quindi, iniziamo:
Per eseguire Webogram, abbiamo bisogno di nodejs. Per impostazione predefinita, se lo installiamo dai repository Ubuntu, otterremo la versione 8.x di nodejs. Abbiamo bisogno di 12.x:
curl -sL https://deb.nodesource.com/setup_12.x | sudo -E bash -
sudo apt update && sudo apt -y install nodejs
Scegliamo il luogo in cui avrà sede il nostro Webogram.
Ad esempio, posizioniamolo nella radice della directory home. Per fare ciò, clona il repository ufficiale sul nostro server:
cd ~ && git clone https://github.com/zhukov/webogram.git
Il passaggio successivo consiste nell'installare tutte le dipendenze necessarie per eseguire l'applicazione:
cd webogram && npm install
Proviamo una corsa di prova. Esegui il comando:
npm start
Successivamente, proviamo ad aprirlo nel browser
http://10.23.0.3:8000/app/index.html
Se fino a questo punto hai fatto tutto correttamente si aprirà la pagina di autorizzazione di Webogram.
Ora dobbiamo configurare l'applicazione per l'esecuzione come servizio. Per fare ciò, creiamo un file
sudo touch /lib/systemd/system/webogram.service
aprilo in qualsiasi editor e dagli il seguente aspetto (inserisci il tuo percorso verso 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
Quindi eseguiamo i seguenti comandi:
Applicazione delle modifiche
sudo systemctl daemon-reload
Abilita l'esecuzione automatica:
sudo systemctl enable webogram.service
Iniziamo il servizio:
sudo systemctl start webogram.service
Dopo aver completato i passaggi, Webogram continuerà ad essere disponibile sulla porta 8000.
Poiché configureremo l'accesso al nostro Webogram tramite nginx, chiuderemo la porta 8000 per le richieste dall'esterno.
Utilizziamo l'utilità udf per questo (o qualsiasi metodo conveniente per te):
sudo ufw deny 8000
Nel caso in cui decidi comunque di utilizzare udf, ma è disabilitato sul server, aggiungi più regole (in modo che tutto non vada in pezzi) e abilita udf:
sudo ufw allow ssh
sudo ufw allow 80
sudo ufw allow 443
sudo ufw enable
Successivamente, iniziamo a modificare la configurazione di nginx.
Come ho avvertito sopra, si presuppone che sul tuo server sia già configurato un dominio con SSL. Mi limiterò a richiamare la tua attenzione su ciò che dovrà essere aggiunto al file di configurazione del dominio affinché funzioni correttamente:
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;
}
}
Cosa aggiungiamo alla configurazione di nginx:
- Modifichiamo la posizione root, che invierà le richieste alla porta 8000, su cui Webogram risponde
- Chiudiamo la posizione root utilizzando basic-auth. Questo è un passo puramente simbolico per chiudere la nostra applicazione da occhi indiscreti e bot. (E anche per evitare problemi con il blocco)
- Una serie di posizioni con proxy_path sul server Telegram sono esattamente i nostri endpoint attraverso i quali invieremo le nostre richieste
Inoltre, creiamo un file /etc/nginx/passwd.htpasswd;
in modo che nginx abbia qualcosa con cui controllare le password degli utenti.
sudo apt install apache2-utils
sudo htpasswd -c /etc/nginx/passwd.htpasswd tg
Riavvia nginx:
sudo systemctl restart nginx
Ora Webogram sarà disponibile solo su
Manca poco: apporteremo piccole modifiche al progetto stesso.
Apri il file in un editor ~/webogram/app/js/lib/mtproto.js
E porta il suo inizio nella seguente forma:
/*!
* 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
}
...
Successivamente, è necessario aggiornare la pagina dell'applicazione nel browser.
Apri la console del browser e osserva le richieste di rete dell'applicazione. Se tutto funziona e le richieste XHR arrivano al tuo server, allora tutto è stato eseguito correttamente e Webogram viene ora proxy tramite nginx.
Spero che questo tutorial possa essere utile a qualcun altro oltre a me.
Molte grazie a tutti coloro che hanno letto fino alla fine.
Se qualcuno ha difficoltà o ho fatto delle imprecisioni, sarò felice di rispondere e cercare di aiutarvi nei commenti o in PM.
Fonte: habr.com