Ola Habr!
Recentemente atopeime nunha situación na que era necesario traballar dentro dunha rede corporativa con acceso incompleto a Internet e, como podes supoñer polo título, Telegram estaba bloqueado nela. Estou seguro de que esta situación é coñecida para moitos.
Podo prescindir de mensaxería instantánea, pero era Telegram o que necesitaba para traballar. Non era posible instalar o cliente nunha máquina de traballo, nin se podía utilizar un portátil persoal. Outra solución parece ser usalo
Afortunadamente, Webogram é un proxecto de código aberto cuxo código fonte está dispoñible en
A instalación e o lanzamento en si non son difíciles, non obstante, en condicións de funcionamento dentro dunha rede con acceso bloqueado aos servidores de Telegram, será máis probable que te decepcione que teña éxito, xa que a versión web envía solicitudes aos servidores de Telegram desde a máquina do usuario.
Afortunadamente, esta é unha solución bastante sinxela (pero non moi obvia). Quero avisar de que non son o autor desta solución. Conseguín atopalo
Debaixo do corte atoparás a configuración paso a paso do teu espello de Webogram e a configuración para enviar as súas solicitudes aos servidores de Telegram mediante nginx.
Como exemplo, escollín un Ubuntu Server 18.04.3 recén instalado e actualizado.
Внимание: Este tutorial non incluirá instrucións sobre como configurar un dominio en nginx. Debes facelo ti mesmo. O titorial asume que xa configuraches un dominio con ssl, e que o propio servidor no que pensas configuralo ten acceso aos servidores de Telegram (do que queiras)
Supoñamos que a ip deste servidor é 10.23.0.3 e o nome de dominio é mywebogram.localhost
En base a estas convencións, darei exemplos de configuracións. Non esquezas cambiar os valores polos teus.
Entón, imos comezar:
Para executar Webogram, necesitamos nodejs. Por defecto, se o instalamos desde os repositorios de Ubuntu, obteremos a versión 8.x de nodejs. Necesitamos 12.x:
curl -sL https://deb.nodesource.com/setup_12.x | sudo -E bash -
sudo apt update && sudo apt -y install nodejs
Escollemos o lugar onde se baseará o noso Webogram.
Por exemplo, colocámolo na raíz do directorio home. Para iso, clona o repositorio oficial no noso servidor:
cd ~ && git clone https://github.com/zhukov/webogram.git
O seguinte paso é instalar todas as dependencias necesarias para executar a aplicación:
cd webogram && npm install
Probemos unha proba. Executar o comando:
npm start
Despois diso, tentamos abrilo no navegador
http://10.23.0.3:8000/app/index.html
Se ata este momento fixeches todo correctamente, abrirase a páxina de autorización de Webogram.
Agora necesitamos configurar a aplicación para que se execute como servizo. Para iso, imos crear un ficheiro
sudo touch /lib/systemd/system/webogram.service
ábreo en calquera editor e dálle a seguinte aparencia (introduce o teu camiño a 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
Despois executamos os seguintes comandos:
Aplicando os cambios
sudo systemctl daemon-reload
Activar a execución automática:
sudo systemctl enable webogram.service
Comezamos o servizo:
sudo systemctl start webogram.service
Despois de completar os pasos, Webogram seguirá estando dispoñible no porto 8000.
Xa que configuraremos o acceso ao noso Webogram a través de nginx, pecharemos o porto 8000 para solicitudes de fóra.
Usamos a utilidade udf para iso (ou calquera método conveniente para vostede):
sudo ufw deny 8000
No caso de que aínda decidas usar udf, pero está desactivado no servidor, engade máis regras (para que non se desmorone todo) e habilite udf:
sudo ufw allow ssh
sudo ufw allow 80
sudo ufw allow 443
sudo ufw enable
A continuación, imos comezar a cambiar a configuración de nginx.
Como advertín anteriormente, suponse que un dominio con ssl xa está configurado no teu servidor. Só chamarei a súa atención sobre o que será necesario engadir ao ficheiro de configuración do dominio para que funcione correctamente:
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;
}
}
O que engadimos á configuración de nginx:
- Cambiamos a localización raíz, que enviará as solicitudes de proxy ao porto 8000, ao que responde Webogram
- Pechamos a localización raíz usando basic-auth. Este é un paso puramente simbólico para pechar a nosa aplicación de miradas indiscretas e bots. (E tamén para evitar problemas co bloqueo)
- Unha morea de localizacións con proxy_path no servidor de Telegram son exactamente os nosos puntos finais a través dos cales enviaremos as nosas solicitudes por proxy
Ademais, imos crear un ficheiro /etc/nginx/passwd.htpasswd;
para que nginx teña algo para comprobar os contrasinais dos usuarios.
sudo apt install apache2-utils
sudo htpasswd -c /etc/nginx/passwd.htpasswd tg
Reiniciar nginx:
sudo systemctl restart nginx
Agora Webogram só estará dispoñible en
Xa queda pouco: faremos pequenos cambios no propio proxecto.
Abre o ficheiro nun editor ~/webogram/app/js/lib/mtproto.js
E leva o seu inicio á seguinte 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
}
...
Despois diso, cómpre actualizar a páxina da aplicación no navegador.
Abre a consola do teu navegador e mira as solicitudes de rede da aplicación. Se todo funciona e as solicitudes de XHR van ao teu servidor, entón todo está feito correctamente e Webogram agora envíase un proxy a través de nginx.
Espero que este tutorial sexa útil para alguén ademais de min.
Moitas grazas a todos os que ledes ata o final.
Se alguén ten algunha dificultade ou fixen algunha imprecisión, estarei encantado de responder e tratar de axudarche nos comentarios ou en MP.
Fonte: www.habr.com