Durante un tiempo estuve rebuscándomelas para poder responderme una pregunta que no me dejaba dormir...
¿Qué sucede si queremos administrar una computadora que está detrás de un firewall y no podemos o no queremos hacer un "portforwarding" en el firewall por cuestiones de seguridad?
Sobre todo, el "no podemos" me molestaba, porque al firewall no lo podía administrar yo ni me querían hacer un portforwarding a un simple puertito...
Pues, para usar las X y cualquier cosa que necesitemos remotamente, podremos instalar un VNCServer en la máquina remota y un VNCViewer en la máquina local, la máquina remota ejecuta a intervalos de tiempo especificados por nosotros la petición de administración remota a una IP/host que nosotros programamos también, por lo tanto es seguro y no dejan abierto el agujero para que entren otros, ya que la máquina "administrada" es la que solicita atención a la IP que nosotros queramos, sea fija o por host dinámico (tipo http://www.no-ip.com o http://www.dyndns.com). Básicamente, iniciaremos un "VNC Invertido" o "Reverse VNC"
Lo más importante que quiero recalcar aquí, es que la máquina servidora no tiene puertos abiertos en ningún momento ya que ella es la que inicia el pedido de conexión, y cuando se conecta con el administrador crea el túnel y luego de autenticar usuario/clave recién brinda acceso (encima este acceso es restringido, obviamente con la clave de root después podemos hacer lo que necesitemos
Materiales necesarios:
0) Primero crearemos en nuestra cabeza, las siguientes variables
$GUEST: La máquina personal, la que físicamente tenemos posibilidad de acceder en cualquier momento, en mi ejemplo será una máquina llamada vnctester.dyndns.com
$HOST: La máquina servidora, la que necesitamos administrar remotamente de vez en cuando (algún backup, reinicio de servicios, etc)
$PORT: El puerto por el cual nosotros queremos conectar ambas computadoras, generalmente se usa el 5500, pero como automatizaremos el proceso, utilizaremos un puerto diferente, el 5501 (vaya diferencia no?)
1) Máquina Servidora con sistema operativo Linux (el mío es OpenSuSE 10.3 por ahora)
2) Máquina Personal, puede ser Güindow, pero el ejemplo lo tiro con Linux, también OpenSuSE 10.3
3) Conexión entre ambas máquinas
4) La máquina servidora tiene que poder llegar a conectarse con la máquina personal vía puerto $PORT
5) La máquina personal tiene que poder recibir conexiones vía el puerto $PORT, por lo tanto si hay un firewall "delante" de la máquina personal, hay que hacer un portforwarding
Pasos a seguir:
0) Nos ubicamos en la máquina servidora ($HOST) (vía SSH o "personalmente" e ingresamos con permisos de superusuario (root)
1) Instalamos en la máquina servidora el paquete x11vnc
Yo probé con el x11vnc-0.9.2-20 que ya viene en mi OpenSuSE 10.3 actualizado...
2) Creamos un usuario en la máquina servidora para más seguridad del VNC (en este ejemplo es llamado "vncuser" ) y nos logueamos en el KDE (o el WM que fuere) con ese usuario.
3) Nos aseguramos de estar logueados con el usuario creado en el paso 2)
4) Creamos un archivo en la máquina servidora llamado "x11auto.sh" con el siguiente contenido
#!/bin/bash
x11vnc -usepw -connect vnctester.dyndns.com:5501 -loop -sleepin 2 -timeout 4 -notruecolor -solid
y lo ubicamos dentro de la carpeta de AutoInicio o "AutoStart" del usuario "vncuser" (en OpenSuSE 10.1 y 10.3 con KDE, la carpeta de "AutoStart" se encuentra en /home/vncuser/.kde/Autostart, en openSuSE 11.4 en /home/vncuser/.kde4/Autostart).
¿Qué hace el script anterior? muy simple:
-usepw: utiliza la clave ya almacenada en /home/vncuser/.vnc/passwd
-connect: se conecta a un VNCViewer que está en modo escucha (listen)
vnctester.dyndns.com: el nombre de host de la máquina personal
5501: el número de puerto por el cual accederemos, debe ser el mismo en las dos "puntas"
-loop: hace un ciclo de reintentos de conexión
-sleepin 2: espera 2 segundos antes de intentar la conexión
-timeout 4: espera 4 segundos y vuelve a iniciar el ciclo
-notruecolor y -solid son solamente para reducir la calidad y por ende mejorar la performance (muy bueno con conexiones vía internet muy lenta)
5) Al archivo le tenemos que dar los permisos de ejecución con el siguiente comando
chmod +x rutadelarchivo/x11auto.sh
6) Y no nos tenemos que olvidar de ejecutar el comando siguiente para crear las claves iniciales del VNC
x11vnc -usepw
Ahora nos pide la clave y su confirmación, luego comienza a funcionar como servidor y lo cortamos con Ctrl+C
7) Yo además, como root, agregué en el archivo /etc/crontab las líneas siguientes
0 16 * * * root rckdm restart
0 * * * * root rcnscd restart
¿Por qué la primer línea? Porque a veces necesito que a las cuatro de la tarde (cuando no hay nadie allá y yo todavía sigo trabajando) se reinicie el KDE de la máquina servidora, ya que cuando hay muchas conexiones fallidas por cortes de internet o lo que fuere, el VNC no sigue intentando la conexión y el script deja de funcionar, por lo tanto necesito largarlo de nuevo.
¿Por qué la segunda línea? Porque a veces uso dyndns, y por ahí cambia la IP, pero la máquina servidora sigue teniendo la vieja IP en su caché, por lo tanto, necesito que se reinicie el servicio de Caché de Nombres de Dominio. Obviamente, si apuntamos a una IP fija, ni nos gastamos en eso
8) MUY IMPORTANTE! El usuario vncuser debe iniciar sesión en el KDE (o el Window Manager que fuere) automáticamente cada vez que la máquina se inicia, en OpenSuSE 10.3 configurar eso es muy fácil:
a) Menú principal --> Centro de Control --> Administración del Sistema --> Administrador de acceso --> Comodidad
b) Click abajo en el botón "Modo administrador"
c) Ponemos la clave de root
d) Tildamos "Activar acceso automático" para el Usuario creado en el paso 2) (vncuser) y tildamos (si queremos) también "Persistente" y "Bloquear sesión"
e) Click abajo en el botón "Aceptar"
f) Entonces, cada vez que se reinicie el KDE (como en el paso 7)), el usuario vncuser ingresará automáticamente disparando a su vez el archivo creado en el paso 4)
9) Nos ubicamos físicamente en la máquina personal ($GUEST) y nos logueamos con nuestra cuenta de usuario normal
10) Este paso y los 10.x son opcionales, yo preferí el VNCViewer recompilado y no el que ya viene instalado por comodidad y preferencias personales
Bajamos el código fuente del VNC para linux en http://realvnc.com/cgi-bin/download.cgi
Fijarse en el link que dice:
VNC Free Edition Source Code for Unix
Full source code to both Viewer and Server
Version 4.1.x
y bajarlo, obviamente aceptando la licencia
Este ejemplo fue hecho con la versión 4.1.3
10.1) Descomprimimos el archivo
tar xvzf vnc-4_1_3-unixsrc.tar.gz
10.2) Entramos al directorio unix
cd vnc-4_1_3-unixsrc/unix
10.3) Leemos el archivo README o ejecutamos lo siguiente para compilar
./configure
make
Nota 1: Si en la ejecución del comando ./configure nos tira algun error de falta de dependencias, lamentablemente
tendremos que instalarlas y volver a este paso
Nota 2: Obviamente necesitamos tener instalado el make y el gcc
Nota 3: Yo sólo lo compilé, no lo instalé así que la ruta de ejecución la tengo que poner manualmente
11) Cada vez que queremos administrar la máquina servidora, nos sentamos el la máquina personal, ingresamos al KDE (o el WM que fuere)
abrimos una terminal y en la misma escribimos lo siguiente
a) Si usamos el VNC recompilado en el paso 10)
vnc-4_1_3-unixsrc/unix/vncviewer/vncviewer -listen 5501
b) Si no, directamente con
vncviewer -listen 5501
esperamos unos segundos y nos aparece la ventana de autenticación, ponemos la clave del paso 6) y voilá
12) Si no, en un Güindow, configuran el VNCViewer para que escuche por el puerto 5501 y usan el VNC para Güindow en modo Listener, pero este post no fué escrito para hablar de Güindow...
Espero que a alguien le sirva de algo, o por lo menos le haya gustado lo que leyó, gracias por llegar hasta este punto -->. Y gracias por comentar

