Instalar un servidor privado de mensajería instantánea (XMPP) | Programador Web Valencia

Instalar un servidor privado de mensajería instantánea (XMPP)

4 minutos

Chat privado

Existe una alternativa a los servicios de mensajería instantánea como WhatsApp, Telegram, Signal, etc. Un sistema desentralizado, opensource, seguro, donde eres propietario de los datos y muy maduro (existe desde el 2011). Esta tecnología se denomina XMPP.

XMPP es un protocolo de comunicación en tiempo real, que permite la comunicación entre dos o más entidades a través de la red. Es un protocolo abierto, extensible, federado y descentralizado (como Mastodon), lo que significa que cualquier persona puede levantar su propio servicio y comunicarse con otras instancias. Varias empresas de renombre lo utilizaron para lanzar sus aplicaciones, como WhatsApp o Google Talk. Actualmente hay empresas, como Cisco y Facebook Messenger, que continúan apoyandose en este protocolo.

En mi caso tengo la necesidad de interactuar con una mensajería instantánea privada por diferentes motivos. Como por ejemplo hablar con mis servidores de forma segura desde mi smartphone, pidiendo que ejecuten comandos, activen/desactiven tareas, me informen sobre el estado o como medio de alerta ante problemas. Otra es poder brindar un medio de comunicación alternativo al email, no sustentando por una empresa privada de mensajería instantánea. Aunque todas estas razones se vuelven endebles cuando ponemos sobre la mesa la posibilidad de hablar con familiares y amigos de forma privada. Otra cosa es que ellos quieran, pero al menos la opción está ahí.

Tutorial

0. Requerimientos

  • Un servidor con Debian o Ubuntu. Si utilizas otras distribuciones deberás adaptar los comandos. Puedes usar un VPS o un servidor en tu casa.
  • Un dominio que apunte con A a la IP de tu servidor. En los ejemplos utilizaré dominio.com.
  • Un cliente de mensajería instantánea. Puedes utilizar Gajim, Conversations, Dino (me encanta) o el clásico Pidgin para escritorio. Para smartphone solo debes hacer una rápida búsqueda en la store de tu sistema operativo. Personalmente recomiendo Snikket en iOS. Entre otras cosas, lo utilizaremos para comprobar que funciona.

¡No pases a los siguientes pasos hasta que no tengas un dominio y apunte a tu servidor!

1. Instalación

He elegido Prosody, un servidor XMPP escrito en Lua, que es realmente fácil de instalar y configurar.

sudo apt update
sudo apt install prosody prosody-modules

Activamos el servicio.

sudo systemctl enable prosody
sudo systemctl start prosody

2. Abrir puertos

Si tienes un firewall, deberás abrir los puertos 5222, 5269, 5280 y 5281.

  • 5222: Cliente a servidor. Entre tu cliente de mensajería instantánea y el servidor.
  • 5269: Servidor a servidor. Entre tu servidor y otros servidores. No olvidemos que es un protocolo federado.
  • 5280: HTTP. Opcional. Se usara para levantar un mini servidor web de Prosody. Esencial para módulos como bosh, http_upload websocket o http_file_share.
  • 5281: HTTPS. Para la conexión segura HTTP.
sudo ufw allow 5222/tcp
sudo ufw allow 5269/tcp
sudo ufw allow 5280/tcp
sudo ufw allow 5281/tcp

3. Configurar Prosody

Ahora toca configurar Prosody. Para ello editamos el archivo /etc/prosody/prosody.cfg.lua.

sudo nano /etc/prosody/prosody.cfg.lua

Modificamos el VirtualHost con el dominio que hemos elegido.

VirtualHost "dominio.com"

Es el momento de habilitar los módulos que necesitamos. Solo debes eliminar el comentario -- de las líneas que quieras activar.

Te recomiendo incluir, ya que no está presente en la configuración, el módulo cloud-notify para poder recibir Push Notifications en los smartphones. Debes agregarlos en la sección modules_enabled.

modules_enabled = {
    ...
	"cloud_notify";
}

Y a continuación modificamos el módulo añadiendo las siguientes líneas.

-- For iOS push notification...
-- mod_cloud_notify settings
push_notification_with_body = false;
push_notification_with_sender = true;

4. Obtener un certificado TLS

Para que la comunicación sea segura, necesitamos un certificado TLS. Puedes obtener uno gratuito de Let’s Encrypt.

sudo apt install certbot
sudo certbot certonly --standalone -d dominio.com

Ahora ya podemos importar el certificado en Prosody.

prosodyctl --root cert import /etc/letsencrypt/live/

Te recomiendo que añadas un cron para que se renueve automáticamente el certificado dentro de Prosody.

sudo crontab -e

Incluye la siguiente línea.

0 0 * * * prosodyctl --root cert import /etc/letsencrypt/live/

Comprueba que el certificado se ha importado correctamente.

prosodyctl --root cert status

5. Crear un usuario

Ahora toca crear un usuario. Lo llamaremos Mario y su contraseña será ilovepeach.

Para ello ejecutamos el siguiente comando.

prosodyctl --root register Mario dominio.com ilovepeach

6. Comprobar el funcionamiento

Configura tu cliente de mensajería instantánea con los siguientes datos.

  • Usuario: Mario.
  • Contraseña: ilovepeach.
  • Servidor: dominio.com.

En caso de que te pida el nombre de usuario, debe tener la siguiente estructura: mario@dominio.com.

Si todo ha ido bien, deberías poder conectarte. Aunque yo te recomiendo crear otro usuario e identificarte en otro dispositivo para mantener una conversación.

También puedes enviar un mensaje desde el terminal con sendxmpp. Supongamos que queremos lanzar un mensaje a luigi@dominio.com desde el usuario Mario.

echo "Hola desde terminal" | sendxmpp -t -u Mario -p ilovepeach -j dominio.com -t luigi@dominio.com

Y ya hemos terminado. Ahora puedes crear más usuarios y disfrutar de tu servidor de mensajería instantánea. No dudes en activar todos los módulos que necesites.

7. Compartir imágenes y archivos

Si quieres compartir imágenes y archivos, puedes instalar el módulo http_file_share.

Edita la siguiente línea en /etc/prosody/prosody.cfg.lua.

Component "upload.dominio.com" "http_file_share"

Añade un registro A en tu subdominio upload.dominio.com que apunte a la IP de tu servidor y obtén un certificado.

sudo certbot certonly --standalone -d upload.dominio.com

Y reinicia Prosody.

sudo systemctl restart prosody

Ahora puedes compartir archivos y fotos con tus contactos.

Si el subdominio tiene más niveles, como upload.im.dominio.com, o no coincida con el dominio principal, deberás modificar el archivo /etc/prosody/conf.avail/dominio.com.cfg.lua y añadir la siguiente línea para que se pueda descubrir el servicio.

disco_items = {
    { "upload.im.dominio.com", "file sharing service" },
}

Habilitar grupos

Opcionalmente puede ser interesante habilitar la posibilidad de crear grupos.

Edita el archivo /etc/prosody/prosody.cfg.lua y añade la siguiente configuración.

Component "conference.dominio.com" "muc"
    restrict_room_creation = true -- Fuerza a que solo los administradores puedan crear salas
modules_enabled = { "muc_mam", "vcard_muc" } -- Habilita el historial de mensajes y la tarjeta de contacto (como modificar el avatar del grupo)

Y configura el subdominio conference.dominio.com para que apunte a tu servidor.

Esta obra está bajo una Licencia Creative Commons Atribución-NoComercial-SinDerivadas 4.0 Internacional.

Atribución/Reconocimiento-NoComercial-SinDerivados 4.0 Internacional

¿Me ayudas?

Comprame un café
Pulsa sobre la imagen

No te sientas obligado a realizar una donación, pero cada aportación mantiene el sitio en activo logrando que continúe existiendo y sea accesible para otras personas. Además me motiva a crear nuevo contenido.

Comentarios

{{ comments.length }} comentarios

Nuevo comentario

Nueva replica  {{ formatEllipsisAuthor(replyComment.author) }}

Acepto la política de Protección de Datos.

Escribe el primer comentario

Tal vez también te interese...