Conexión a VNC a través de firewalls y proxys utilizando túneles SSH
VNC es una aplicación que nos permite realizar control remoto sobre equipos Windows o Linux. En este artículo explico cómo utilizarla para acceder a un equipo de nuestra red doméstica desde el exterior, por ejemplo desde el trabajo, utilizando una conexión cifrada y evitando posibles impedimentos como firewalls y proxys corporativos, usando para ello mecanismos basados en la creación de túneles SSH, que como veremos, no solo sirven para esto, sino que nos abren un gran abanico de oportunidades.
En principio la técnica que vamos a ver a continuación nos serviría para utilizar cualquier aplicación que funcione sobre TCP/IP, por lo que vamos a utilizar el caso práctico de VNC como explicación de cómo funciona, y vamos a hacerlo sobre una infraestructura de red relativamente compleja. Vamos a considerar que el equipo al que queremos conectarnos dispone de un servidor VNC escuchando (puerto 5900) y que está conectado a Internet a través de un firewall o router ADSL. Por otra parte en la red corporativa vamos a disponer de un equipo Windows con un cliente de VNC como TightVNC y un cliente de SSH como PuTTY, aunque sería suficiente con cualquier cliente VNC y SSH, tanto en plataforma Windows, como Linux o Mac. En cuanto a la conexión a Internet desde el puesto de la red corporativa no hay enrutamiento físico real y todos los equipos se conectan a través de un firewall a un Proxy HTTP que es el que habilita la navegación web por internet a través de otro firewall. En el siguiente dibujo se ve de forma gráfica esta infraestructura y el túnel ssh que queremos crear para comunicar ambos extremos.
El primer objetivo que nos tenemos que plantear es como sortear el Proxy HTTP para que nos permita conectarnos con nuestra red. La mayoría de estos proxys suelen tener abiertos los puertos HTTP(80) y HTTPS(443), por lo que tendremos que usar uno de ellos. Lo primero que se nos podría venir a la mente es intentar hacer escuchar al equipo destino en uno de estos puertos, pero si lo probamos, seguramente el proxy detecte que el protocolo utilizado no es HTTP si lo hacemos por el puerto 80, o que no utiliza SSL si usamos el 443. En el caso de que aún así consigamos conectar, hay que tener en cuenta que la conexión no iría cifrada, con el consiguiente riesgo en la comunicación.
Para evitar estos inconvenientes vamos a utilizar PuTTY para crear un túnel SSH desde nuestro equipo corporativo al doméstico. El primer paso será crear la conexión SSH entre ambos extremos que nos permita definir el túnel, para lo cual vamos a utilizar el puerto 443, de forma que el Proxy HTTP crea que estamos utilizando el protocolo HTTPS. En el lado de la red doméstica tendremos que redirigir en el router el puerto 443 al puerto al equipo destino, bien a ese mismo puerto haciendo escuchar también a SSH en ese puerto, o redirigiendo el tráfico al puerto 22 si nuestro router nos lo permite.
Si hemos hecho esto bien, en este momento ya podríamos conectarnos a nuestro servidor de SSH de casa a través del puerto 443. Si esto no es posible habría que revisar la configuración de Proxy utilizada en la conexión de PuTTY, y comprobar que estamos redirigiendo correctamente el tráfico que llega al router al puerto 443 hacia el equipo y puerto correcto en la red doméstica.
Una vez que hemos sido capaces de establecer conexión podemos probar ya a crear un túnel SSH, para lo cual, desde la configuración de la conexión en PuTTY, haremos que el puerto local 5900 se redirija a la ip del equipo destino y puerto 5900, como se muestra en la siguiente imagen.
Una vez configurado el túnel ya podemos establecer de nuevo la conexión, tras lo cual, sería suficiente con lanzar el TightVNC indicándole que se conecte a «localhost::5900». De esta forma PuTTY se intentará conectar al puerto local 5900, que está redirigido mediante un túnel SSH hacia el equipo de la red destino con la ip que hayamos indicado.
Es importante tener en cuenta que la dirección IP utilizada para realizar la redirección del puerto debe ser una dirección IP accesible por el equipo destino en la red doméstica. Toda la información que va por el túnel SSH va encriptada, y una vez llega al otro extremo en el servidor de SSH, éste la desencripta y la redirije a la IP y puerto que se le haya indicado en el túnel. De esta forma podemos utilizar un túnel SSH no solo para conectarnos con la misma máquina que ejecuta el servidor de SSH, sino que podríamos utilizarla como puente para conectarnos a cualquier otra máquina de nuestra red local, o cualquier máquina de internet, únicamente indicando en el destino del túnel la dirección IP y el puerto del equipo al que queremos conectarnos.
De esta forma podríamos establecer una conexión SSH con un servidor en nuestra red doméstica y crear túneles que nos permitan conectarnos por VNC a cada equipo de la red, por ejemplo redirigiendo el puerto local 5900 al 192.168.1.3:5900 y el 5901 al 192.168.1.4:5900. También podríamos crear otros túneles para otro tipo de servicios, como para conectarnos a una base de datos remota en MySQL, redirigiendo el puerto local 3306 al remoto www.example.com:3306, o cualquier otro servicio como correo POP3 o SMTP, rsync…
Saludos Patxi, un interesantísimo y perfectamente explicado artículo. Hace un tiempo estuve yo buscando información sobre este tema y la verdad es que me costó un montón encontrar explicaciones decentes. Una puntualización práctica; puede ser muy útil una vez tenemos el tunel SSH, montar una VPN sobre este tunel. (Es decir, un tunel dentro de otro tunel), con ello tenemos varias ventajas; por una parte podemos tener una segunda encriptación fuerte a parte de la del tunel SSH, para los mas recelosos en seguridad, y por otra parte tenemos la ventaja de no tener que redirigir puertos para los distintos servicios de la red destino; es decir, podríamos hacer uso de cualquiera de los servicios de nuestra red destino ya que estaríamos virtualmente en ella. La única pega de este sistema es que tenemos que tener cuidado en filtrar que ningún tráfico de la red corporativa se nos redirija a nuestra red destino a traves de la VPN, ya que pondríamos en peligro nuestra red doméstica, y por otra parte asegurarnos que nuestra red doméstica esté bien protegida, ya que un fallo de seguridad en nuestra red doméstica podría comprometer la red corporativa. Un saludillo…
Esta muy bueno este tutorial y mas cuando uno esta intensamente necesitado de una via de comunicacion segura hacia redes seguras. Pero si se pudiera ver un ejemplo vivo de estas implementaciones seria de mucha ayuda. Un ejemplo seria grabar los pantallas en un archivo de video y ponerlas en un ftp para asi poder bajarlas
bueno un saludo
No está mal, aunque no funciona el 100% de las veces, y realmente no se explica como se crea el tunel, solo se muestra como se realiza con el PuTTy.
Si estás a través de un proxy que comprueba el contenido de las conexiones, por mucho que trates de conectarte por ssh a través del puerto 443 no podrás hacer nada, y tienes que usar otras alternativas (yo actualmente si lo tengo funcionando a través del 443 con cygwin + corkscrew)
CHaIS, pocas cosas hay que funcionen el 100% de las veces, sobretodo teniendo en cuenta la gran cantidad de cosas que pueden variar de una situación a otra. En caunto a la creación del túnel, explico el concepto, que es lo más importante. Cómo realizarlo considero que es méramente una aplicación de ello, bien mediante PuTTY o mediante cualquier otro cliente ssh (páginas man). Ya por último, por mucho que intente el proxy comprobar el contenido de las conexiones SSH, lo va a tener complicado, porque va encriptado 😉 Otra cosa es que trabaje sobre el patrón de comportamiento esperado de un protocolo https, y sea capaz de identificar otro tipo de protocolos.
Por cierto, corkscrew permite únicamente autenticación básica, ni digest ni ntlm, por lo que no es válido para proxys que requieran estos tipos de autenticación.
Patxi.
Para ese tipo de proxyes, aquí tienes la solucion: funciona de maravilla 😉
http://chim0.blogspot.com/2006/08/ssh-with-putty-through-proxies.html
Salu2
Esta muy bueno el tutorial, lo q no me entiendo es si el PuTTY le avisa al sistema operativo q toda peticion local q llegue al puerto 5900 lo redirija a otra ip y otro puerto… porq probe de decirle al TightVNC q se conectara al «localhost:5900» y me sale un cartel q dice «Failed to connect to server(xxx.xxx.xxx.xxx)». Alguien me puede ayudar con esto?? Muchas gracias…
hola MaTzA, es el PuTTY el que se encarga de redirigir el tráfico que llegue a localhost:5900 al puerto correspondiente del destino. Por lo tanto, si has habilitado el túnel, y tienes el servidor de vnc escuchando en el servidor, debería funcionarte, revisa que esté todo activo.
Hola, felicidades por la explicación… Mi pregunta es la siguiente: yo tengo en mi casa instalado el VNC y desde mi oficina logro controlar mi equipo en casa simplemente colocando la direccion ip que este en ese momento, por ejemplo: 190.38.188.181, simplemente con la direccion ip y la clave de acceso logro entrar. Ahora, porque cuando esta activada la casilla de «No permitir excepciones» en el Firewall de Windows pierdo el acceso; como puedo hacer para no desactivar la casilla de «No permitir excepciones» y poder conectarme al VNC?, hay alguna alternativa de liberar el puerto 5900 de esas excepciones?
Desconozco qué hace exactamente esa opción en tu router, tendrías que mirarlo en la documentación, pero lo que es seguro, es que si quieres conectarte directamente al VNC tienes que dejar un puerto abierto, normalmente el que indicas.
Excelente artículo, me ha funcionado muy bien. Muchas Gracias.
Gracias por el tip, me ha funcionado perfecto.
Hola,
Me ahn parecido interesantes sus publicaciones acerca de seguridad con el VNC.
De antemano aprovecho, y pedirles me proporosionen información ante un evento que me sucedio.
En la empresa donde laboro, tienen VNC 4.0 para birndar soporte remoto. Anoche luego de terminar labores, me dedique a realizar un trabajo de la universidad.
Sorpresa la mia…,cuando alguien desconocido se conecto vía VNC a mi equipo y entro a la interfaz de comandos. desconecte mi ordenador de la red, y mire la configuración del VNC que estaba configuradala opcion VNC 3.3 Authentication, no Encryption, y tenia configurada una contraseña. mi VNC acepta conecciones por el puerto 5900, desconectar los clientes despues de 3600 segundos, y la opcion Server Java viewer via HTTP on port 5800. tambien tiene activada la opcion Only use protocol version 3.3 en la pestaña legacy de la configuración.
Aparte de esto mire el visor de sucesos y descubri que habian hecho vario intentos de coneccion a mi maquina por este servicio
Podrian ayudarme POR FAVOR, a aprender a configurar las ip’s que quiero que accedan a mi pc y o evitar que nuevamente me sucede ?
Gracias, Aprecio sus colaboraciones
Oscar es muy poco recomendable ocupar VNC para poder hacer soporte de los Equipos …. en internet esta lleno de manuales para poder romper las claves de los VNC (te podria apostar que el que entro a tu pc abrio la pestaña ejecyat y coloco %systemroot%system32%algo.exe es unj truco viejo pero aun sirve…..,, una forma muy facil de romper a VNC es modificando las fuentes del viewer VNC de Linux y te saltas la contraseña del VNC de windows .. consejo no lo uses ..
PD : Pero si lo vas a ocupar de todas formaste recoemiendo que ocupen UltraVNC , este ultimo te encripta la conexión en cambio el VNC .. no !!!
Suerte amigo y cuidado con los Crackers !!
Hola,
Esta bueno tu articulo, pero queria preguntar si conoces alguna forma de emular desde windows, la redireccion de vnc que se puede hacer desde el ssh en windows… es decir, conectarme desde win via ssh a un linux y desde ahi realizar la conexion al vnc de un win en mi red. El tunel funcionaria pero para una persona y si tengo mas?
Saludos,
Ktdr.
Hola,
Esta muy bueno el articulo, la verdad yo soy principiante pero estoy muy interesada apender a utilizar el VNC, lo que no me quedo muy claro es: como hago el tunel entre los dos equipos?.
Hola.
Por motivos de trabajo necesito utilizar ultravnc.Lo hago de la siguiente forma, dejo el ultravnc server en modo escucha y son mis clientes los que metiendo la ip de mi equipo en su ultra vnc server (add new client), me dan permiso y yo puedo manejar la maquina de manera remora. Mi pregunta es la siguiente. ¿Existe la posibilidad de hacer algo parecido a esto pero usando ultra vnc via http?; me ahorraria la instalacion en el cliente y solo con el navegador podria trabajar.
Gracias
Hola irg28,
Si quieres una forma comoda y simple para conectarte a tus clientes, utiliza el SC de Ultravnc. Es un ejecutable que no necesita instalación y que puedes configurar desde la web http://www.ultravnc.com. Una vez configurada tu versión personalizada de SC podrás enviar el exe o colgarlo en algun http y cuando el cliente se lo descargue se conectará a ti directamente (bueno, pulsando prácticamente un solo botón). Si quieres más info visita la página porque es muy sencillo y a la vez potente de utilizar.
queria consultar si hay alguna forma de que el vnc deje logs en el visor de sucesos de windows, que en una red, me registre a quien remoteo, inicio de sesion etc. gracias saludos
Primero que nada queria felicitarte por el articule que me resulto de lo mas interesante.
queria aprovechar para pedir alguna recomendacion en cuanto al VNC a utilizar, estoy manejando las opciones de Ultravnc y tightvnc (es UltraVNC acaso mas seguro qhe tight?)y lo que estoy buscando a la hora de decidirme es estabilidad de conexion y seguridad. me gustaria escuchar alguna experiencia al respecto de estos VNC´s y su aplicacion con la tecnica de tunel mencionada en el articulo, gracias!
hola:
Que tal es el echovnc : http://sourceforge.net/projects/echovnc
Yo tengo mis dudas al respecto…
Saludos. gracias.
Hola! mi problema es que el proxy del trabajo tiene una configuracion automatica que no puedo detectar para entrar manualmente los datos en Putty. ¿Hay alguna forma de crear el tunel SSH entrando la direccion donde esta el script automatico de configuracion? O si acaso otra forma de crear el tunel ssh que pudiera funcionar 🙂
gracias!
Hola :)Olle Ya tengo todo solo nesesito la ip de Mi Amigo para poder ver lo que hase el? o nesesito yo meter el viewer esa cosa asu pc?
hola,
he visto esta idea en la web:
http://descargasoscar.dyndns.tv/programas.jsp
http://descargasoscar.dyndns.tv/sugerencias.jsp
http://descargasoscar.dyndns.tv
Estoy probando los clientes de escritorio remoto VNC pero no se si será compatible una vez conectado con todo, alguna idea?
Gracias.
Hola, buen articulo, no me queda claro en la pc domestica solo necesitamos el servicio VNC corriendo? no necesitamos algun «server de ssh» o algo por el estilo? gracias
Hola Alfonso, en el lado doméstico tiene que haber un servidor de SSH que es contra el que se abre el tunel SSH. A través de este tunel podremos conectarnos con cualquier equipo de la red doméstica.
como hacer para instalar tuneles SSH para poder abrir mi correo en hotmail.com
como instalar tuneles SSH para abrir mi correo en hotmail.com