miércoles, 27 de mayo de 2009

Soporte remoto con VNC y uso de túneles SSH

En una de mis visitas a Otime en Segovia me enseñaron una variante de soporte remoto que no conocía y sencillamente me encantó. He usado VNC desde hace muchos años pero tiene un problema importante cuando quieres ofrecer soporte a clientes y es cómo acceder a ordenadores que están en una red local detrás de un router/firewall. La solución consistiría en cambiar la configuración del router para que redireccionara los puertos a las máquinas locales pero creo que estaréis conmigo cuando pienso que no es una solución factible.

Pues bien, en Otime me enseñaron el uso del VNC inverso. Lo conocía con SSH pero no caí en que fuera posible hacerlo con VNC. La idea es que en lugar de iniciar tú la conexión al ordenador del cliente sea el cliente el que inicie la conexión contigo y luego tomes el control de su ordenador. Esto es mucho más factible pues sólo es necesario modificar las reglas del firewall en un sitio, en tu oficina. Además tiene otro punto muy favorable y es que es gratis. Hay varias soluciones de helpdesk en el mercado pero de esta forma, aunque algo más compleja, te lo haces tú mismo.

Las formas de hacer este VNC inverso son distintas dependiendo del cliente que utilices. Yo voy a explicar el uso de Ultra VNC y su addon Single Click. Ultra VNC te ofrece un .zip a modo de distribución para que lo personalices con los logos, los mensajes en tu idioma,... y mediante su página web te generas un .exe ya configurado como el que se ve en la imagen siguiente.


Las instrucciones están detalladas en http://www.uvnc.com/addons/singleclick.html por lo que no merece la pena que las repita pero únicamente decir que es sencillísimo. Este Single Click representa al programa que tiene que ejecutar el cliente. En cuanto a Sinergics lo que tenemos es un script que arranca winvnc indicando que escuche en un determinado puerto (el mismo que se pone en la configuración del Single Click).
> vncviewer -listen 8888

Por lo tanto, a modo resumen:
- Llama el cliente indicando que tiene un problema y requieres controlar su ordenador.
- Arrancas el VNC en modo escucha.
- Le indicas que se descargue de la página web el ejecutable y que lo abra.
- Cuando lo ha abierto tendrás el control de su máquina.
- Justo antes de dejar de tener el control de su máquina le cierras el cliente de VNC por si las moscas.

Un esquema gráfico muy sencillo de cómo quedaría la cosa:



Hasta aquí todo bien pero... muchas veces me encuentro que estoy en la universidad, donde me conecto a través de una VPN y mi máquina no es accesible desde el exterior por políticas de seguridad. La única forma de ver acceder a máquina es desde otra máquina a la que sí que se tiene acceso desde fuera, pero únicamente vía SSH ¿Eingg? Pues sí, esto me ha pasado.

La solución a la que he llegado, por lo menos la única que se me ocurrió fue la siguiente... Tengo un servidor privado alojado en Internet con control total sobre él. Lo que decidí hacer fue crear un túnel SSH desde un puerto, por ejemplo 8989 de forma que cuando alguien se conecte a este puerto se redirija los datos a mi máquina pasando a través del ordenador de la universidad que está visible a través de SSH. La orden es algo así:
ssh -L IP_PUBLICA_DE_MI_SERVIDOR_PRIVADO:8989:IP_DE_MI_MAQUINA:PUERTO_ESCUCHA_VPN
usuariomaquinauniversidad@ipuniversidad

Como ni yo mismo entiendo este párrafo después de escribirlo voy a pegar otro diagrama para que quede algo más claro.



Lo que he hecho es configurar el SingleClick con la IP y puerto del servidor que tengo contratado y entonces cuando el cliente se conecta a dicho puerto el túnel se conecta con mi máquina local pasando a través del servidor de la universidad que es el que hace de túnel.


ACTUALIZACION
Indagando un poco más he encontrado otra solución más sencilla para el caso en el que no te encuentras en la oficina y que es en mi opinión más práctica . Consiste en utilizar un túnel SSH inverso.

El funcionamiento de un túnel SSH es más o menos el siguiente. Desde una máquina A quieres acceder a una máquina C, pero A no ve a C. Sin embargo A ve a una máquina B que esta a su vez ve a la máquina C. A haría un túnel utilizando a B de forma que mapea un puerto local de la máquina A con un puerto de la máquina C. Si A hace un telnet por ejemplo a dicho puerto local el túnel SSH configurado lo que hace es enviarlo a la máquina B que a su vez lo envía a la máquina C. B hace las veces de mensajero.

Pues bien, el túnel SSH inverso hace algo parecido. En el caso del túnel normal lo que haces es permitir a A que se conecte con C. En el túnel inverso lo que haces es preparar a A para que pueda recibir datos de C enviando dichos datos a través de B (que es pública). Con el ejemplo de la VPN quedará más claro. Me voy de viaje y estoy en las oficinas de un cliente. En este entorno no puedo tocar el router de la oficina y mi máquina no es visible desde fuera. Necesito conectarme con un cliente con el VPN inverso (luego el cliente tiene que iniciar la conexión conmigo). Lo que hago es crear un túnel inverso desde mi máquina al servidor privado que tengo contratado y que es público. Este túnel lo que hará es mapear un puerto de dicho servidor remoto de forma que cuando alguien se conecte a dicho puerto reenvíe los paquetes a mi máquina. Realmente que esta máquina me envíe datos no se puede hacer sin túnel porque mi máquina no es visible desde fuera pero al iniciar yo la conexión mediante el túnel inverso ya pasaría a ser visible.

La sintaxis del ssh inverso, que se ejecutaría desde mi máquina local, es la siguiente.
ssh -R IP_MAQUINA_PUBLICA:8989:localhost:8888 usuariomaquinapublica@IP_MAQUINA_PUBLICA

Lo que indica es que cuando alguien acceda al puerto 8989 de la máquina remota el túnel reenvíe dicho dato a mi puerto 8888 que es donde tendría escuchando el UltraVNC con el -listen 8888.

Otra cosa a tener en cuenta es que hay que modificar la configuración del sshd tal y como indica la página man. Por defecto la máquina remota sólo escucharía este puerto mediante la loopback interface.
By default, the listening socket on the server will be bound to
the loopback interface only. This may be overriden by specifying
a bind_address. An empty bind_address, or the address '*', indi-
cates that the remote socket should listen on all interfaces.
Specifying a remote bind_address will only succeed if the
server's GatewayPorts option is enabled (see sshd_config(5)).

Espero que os haya servido de ayuda este post.

domingo, 24 de mayo de 2009

Uso de Symfony en Sinergics.com

Alguno de nuestros colaboradores me ha preguntado qué es eso de Symfony que aparece en el pie de nuestra web.


Symfony es un framework para la creación de aplicaciones Web que conocí hace unos 4 meses aproximadamente. Llevo programando en Java desde hace más de 7 años y el hosting disponible de esta tecnología es escaso y bastante caro. Esto, añadido a que en la universidad el alojamiento en sus servidores sólo permite PHP me hizo formarme en este lenguaje hace varios años.

Quizás por los vicios a los que te acostumbra Java busqué IDEs y frameworks para que formaran parte de mi batería de utilidades. Después de programar "a pelo" durante estos años y tras comparar todo lo que vi disponible elegí Eclipse y Symfony como mis herramientas de trabajo.

De Eclipse espero hablar en sucesivos posts porque es de las cosas más grandes que ha creado la informática en los últimos tiempos. A modo resumen diría que es una plataforma para la creación de entornos de desarrollo. El más conocido es el plugin de Java para poder trabajar con este lenguaje pero otros lenguajes como C, C++ y PHP son soportados con sus plugins correspondientes. El plugin de PHP utilizado es PDT.

Symfony, como he dicho anteriormente, es un framework para la creación de aplicaciones web. Es una implementación desde mi punto de visto muy acertada del patrón MVC (Modelo Vista Controlador).

Empezamos por el modelo. Para trabajar con bases de datos utiliza los ORM (Object-Relationship Mapping) Propel o Doctrine. Estos frameworks sirven de puente entre el mundo de la orientación a objetos y las bases de datos relacionales. Permiten mapear clases con tablas de la base de datos y por consiguiente instancias de estas clases (objetos) con registros de las tablas.
Evitan mucho del famoso glue-code al permitir definir la estructura de una base de datos en unos ficheros de configuración (por ejemplo xml) y autogenerar los sql para crear la base de datos. También crear los ficheros PHP que representan cada una de las clases del modelo con sus correspondientes métodos save, update... Esto, junto con el API de Criteria para hacer las búsquedas da una flexibilidad enorme para trabajar con la base de datos.

Cada página de la aplicación se separa en dos partes básiscamente: acción y plantilla. La acción es el código php que se invoca cuando se llama a la página y es la responsable de acceder al modelo y dar el resultado a pintar a la vista que sería la plantilla. Por lo tanto la acción es el controlador del MVC. De esta forma tienes el controlador perfectamente localizado dentro de un proyecto Symfony.

En cuanto a la vista Symfony ofrece un mecanismo de layout (o master-pages) muy potente. Puedes definir una página de plantilla con la cabecera y el pie y especificar el lugar donde se pintará el contenido de cada una de las páginas de las que constará la aplicación web. Estos layouts no son para nada estrictos. Mediante el uso de slots puedes definir sitios dentro del código donde las páginas pueden insertar código (muy útil si por ejemplo quieres cambiar el title en alguna de las páginas). Un paso más de flexibilidad está en el uso de componentes pero no viene al caso en esta entrada.

Otro de los módulos que ofrece Symfony y que me parece muy interesante es el de routing. De forma declarativa te permite definir las páginas de las que consta la web, qué parámetros acepta, cuál es la url,... Cada una de las páginas tiene un identificador unívoco que puede ser utilizado desde las propias páginas para referenciarlas sin conocer su URL. Esto permite modificar las urls de las páginas de forma sencilla. Esto es una gran ventaja para trabajar con SEO..

Otra de las características que más agradezco a Symfony es la capacidad de crear distintos entornos de aplicación. Después de trabajar en proyectos en La Caixa y Caja Navarra donde en un aplicativo nos podíamos encontrar con hasta cuatro entornos de desarrollo distintos (test, integración, preproducción y producción) es una funcionalidad que busco en todas las herramientas. Symfony te permite configurar la aplicación de forma distinta dependiendo de en qué entorno te encuentras y utilizar uno u otro sólo invocando una url de inicio distinta. En el caso de la web de Sinergics tengo definidos dos entornos, uno de test, para hacer pruebas en local, y otro de producción, que es donde está alojada la web. Cada entorno trabaja con una base de datos distinta. A lo hora de mostrar los errores también la configuración es distinta, en local se obtiene un stacktrace mientras que en remoto sólo te muestra que ha habido un error,... Los logs también son distintos, el uso de la caché es completamente diferente. Es un mecanismo realmente potente.

Otra de las herramientas más interesantes de Symfony es el generador de formularios. Dada la estructura de la base de datos crea los CRUDs (Create-Replace-Update-Delete) para cada una de las tablas. Estos CRUD son luego fácilmente configurables por lo que ahorran mucho tiempo en el desarrollo del backend de una aplicación.

Espero encontrar el tiempo para explicar con más detalle lo que es Symfony en sucesivos posts.

Sólo dar las gracias a todo el equipo de Symfony y especialmente a Fabien por este magnífico framework.

Hasta ahora!

Iniciador Castellón

El día 22 de mayo Sinergics asistió al primer Iniciador en la provincia de Castellón en el CEEI de Castellón (Centro Europeo de Empresas Innovadoras) . Los asistentes tuvieron la suerte de conocer a Rodolfo Carpentier, presidente de Digital Assest Deployment (DAD), incubadora de proyectos como CinemaVIP, Tuenti, BuyVIP o Baquía.




El evento se dividió en dos fases:

En la primera de ellas uno de los asistentes introdujo su idea de negocio y Rodolfo organizó la clase en 5 grupos: estrategia, marketing y ventas, tecnología, experiencia de usuario y viabilidad. Cada uno de los grupos, formados por unas 8 personas tenían que dar su opinión acerca de los puntos fuertes y débiles de la idea de nuestro compañero emprendedor. La primera tarea fue resumir en 5 ideas los puntos que cada uno de los grupos consideraba más importantes y que el compañero debía considerar. Posteriormente cada uno de nosotros tuvimos que dibujar nuestra visión del problema. Aquí mi gran amigo David Cebrían hizo de las suyas y pintó un dibujo que algún día llegaré a entender... A ver si lo consigo y lo incluyo en el post porque no tiene desperdicio.

Ya en la segunda fase Rodolfo nos explicó un poco el panorama del emprendedor no sólo en España sino fuera de nuestras fronteras. Insistió en varias ocasiones en la necesidad de un plan de negocio claro y sobretodo en la pasión por la idea. Fue en este punto donde no se me olvidará lo que dijo. "Nosotros descartamos cualquier idea de negocio que venga de una persona que siga trabajando en una empresa. Si de verdad cree en su idea esa persona debería estar ahora mismo con su idea, sacándola adelante".

Luego llegaron el turno de preguntas y respuestas y se dio paso al clásico intercambio de tarjetas bien acompañado por un estupendo catering.

Desde estas líneas quería dar las gracias a los organizadores del evento: Pep Gómez, Iskiam Jara, Carlos Matallín y Álvaro Verdoy y a los patrocinadores: CEEI Castellón, Espaitec y TISSAT. Espero que se repita el evento en futuras ocasiones.

Hasta ahora!

miércoles, 13 de mayo de 2009

Sinergics

Hola a todos,

Esta es, por fin, la primera entrada del blog de Sinergics. Después de muchos años cocinando a fuego lento la idea de empresa finalmente ya ha visto la luz.

Sinergics nace como una empresa de informática diferente. En los cursos de empresas te recalcan la importancia de centrarse en un campo, de especializarse en unos ámbitos y explotarlos. Sinergics no pretende ser así. El potencial de Sinergics reside en el conocimiento de diversas tecnologías. A través de los años te das cuenta que aprender una nueva tecnología es mucho más sencilla cuando conoces sus competidores. Estableciendo relaciones entre ellas se comprende mejor las necesidades que las impulsaron, las debilidades que intentan paliar. Con una visión reducida del problema el aprendizaje es muy incompleto.

Realizar una labor de consultoría y sólo conocer y trabajar con un tipo de soluciones creemos que es lo opuesto a las necesidades del cliente. La empresa debe ser flexible al cliente, adaptarse a sus necesidades.

No sólo debemos ser flexibles de cara al cliente final, también debemos ofrecer distintas posibilidades a nuestras sinergias. Sinergics ofrece apoyo a otros grandes profesionales del sector que por distintos motivos no han podido invertir en I+D+I. Grandes colaboraciones, grandes soluciones. Es lo que el cliente necesita.

Uno de los canales de comunicación más importantes de Sinergics deseamos que sea este blog. Cada día los blogs representan un medio más común para la difusión de información. Su carácter cordial, personal y desenfadado creemos concuerda con nuestra idea de empresa.


Querría dar las gracias a todas las personas que ayudaron a tomar la decisión de emprender este proyecto.


Hasta ahora!