Instalar un servidor de XMPP (Jabber) con Prosody [Actualizado]


Muchos usamos Gtalk o Facebook Chat sin saber que el protocolo que usamos para comunicarnos no es otro que XMPP (Extensible Messaging and Presence Protocol) que es abierto además.

En GNU/Linux tenemos varias aplicaciones para montar nuestro propio servidor de XMPP o Jabber como también se le conoce, unas más complicadas que otras a la hora de configurar. Por ejemplo, tenemos ejabberd, el cual es bastante simple y ligero, pero si queremos optimizar mucho más, tenemos Prosody.

A continuación les dejo un artículo publicado en GUTL por uno de nuestro usuarios (Hugo) y donde nos muestra como configurar nuestro propio servidor XMPP con Prosody.

Introducción

A la hora de instalar un servidor del protocolo XMPP (Jabber) para mensajería interna en una red local, muchos eligen jabber, ejabberd u openfire, pero aunque funcionales, estas aplicaciones pueden llegar a demandar bastantes recursos.

Si uno posee una red pequeña o mediana y solo desea un simple servicio de mensajería instantánea, afortunadamente existe una alternativa de servidor liviano llamada prosody, que aunque está programado en LUA que es un lenguaje interpretado, según sus desarrolladores funciona muy bien gracias a luajit.

Este pequeño tutorial explicará cómo instalar y configurar prosody en Debian stable.

Preparativos e instalación

Los paquetes de prosody se encuentran en el repositorio de Debian, pero los desarrolladores de este software han preparado un repositorio para Debian y derivadas que contiene paquetes recientes y módulos adicionales, que podemos utilizar de la siguiente manera:

echo "deb http://packages.prosody.im/debian stable main" | sudo tee -a /etc/apt/sources.list
wget http://prosody.im/files/prosody-debian-packages.key -O- | sudo apt-key add -
sudo aptitude update

Una vez agregado el repositorio, podemos proceder a instalar prosody (adicionalmente agregando módulos para usar sasl como mecanismo de autenticación en caso necesario, lo cual permite integrar prosody con pam, LDAP, etc).

sudo aptitude install sasl2-bin libsasl2-modules-ldap prosody liblua5.1-{sec0,cyrussasl0,event-prosody0}

Procedemos entonces a generar certificados autofirmados para nuestro dominio:

cd /etc/prosody/certs
sudo openssl req -new -x509 -days 1095 -nodes -out "midominio.cu.cert" -keyout "midominio.cu.key"

El asistente nos preguntará una serie de datos, de los cuales el realmente imprescindible es “Common Name (e.g. server FQDN or YOUR name)” donde tenemos que poner nuestro dominio, como mismo lo utilizaremos en la sección VirtualHost del archivo de configuración.

Adicionalmente, si en el servidor donde instalamos prosody tenemos configurado iptables con políticas de denegación por defecto, necesitamos abrir los puertos requeridos para nuestra red, por ejemplo:

sudo iptables -A INPUT -i lo -j ACCEPT
sudo iptables -A INPUT -i eth1 -s 192.168.0.0/24 -p tcp -m tcp -m state --state ESTABLISHED,RELATED -j ACCEPT
sudo iptables -A INPUT -i eth1 -s 192.168.0.0/24 -p tcp -m tcp -m multiport --dports 5222,5223,5269 -m state --state NEW -j ACCEPT

Configuración

A continuación, procedemos a modificar algunas líneas del archivo de configuración, para lo cual debemos editar /etc/prosody/prosody.cfg.lua de modo que quede aproximadamente así:

ports = { 5222, 5269 }

ssl_ports = { 5223 }

admins = { "juan@midominio.cu", "pedro@midominio.cu" }

use_libevent = true; -- la opción predeterminada se basa en la función select(), en cambio libevent utiliza epoll(), que es más eficiente y escalable.

modules_enabled = {
	"roster";
	"saslauth";
	"tls";
	"dialback";
	"disco";
	"private";
	"vcard";
	"privacy";
	"compression";
	"legacyauth";
	"version";
	"uptime";
	"time";
	"ping";
	"pep";
	"register"; -- no deshabilitar este módulo, permite no solo registrar sino también cambiar contraseñas
	"adhoc";
	"admin_adhoc";
	"posix";
	"bosh"; -- agregar esta línea si se desea habilitar jabber sobre http
};

allow_registration = false; -- deshabilitado por seguridad
                            -- cambiar a true si se desea habilitar la creación de cuentas desde el propio cliente

ssl = {
	key = "/etc/prosody/certs/localhost.key";
	certificate = "/etc/prosody/certs/localhost.cert";
}

storage = "internal"; -- el almacenamiento predeterminado es un archivo xml
                      -- opcionalmente podemos utilizar el método de almacenamiento "sql"
                      -- esto permite utilizar SQLite, MySQL o PostgreSQL como backend (aunque deben agregarse ciertos parámetros)

authentication = "internal_hashed"; -- podemos utilizar "internal_plain" si el cliente no soporta SCRAM-SHA-1
                                    -- si deseamos usar el método sasl para posteriormente emplear LDAP, debemos utilizar "cyrus"

log = {
	error = "/var/log/prosody/prosody.err";
        info = "/var/log/prosody/prosody.log";
}

pidfile = "/var/run/prosody/prosody.pid";

VirtualHost "localhost"

VirtualHost "midominio.cu"

	ssl = {
		key = "/etc/prosody/certs/midominio.cu.key";
		certificate = "/etc/prosody/certs/midominio.cu.crt";
	}

Una vez modificado el archivo de configuración, reiniciarmos el servicio:

sudo service prosody restar

Ahora procederemos a crear las cuentas. En este caso, como en el archivo de configuración deshabilitamos el registro desde los clientes, habrá que crear las cuentas manualmente en el servidor. El método de autenticación que elegimos en la configuración (internal_hashed) hace que las contraseñas no se guardan en claro sino con el mecanismo SCRAM-SHA-1. Si el cliente de mensajería que pretendemos utilizar no soporta este mecanismo, podría utilizarse el método “internal_plain” en la configuración.

Primeramente crearemos las cuentas de los administradores del servicio que declaramos en la configuración (declararlas no implica que se creen automáticamente):

sudo prosodyctl adduser juan@midominio.cu
sudo prosodyctl adduser pedro@midominio.cu

Podemos utilizar el mismo comando para cualquier otra cuenta que deseemos crear.

Finalmente, comprobamos que el servicio está corriendo:

sudo prosodyctl status

Deberíamos obtener un mensaje como el siguiente:

Prosody is running with PID 1310

Configuración del cliente

La configuración depende de cada cliente, pero en general los detalles son simples. Por ejemplo, para Pidgin:

Pestaña «Básica»

Nombre de usuario: Juan
Dominio: midominio.cu
Recurso: pc-juan

Pestaña «Avanzadas»

Seguridad de la conexión: Utilizar cifrado si es posible
Puerto de conexión: 5222
Conectar con el Servidor: miservidor.midominio.cu

Notas

Puede encontrarse más información (incluyendo el uso de Cyrus SASL con LDAP y cómo crear entradas de DNS) en este artículo de la Wiki de Debian.

Un usuario comenta via DesdeLinux que para detener realmente el servicio ha necesitado ejecutar pkill lua5.1


18 comentarios, deja el tuyo

Deja tu comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

*

*

  1. Responsable de los datos: Miguel Ángel Gatón
  2. Finalidad de los datos: Controlar el SPAM, gestión de comentarios.
  3. Legitimación: Tu consentimiento
  4. Comunicación de los datos: No se comunicarán los datos a terceros salvo por obligación legal.
  5. Almacenamiento de los datos: Base de datos alojada en Occentus Networks (UE)
  6. Derechos: En cualquier momento puedes limitar, recuperar y borrar tu información.

  1.   KZKG^Gaara dijo

    I like it … a ver si de una vez y por todas cambio OpenFire por ejabberd o este Prosody 🙂

    1.    elav dijo

      Ya estoy haciendo las pruebas en VirtualBox precisamente para eso.. porque si esperamos por ti hijo mio.. ¬¬

      1.    KZKG^Gaara dijo

        ^-^U … jeje …
        Ahora envío un ticket al proveedor del Hosting preguntando sobre el registro DNS que necesitamos para quitar el ‘jabber.’______

        1.    elav dijo

          Ok. Jabber, IRC, Facebook, Gtalk, no sé como o por donde, pero conéctate..

  2.   Ernesto Infante dijo

    Como se hace la integracion con LDAP del Prosody? y la BD?

  3.   Rots87 dijo

    un par de imagenes para los menos conocedores no estaria mal ^.^

  4.   dhunter dijo

    En casa tengo prosody, lo instalé para probar y me ha gustado por lo simple. Un detalle al parar el servidor tengo que hacer un pkill lua5.1 para detenerlo de verdad.

  5.   AurosZx dijo

    Vaya, pues esto está interesante. Hay manera de que otras personas puedan crear usuarios mediante una GUI (pudiera ser web)? Cómo se haría para conseguir un dominio para usarlo? 😛

    1.    dhunter dijo

      Habilitas el registro en la config y desde el mismo cliente jabber se registran marcando la opción crear cuenta en el servidor.

      allow_registration = true;

  6.   Ferran dijo

    Estoy buscando paquetes de prosody en slackware, excelente tutorial. Saludos

  7.   Arturo Molina dijo

    Como puedo verificar si un usuario logro autenticarse? o como puedo saber si un usuario esta conectado al servidor?

  8.   @Jlcmux dijo

    Lo logré 😀 Pude instalarlo y configurarlo correctamente. Instale el servidor en una PC y el cliente es otra PC. pero me surge un inconveniente. Para poder que el cliente sepa que mi servidor con el dominio (medellinlibre.org) es LOCAL. Debo añadir al archivo de hosts IPDELSERVIDOR medellinlibre.org. Sino no conecta, Por obvias razones. Mi inquietud es si no hay una manera de que todos los PC de la red sepan por defecto que dicho dominio esta en LAN en una IP determinada?

    1.    ltd dijo

      misma duda! supiste al final?? estoy empezando con prosody…

    2.    dhunter dijo

      Muy simple, en el pidgin especifica la ip del server en opciones avanzadas, la otra opción es montar un dns en tu LAN.

  9.   Francisco dijo

    Es muy interesante este tema y queria saber si Prosody soporta websockets me interesa hacer un cliente web de xmpp

    1.    @Jlcmux dijo
  10.   Inukaze dijo

    Buenas, ¿No tienes una version del tutorial con una configuración que sea únicamente para una intranet domestica?, sin dominio ni nada de eso. a duras penas para que solo 1 equipo con Liñux sea servidor y los demás equipos que se conecten a este

    Es únicamente para poder chatear entre los equipos de la intranet a través de pidgin.