15 feb 2016

Servidor IM (mensajería instantánea) en Windows y GNU/Linux



Mensajería instantánea o IM (Instant Messaging) es una forma de comunicación entre dos o más equipos en tiempo real. Para ello ambos tienen que estar conectados a una red con un servidor IM disponible, ya sea Internet o una red local.

Antes de que el servicio de mensajería instantánea se extienda a las plataformas móviles, se utilizaba ampliamente en los equipos de escritorio (entre ellos los famosos MSN Messenger, ICQ, Jabber, GTalk). Y aunque hoy en día, por la invasión de los teléfonos inteligentes, no sea muy habitual el uso de ese servicio desde los PCs, en ocasiones puede resultar muy cómodo y útil.

Para que esto funcione, se desarrollon multitud de protocolos diferentes: XMPP, OSCAR, IRC, Mumble, Skype, etc. La mayoría de ellos son privados y sólo los pueden implementar sus propietarios, pero otros no lo son y pueden ser implementados libremente por cualquiera.

1. Openfire



Es un servidor de IM, basado en el protocolo XMPP (Extensible Messaging and Presence Protocol) , escrito en Java y distribuido bajo la licencia Apache 2.0. Destaca por la administración via web, uso de TLS y la conectividad con diferentes bases de datos.

Se puede descargar desde la Página oficial

1.1. Instalación

Voy a realizar la instalación de este servidor en una máquina virtual con Windows Server 2008 R2. Ejecutamos el instalador y elegimos el idioma:


Tras estudiarlos detenidamente, aceptamos los términos de licencia:


Si es necesario, cambiamos el directorio de instalación (lo mantendré por defecto):


También elegimos si queremos crear accesos directos en el menú de inicio:


Finalmente, tras la extracción de archivos del servidor, indicamos si queremos ejecutar Openfire:




1.2. Configuración

Cuando se ejecute Openfire, veremos una ventana como esta. Esperamos a que se inicie el servidor y pulsamos Launch Admin para realizar una configuración básica:


Se abrirá un panel de configuración desde nuestro navegador predeterminado, mediante el puerto 9090. Elegimos el idioma del proceso de configuración:


En la siguiente ventana debemos introducir nuestro dominio (en caso de que tengamos uno), si no, mantenemos el campo, que cogerá el nombre de la máquina por defecto. Si es necesario, cambiamos también los puertos de administración:


Especificamos la forma de conectarse a la base de datos Openfire. La 2ª opción es más sencilla y adecuada para un entorno de pruebas:


Almacenaremos las cuentas de usuarios en una base de datos interna de Openfire, eligiendo la opción por defecto:


Introducimos las credenciales del administrador para acceder al panel de control más adelante. Importante acordarse de ellos:


Configuración finalizada :)


1.3. Creación de usuarios

Una vez realizada la configuración inicial, se abrirá la consola de administración:

Introducimos las credenciales del administrador (especificados anteriormente):

Desde aquí se pueden cambiar las configuraciones del servidor, ver logs y otras informaciones útiles:


Desde la pestaña Usuarios/Grupos vamos a crear 2 usuarios nuevos, que se van a guardar en la base de datos de Openfire:


Rellenamos al menos los campos obligatorios y marcamos la casilla de administrador, si le queremos asignar ese privilegio:


1.4. Pruebas con Spark

Spark es un cliente gratuito para los servidores IM basados en el protocolo XMPP. Lo voy a instalar en el propio servidor y en otra máquina virtual con Windows 7, para simular un entorno real.

La instalación del cliente no tiene ninguna complicación:


Desde la máquina del servidor, voy a loguearme con el usuario pepito (especificando login, contraseña y la @IP del servidor):


Logueo correcto:


Lo mismo desde la otra máquina, pero con la cuenta raulito:


Nos aparecerá un error de inicio de sesión. Para solucionarlo tendremos que desactivar el cortafuegos de Windows o, bien, añadir una excepción al mismo.


Vamos al Panel de control -> Sistema y seguridad. Y desactivamos el cortafuegos:




Ahora, al conectarse desde el cliente de Windows 7, ya no tenemos ningún problema:



Para que un usuario pueda comunicarse con el otro lo tendrá que añadir a su lista de contactos. Al hacerlo, el otro usuario tendrá que confirmar esa petición. ¡Allá vamos!

Desde raulito buscamos a pepito y lo agregamos como contacto:




Podemos cambiar el nombre con el que nos aparecerá pepito y también el grupo al que pertenece. Mantengo las opciones por defecto:


Desde la cuenta de pepito (que está en la máquina de Windows Server) vemos la petición que acabamos de realizar. Si no la visualizáis, probad cerrar sesión del usuario y entrar de nuevo:


Si marcamos la casilla, el usuario pepito agregará también a raulito a sus contactos y así podrán ver el uno al otro:



Vamos a enviar algunos mensajes de uno al otro para comprobar que la conectividad sea la correcta:



Si clicamos en el candado, se va a cifrar la conexión. Por lo que, si a partir de ese momento, alguien intercepta algún mensaje, estará cifrado:



Sin embargo, tras realizar una prueba con Wireshark, parece que la conexión se cifra desde el principio independientemente de que lo especifiquemos o no.

Cuando nos logueamos en el servidor se establece una conexión XMPP:


Y enseguida se realiza en intercambio de claves para cifrar la conexión, el cual es iniciado por el cliente mediante la petición Client Key Exchange:



2. Prosody


Prosody (o también lxmppd) es un servidor XMPP multiplataforma escrito en Lua. Tiene por objetivos un bajo consumo de recursos, facilidad de uso y extensibilidad.

Voy a realizar la instalación y la configuración de este servidor en Ubuntu Server 14.04, desde el modo texto.

2.1. Instalación

Aunque en la página oficial se dice que prosody es disponible desde repositorios oficiales de Ubuntu, no lo he conseguido localizar desde allí.

Vamos a añadir el repositorio oficial del desarrollador. Con ello también nos aseguraremos de tener la versión más nueva del servidor.

Abrimos el fichero /etc/apt/sources.list y añadimos la última línea:


Además, tendremos que añadir la clave del desarrollador, si no, no se permitirá su instalación en el sistema. Para ello ejecutamos wget https://prosody.im/files/prosody-debian-packages.key -O- | apt-get key add -


Ahora ya podemos instalar el servidor mediante el apt-get install prosody, por ejemplo. Si no nos localiza el paquete, efectuamos un apt-get update para actualizar nuestros repositorios. Junto con el servidor se instalarán diferentes dependencias (librerías del lenguaje Lua, en su mayoría):


2.2. Configuración

Vamos a securizar el transporte de los paquetes entre nuestro servidor y los cliente mediante el protocolo SSL, por ello, antes de meterse en el fichero de configuración, vamos a generar una clave.

Con el siguiente comando generamos un parametro DH (dhparam), que hará el intercambio de claves entre el cliente y servidor más rápido:


El fichero de configuración principal de Prosody es /etc/prosody/prosody.cfg.lua y sigue la sintáxis del lenguaje Lua mencionado anteriormente. En ese lenguaje una línea se comenta poniendo doble guíon (--) delante:


La variable admins, indica los JID (nombre_de_usuario@dominio) de los administradores. Especificamos nuestra cuenta de administrador:


Hay muchas más características para configurar. Sin embargo, las mantendré tal y como están. Si quisieramos activar una de ellas (por ejemplo "admin_telnet" que viene desactivada por defecto), bastaría con quitar "--" de la línea. Para desactivar, pondríamos "--" en esa línea, respectivamente:


En la configuración SSL, especificamos la versión del protocolo en la variable protocol y la ubicación del dhparam generado antes:


El parametro authentication establece cómo se van a guardar las contraseñas de los usuarios de nuestro servidor. Por defecto las guarda en texto plano ("internal_plain"). Lo mantenemos así para una mejor compatibilidad con diferentes clientes. Si quisieramos guardarlas cifradas (en hash), bastaría con cambiar el valor del parametro a "internal_hash":


Cada virtual host representará el dominio al que reparta servicio nuestro servidor. Nuestro dominio se llama andrii.org:


Tras realizar las configuraciones reiniciamos el demonio mediante prosodyctl restart.

Nota: aparecerá un error (más bien advertencia), indicando que la versión actual de LuaExpat (una de las dependencias instaladas con el servidor) está en una versión vulnerable.


Para crear usuarios utilizamos el comando prosodyctl adduser, indicando el nombre de usuario con su dominio. Creamos al usuario admin@andrii.org:


Las contraseñas serán almacenadas en texto plano y lo podemos comprobar visualizando el fichero /var/lib/prosody/NOMBRE_DOMINIO/accounts/NOMBRE_USUARIO.dat:


De la misma forma que antes, creamos el usuario user@andrii.org:


Para simular un servidor DNS, resolvemos andrii.org a nuestra propia máquina, escibiéndolo de la siguiente manera en el fichero /etc/hosts:


2.2. Pruebas (Pidgin y Spark)

Vamos a realizar las pruebas de este servidor, voy a configurar las @IP de las máquinas en el rango 172.30.0.0/16 (fichero /etc/network/interfaces para configurarlo desde modo texto):


Reiniciamos la interfaz para aplicar los cambios, y con un ifconfig comprobamos que la dirección sea la correcta:



Voy a emplear otra máquina con Windows 7 y una con Debian 8 (ambos con Pidgin) para simular probar el servicio con diferentes clientes. Nos aseguramos de que esas máquinas también tengan un direccionamiento IP correcto:


Si no tenemos un servidor DNS que lo haga, no olvidamos resolver el nombre de nuestro dominio a la @IP del servidor. En Windows el fichero a editar es C:\Windows\system32\drivers\etc\hosts:


En la máquina Debian 8 se haría de igual forma que en Ubuntu Server.

Instalando y configurando Pidgin

Pidgin es un cliente IM multiplataforma, multiprotocolo y además gratuito. Página oficial

En el proceso de la instalación, tras aceptar los terminos de licencia e indicar la ruta, no olvidamos marcar xmpp: en la lista de componentes a instalar:


Esperamos a que el proceso finalice:


En el primer inicio del programa se nos ofrecerá añadir una cuenta nueva, pulsando Añadir:


En la siguiente ventana tenemos que elegir el protocolo (XMPP), nombre de usuario y contraseña, además de nuestro dominio. En la máquina Windows 7 me logueo con el usuario admin:


En la pestaña Avanzadas, elegimos la opción utilizar cifrado si es posible:


En Debian 8, Pidgin ya viene preinstalado en el sistema. Además, su configuración idéntica a la que acabamos de realizar. En esta máquina me loguearé con user:



Desde el menú del usuario, voy añadir a admin a la lista de contactos de nuestro usuario:


Rellenamos el nombre de usuario completo al que queramos añadir (admin@andrii.org), su apodo y el grupo al que va a pertenecer. No olvidamos de elegir la cuenta desde la que realizaremos la petición (user@andrii.org):


En la otra máquina nos aparecerá una petición de amistad de admin@andrii.org:


 Lo autorizamos y además y también lo añadimos a la lista de contactos de user@andrii.org:


También tendremos que aceptar la autorización desde el otro lado:


Para finalizar, una prueba de comunicación, enviando algunos mensajes de un usuario a otro. Con ello nos aseguramos de que el destinatario los recibe:




Prueba con Spark

Ahora, desde la máquina Windows, mediante Spark, me loguearé con la misma cuenta (admin@andrii.org), simplemente para comprobar que este cliente también funciona con Prosody:


Puedemos visualizar que ya tenemos un usuario añadido en nuestra lista de contactos (user@andrii.org, al que agregamos en la prueba anterior). Vamos a ver si recibe un mensaje de prueba:




3. Ejabberd en Windows


Es un servidor IM multiplataforma de código abierto. Está escrito principalmente en Erlang. Y al igual que todos los servidores IM que hemos visto, hace uso del protocolo XMPP.

Página oficial

3.1. Instalación

Voy a instalar este servidor sobre una máquina con Windows 7 Ultimate.

El proceso de instalación es el típico. Aceptamos los términos e indicamos el directorio de instalación:



Indicamos nuestro dominio (uno diferente al utilizado en la instalación de Openfire, para evitar conflictos):


Introducimos las credenciales del administrador de nuestro servidor:



Y esperamos a que se realice el proceso de la instalación:


3.2. Iniciamos y creamos usuarios

Desde el enlace creado en el escritorio tras la instalación, iniciamos el servidor:


Se nos redirigirá a una página web local, que contendrá el enlace al panel de control de nuestro servidor:


Para acceder a él vamos a introducir las credenciales del administrador de ejabberd:


No he encontrado la opción para crear usuarios nuevos desde el panel de control, pero se puede hacer mediante la línea de comandos. Nos tenemos que situar en la carpeta bin del directorio del servidor (en mi caso cd C:\Program Files\ejabberd-16.01\bin). Una vez allí, utilizamos el comando ejabberctl, indicando el nombre del usuario, el dominio y la contraseña (por ejemplo ejabberctl register andrii asir2.com password). Voy a crear 2 usuarios - andrii y pepe:


Tanto en el lado del servidor, como en el del cliente asir2.com se debe resolver a la @IP de nuestro servidor. Para ello podemos implementar un servidor DNS, o añadir el registro manualmente al fichero hosts, como hicimos en las pruebas anteriores.

Lo podemos comprobar con un ping:


Desde otra máquina con Windows 7 me voy a loguear con el usuario andrii, utilizando el cliente Spark:


En Ubuntu 14.04 voy a emplear el cliente Psi que viene preinstalado en la distribución. Al iniciarlo por primera vez, indicaremos los detalles necesarios de la cuenta (pepe):



Al conectarnos, nos aparecerá un mensaje de aviso, al utilizarse un certificado autofirmado en el servidor:


Y ya estaríamos en la interfaz del programa:


Desde la cuenta andrii, cuya sesión está iniciada en Spark, voy a agregar a pepe:


Desde el otro lado, veríamos un contacto nuevo en nuestra lista, cuya petición vamos a aceptar:



En el lado de andrii nos preguntará si queremos que nos agreguen a la lista de contactos. De nuevo lo aceptamos:


Para finalizar, una prueba de comunicación entre los 2 clientes conectados a nuestro servidor ejabberd: