¡Hola, Habr!
Recientemente me encontré en una situación en la que era necesario trabajar dentro de una red corporativa con acceso incompleto a Internet y, como puedes adivinar por el título, Telegram estaba bloqueado en ella. Estoy seguro de que esta situación les resulta familiar a muchos.
Puedo prescindir de la mensajería instantánea, pero era Telegram lo que necesitaba para trabajar. No fue posible instalar el cliente en una máquina de trabajo, ni tampoco utilizar un portátil personal. Otra solución parece ser utilizarlo.
Por suerte, Webogram es un proyecto de código abierto cuyo código fuente está disponible en
La instalación y el lanzamiento en sí no son difíciles, sin embargo, en condiciones de funcionamiento dentro de una red con acceso bloqueado a los servidores de Telegram, es más probable que se sienta decepcionado que exitoso, ya que la versión web envía solicitudes a los servidores de Telegram desde la máquina del usuario.
Afortunadamente, esta es una solución bastante simple (pero no muy obvia). Me gustaría advertirles que no soy el autor de esta solución. logré encontrarlo en
Debajo del corte encontrará la configuración paso a paso de su espejo de Webogram y la configuración para enviar sus solicitudes a los servidores de Telegram usando nginx.
Como ejemplo, elegí un Ubuntu Server 18.04.3 recién instalado y actualizado.
Atencion: Este tutorial no incluirá instrucciones sobre cómo configurar un dominio en nginx. Tienes que hacerlo tú mismo. El tutorial asume que ya has configurado un dominio con ssl, y que el propio servidor en el que planeas configurarlo tiene acceso a los servidores de Telegram (de la forma que quieras)
Supongamos que la ip de este servidor es 10.23.0.3 y el nombre de dominio es mywebogram.localhost
Basado en estas convenciones, daré ejemplos de configuraciones. No olvides cambiar los valores por los tuyos propios.
Así que vamos a empezar:
Para ejecutar Webogram, necesitamos nodejs. Por defecto, si lo instalamos desde los repositorios de Ubuntu, obtendremos la 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
Elegimos el lugar donde tendrá su sede nuestro Webogram.
Por ejemplo, coloquémoslo en la raíz del directorio de inicio. Para ello clonamos el repositorio oficial a nuestro servidor:
cd ~ && git clone https://github.com/zhukov/webogram.git
El siguiente paso es instalar todas las dependencias necesarias para ejecutar la aplicación:
cd webogram && npm install
Intentemos una prueba. Ejecute el comando:
npm start
Después de eso, intentamos abrirlo en el navegador.
http://10.23.0.3:8000/app/index.html
Si hasta este punto has hecho todo correctamente, se abrirá la página de autorización de Webogram.
Ahora necesitamos configurar la aplicación para que se ejecute como un servicio. Para hacer esto, creemos un archivo.
sudo touch /lib/systemd/system/webogram.service
ábrelo en cualquier editor y dale la siguiente apariencia (ingresa tu ruta 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
Luego ejecutamos los siguientes comandos:
Aplicando los cambios
sudo systemctl daemon-reload
Habilitar ejecución automática:
sudo systemctl enable webogram.service
Comencemos el servicio:
sudo systemctl start webogram.service
Después de completar los pasos, Webogram seguirá estando disponible en el puerto 8000.
Dado que configuraremos el acceso a nuestro Webogram a través de nginx, cerraremos el puerto 8000 para solicitudes externas.
Usamos la utilidad udf para esto (o cualquier método que le resulte conveniente):
sudo ufw deny 8000
En caso de que aún decidas usar udf, pero esté deshabilitado en el servidor, agrega más reglas (para que no todo se desmorone) y habilita udf:
sudo ufw allow ssh
sudo ufw allow 80
sudo ufw allow 443
sudo ufw enable
A continuación, comencemos a cambiar la configuración de nginx.
Como advertí anteriormente, se supone que ya hay un dominio con ssl configurado en su servidor. Solo llamaré su atención sobre lo que será necesario agregar al archivo de configuración del 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;
}
}
Lo que agregamos a la configuración de nginx:
- Cambiamos la ubicación raíz, que enviará las solicitudes al puerto 8000, al que Webogram responde
- Cerramos la ubicación raíz usando basic-auth. Este es un paso puramente simbólico para cerrar nuestra aplicación a miradas indiscretas y robots. (Y también para evitar problemas con el bloqueo)
- Un montón de ubicaciones con proxy_path en el servidor de Telegram son exactamente nuestros puntos finales a través de los cuales enviaremos nuestras solicitudes.
Además, creemos un archivo. /etc/nginx/passwd.htpasswd;
para que nginx tenga algo con qué verificar las contraseñas de los usuarios.
sudo apt install apache2-utils
sudo htpasswd -c /etc/nginx/passwd.htpasswd tg
Reinicie nginx:
sudo systemctl restart nginx
Ahora Webogram sólo estará disponible en
Ya queda poco: haremos pequeños cambios en el proyecto en sí.
Abra el archivo en un editor. ~/webogram/app/js/lib/mtproto.js
Y lleve su comienzo a la siguiente 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
}
...
Después de esto, deberá actualizar la página de la aplicación en el navegador.
Abra la consola de su navegador y observe las solicitudes de red de la aplicación. Si todo funciona y las solicitudes XHR van a su servidor, entonces todo se hace correctamente y Webogram ahora se envía mediante proxy a través de nginx.
Espero que este tutorial sea útil para alguien más además de mí.
Muchas gracias a todos los que leyeron hasta el final.
Si alguien tiene alguna dificultad o cometí alguna inexactitud, estaré encantado de responder e intentar ayudarle en los comentarios o por mensaje privado.
Fuente: habr.com