XMPP es un protocolo de mensajería instantánea libre que permite comunicaciones entre una o más personas (salas).

Lo que vamos a explicar a continuación es la instalación del servicio Prosody bajo Apache Proxy. De esta forma, tendremos acceso web y XMPP.

Por un lado tendremos a Apache escuchando por el puerto 80 y 443 e internamente un proxy inverso que apuntará al puerto 5280 para que funcione XMPP bajo el mismo dominio.

Este tutorial lo vamos hacer en Debian 9 y en todo el tutorial vamos a definir como domain.tls para referirnos a nuestro dominio.

Para tener un tutorial más completo, vamos a partir de la base de que no tenemos ningún servicio funcionando y que se tiene que instalar y configurar absolutamente todo.

Abrir puertos Firewall

Si estamos usando algún VPS de estos modernos que tanto se llevan ahora, tendremos que habilitar el acceso por unos puertos para que Prosody funcione correctamente.

Los puertos que hay que habilitar son los siguientes:

  • 5222
  • 5269
  • 5280
  • 5281

Una vez abiertos estos puertos en el servidor podemos continuar con el tutorial.

Instalación y configuración Apache

Lo que vamos hacer es instalar y configurar Apache, para ello configuraremos un VirtualHost para nuestra web/blog/tienda/loquesea y luego configuraremos el Proxy Inverso en Apache. Finalmente acabaremos configurando un certificado SSL con Let’s Encrypt.

Instalación y configuración de Apache

Bueno, esto es algo muy fácil, así que vamos a instalar Apache:

apt install apache2

Una vez instalado, procedemos a crear el fichero de configuración para nuestro dominio:

nano /etc/apache2/sites-available/domain.tls.conf

El contenido de este fichero debería de ser algo similar a esto:

<VirtualHost *:80>
        ServerName domain.tls
        ServerAlias domain.tls
        DocumentRoot /var/www/html/vhosts/domain.tls/www

        ErrorLog /var/www/html/vhosts/domain.tls/logs/error.log
        LogLevel warn
        CustomLog /var/www/html/vhosts/domain.tls/logs/access.log combined
        ProxyPass /xmpp/ http://domain.tls:5280/xmpp/
        ProxyPassReverse /xmpp/ http://domain.tls:5280/xmpp/

</VirtualHost>

Si vuestra web es un CMS o alguna web en PHP seguramente tengáis que configurar algún parámetro Directory, pero eso ya es elección vuestra.

Creamos los directorios necesarios y les aplicamos los permisos correctos:

mkdir -p /var/www/html/vhosts/domain.tls/{www,logs}
chown www-data.www-data -R /var/www/html/vhosts/domain.tls

Ahora tenemos que habilitar también el módulo para usar Apache con Proxy:

a2enmod proxy

Finalmente, habilitamos la web y reiniciamos Apache:

cd /etc/apache2/sites-available
a2ensite domain.tls.conf
systemctl restart apache2

Configuración SSL con Let’s Encrypt

Instalamos los siguientes paquetes para usar Certbot:

apt-get install certbot python-certbot-apache -t stretch-backports

Y creamos el certificado con:

certbot

En este momento tendremos que configurar Cerbot y seleccionar nuestro dominio y se generará el certificado.

Instalación Prosody

Lo siguiente sería instalar Prosody y configurarlo correctamente para que funcione. Primero añadimos el repositorio para tener una versión actualizada:

echo deb http://packages.prosody.im/debian $(lsb_release -sc) main | sudo tee -a /etc/apt/sources.list
wget https://prosody.im/files/prosody-debian-packages.key -O- | sudo apt-key add

Y ahora instalamos el paquete correspondiente:

apt update && apt upgrade
apt install prosody

Instalación de Plugins

Es interesante actualizar algunos plugins que vienen instalados por defecto así como instalar algunos nuevos, para ello haremos lo siguiente:

cd /usr/lib/prosody/
hg clone https://hg.prosody.im/prosody-modules/ prosody-modules

Si no os funciona el comando hg, tendréis que instalar el paquete mercurial:

apt install mercurial

Y para actualizar:

cd /usr/lib/prosody/prosody-modules/
hg pull --update

Configuración Prosody

Una vez lo tenemos todo configurado, lo que vamos hacer es crear un fichero nuevo de configuración. El que hay por defecto está lleno de comentarios con documentación muy útil y muy interesante, pero para que se pueda leer mejor voy a dejar mi configuración sin comentarios:

cp /etc/prosody/prosody.cfg.lua /etc/prosody/prosody.cfg.lua.ORI

Y aquí el fichero de configuración:

admins = {"admin@domain.tls"}

plugin_paths = {"/usr/lib/prosody/prosody-modules" }
consider_bosh_secure = true
cross_domain_bosh = true

modules_enabled = {

        -- Generally required
                "roster"; -- Allow users to have a roster. Recommended ;)
                "saslauth"; -- Authentication for clients and servers. Recommended if you want to log in.
                "tls"; -- Add support for secure TLS on c2s/s2s connections
                "dialback"; -- s2s dialback support
                "disco"; -- Service discovery

        -- Not essential, but recommended
                "carbons"; -- Keep multiple clients in sync
                "pep"; -- Enables users to publish the1ir mood, activity, playing music and more
                "omemo_all_access"; -- xep-0060 for enabling omemo access to non subscribers
                "private"; -- Private XML storage (for room bookmarks, etc.)
                "blocklist"; -- Allow users to block communications with other users
                "vcard"; -- Allow users to set vCards

        -- Nice to have
                "version"; -- Replies to server version requests
                "uptime"; -- Report how long server has been running
                "time"; -- Let others know the time here on this server
                "ping"; -- Replies to XMPP pings with pongs
                "register"; -- Allow users to register on this server using a client and change passwords
                "mam"; -- Store messages in an archive and allow users to access it
                --"mam_muc"; -- store group chat messages

        -- Admin interfaces
                "admin_adhoc"; -- Allows administration via an XMPP client that supports ad-hoc commands
                --"admin_telnet"; -- Opens telnet console interface on localhost port 5582

        -- HTTP modules
                "bosh"; -- Enable BOSH clients, aka "Jabber over HTTP"
                "websocket"; -- XMPP over WebSockets
                "http_files"; -- Serve static files from a directory over HTTP
                "http_upload"; -- module to enable file upload in group chat

        -- Other specific functionality
                "groups"; -- Shared roster support
                "proxy65"; -- Enables a file transfer proxy service which clients behind NAT can use
                "smacks";
                "csi";
                "cloud_notify";
                "conversejs";
                "s2s";
                "c2s";
}

modules_disabled = {
        -- "offline"; -- Store offline messages
        -- "c2s"; -- Handle client connections
        -- "s2s"; -- Handle server-to-server connections
        -- "posix"; -- POSIX functionality, sends server to background, enables syslog, etc.
}

allow_registration = false
c2s_require_encryption = false
s2s_require_encryption = true
s2s_secure_auth = true
s2s_secure_domains = { "domain.tls", "movim.eu" }

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

authentication = "internal_hashed"

archive_expires_after = "4w" -- Remove archived messages after 1 week

log = {
        info = "/var/log/prosody/prosody.log"; -- Change 'info' to 'debug' for verbose logging
        error = "/var/log/prosody/prosody.err";
        -- "*syslog"; -- Uncomment this for logging to syslog
        -- "*console"; -- Log to the console, useful for debugging with daemonize=false
}

certificates = "certs"

VirtualHost "domain.tls"
        certificate = "/etc/prosody/certs/domain.tls.crt";

Component "conference.domain.tls" "muc"
        restrict_room_creation = "local"

Tenemos que tener especial atención a los siguientes parámetros (y modificar el valor por nuestro dominio):

admins = {"admin@domain.tls"} # Pondremos el usuario admin
...
s2s_secure_domains = { "domain.tls", "movim.eu" } # Añadimos nuestro dominio y otros dominios de confianza
...
VirtualHost "domain.tls" # Añadimos nuestro dominio
        certificate = "/etc/prosody/certs/domain.tls.crt"; # Añadimos el certificado con nuestro dominio
...
Component "conference.domain.tls" "muc" # Hay que crear este registro en el DNS y cambiar el dominio
        restrict_room_creation = "local"

Una vez hemos creado la configuración, procedemos a reiniciar el servicio y a habilitarlo en en arranque:

systemctl restart prosody
systemctl enable prosody

Importar certificado SSL

Podemos activar el certificado de la siguiente forma:

prosodyctl --root cert import domain.tls /etc/letsencrypt/live/

Gestión de usuarios en Prosody

Existe un comando que permite gestionar cuentas de correo por líneas de comandos.

Para crear usuarios deberemos de hacer lo siguiente (este comando se tiene que hacer con el usuario admin que hemos configurado).

prosodyctl adduser admin@domain.tls

Cambiar contraseña de un usuario:

prosodyctl passwd admin@domain.tls

Eliminar un usuario:

prosodyctl deluser admin@domain.tls

Consultar configuración de Prosody:

prosodyctl check

Fuente: https://mgw.dumatics.com/prosody-behind-apache-on-debian-stretch/

Haz que cada palabra cuente: tu donación nos inspira a seguir creando contenido. Accede al apartado de Donación para hacer tu aportación