# Prosody - XMPP

[**Prosody** ](https://prosody.im/)es un servidor de mensajería instantánea moderno basado en el protocolo [**XMPP** ](https://apuntes-alex.gitbook.io/apuntes-sistemas-y-redes/servicios/sistemas-de-notificacion-y-comunicacion-instantanea)(*Extensible Messaging and Presence Protocol*), escrito en el lenguaje de programación **Lua** y publicado bajo licencia MIT, lo que lo hace completamente open source y gratuito.

## ¿Qué hace Prosody? <a href="#qu-hace-prosody" id="qu-hace-prosody"></a>

Prosody actúa como el "servidor de correo" pero para mensajería instantánea: gestiona las cuentas de usuario, enruta los mensajes entre clientes y, si se configura, con otros servidores externos. Sus objetivos de diseño son tres:

* **Fácil de configurar** — un solo fichero `.cfg.lua` controla todo el servicio
* **Eficiente en recursos** — consume muy poca RAM y CPU, ideal para VMs de laboratorio
* **Extensible mediante módulos** — funcionalidades como salas de grupo (MUC), historial de mensajes, transferencia de archivos o llamadas de voz/vídeo se activan simplemente añadiendo módulos.

#### Funcionalidades principales <a href="#funcionalidades-principales" id="funcionalidades-principales"></a>

Mediante Prosody y un cliente compatible (como Gajim o Pidgin) se puede:\[[blog.desdelinux](https://blog.desdelinux.net/prosody-im-usuarios-locales-redes-pymes/)]​

* Enviar y recibir mensajes instantáneos entre usuarios
* Ver el **estado de presencia** de los contactos (conectado, ausente, ocupado...)
* Crear **salas de chat grupal** (componente MUC — Multi-User Chat)
* Transferir archivos entre usuarios
* Realizar llamadas de **voz y vídeo** mediante la extensión Jingle
* Cifrar las comunicaciones con TLS

#### Arquitectura cliente-servidor <a href="#arquitectura-cliente-servidor" id="arquitectura-cliente-servidor"></a>

Prosody escucha en dos puertos principales:

| Puerto   | Tipo                   | Función                                             |
| -------- | ---------------------- | --------------------------------------------------- |
| **5222** | C2S (Client to Server) | Comunicación entre el cliente (Gajim) y el servidor |
| **5269** | S2S (Server to Server) | Federación entre servidores XMPP                    |
| **5280** | HTTP/BOSH              | Acceso al servidor desde navegador web              |

{% hint style="info" %}
En entorno de aula, Prosody destaca frente a otras opciones open source como **ejabberd** u **OpenFire** precisamente por su simplicidad. ejabberd es más potente pero bastante más complejo de configurar, y OpenFire requiere Java.
{% endhint %}

## Implementación del servicio

### Escenario del laboratorio <a href="#escenario-del-laboratorio" id="escenario-del-laboratorio"></a>

Siguiendo el ejemplo de la guia de servidor de correo, vamos a seguir con el mismo esquema de simulación. Simularemos una empresa llamada `nombredetuempresa.local`. El esquema de máquinas será:

<table><thead><tr><th width="117.66668701171875">Máquina</th><th>SO</th><th>Rol</th><th>IP ejemplo</th></tr></thead><tbody><tr><td><code>servidor</code></td><td>Ubuntu Server 24.04</td><td>Postfix + Dovecot + Prosody</td><td>192.168.1.10</td></tr><tr><td><code>cliente1</code></td><td>Ubuntu Desktop 24.04</td><td>Thunderbird + Gajim</td><td>192.168.1.20</td></tr><tr><td><code>cliente2</code></td><td>Ubuntu Desktop 24.04</td><td>Thunderbird + Gajim</td><td>192.168.1.21</td></tr></tbody></table>

Ambas VMs deben estar en red interna (Host-Only o Internal Network en VirtualBox) y un segundo adaptador puente para las descargas e instalaciones. Añade al `/etc/hosts` del servidor y los clientes la resolución manual del dominio:

```
192.168.1.10  servidor.nombredetuempresa.local  mail.nombredetuempresa.local  chat.nombredetuempresa.local
```

***

Ahora ya podemos seguir con la instalación:

### Paso 1: Instalar Prosody <a href="#paso-8-instalar-prosody" id="paso-8-instalar-prosody"></a>

Añade el repositorio oficial para obtener la versión más reciente de este software:​

```bash
echo "deb [signed-by=/etc/apt/keyrings/prosody-debian-packages.key] \
  https://packages.prosody.im/debian $(lsb_release -cs) main" \
  | sudo tee /etc/apt/sources.list.d/prosody.list

wget -qO - https://prosody.im/files/prosody-debian-packages.key \
  | sudo tee /etc/apt/keyrings/prosody-debian-packages.key

sudo apt update && sudo apt install -y prosody
```

### Paso 2: Configurar Prosody <a href="#paso-9-configurar-prosody" id="paso-9-configurar-prosody"></a>

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

Ajusta las secciones clave del archivo de configuración, fíjate bien en los comentarios:​

```lua
admins = { "admin@empresa.local" }

-- Módulos útiles, ya vienen, solo descomenta los siguientes:
-- "muc" para salas de grupo
-- "bosh" para acceso web

allow_registration = false  -- los usuarios los crea el admin

-- Desactiva requisito de cifrado para lab sin DNS real
c2s_require_encryption = false
s2s_require_encryption = false

VirtualHost "empresa.local"
  ssl = {
    key = "/etc/ssl/private/empresa.key";
    certificate = "/etc/ssl/certs/empresa.crt";
  }

-- Sala de chat grupal (RA6.6)
Component "conference.empresa.local" "muc"
  restrict_room_creation = "admin"
```

Ahora vamos a revisar la configuración y reiniciar el servicio:

<pre class="language-bash"><code class="lang-bash">sudo <a data-footnote-ref href="#user-content-fn-1">prosodyctl </a>check config
sudo systemctl restart prosody
</code></pre>

### Paso 3: Crear usuarios XMPP <a href="#paso-10-crear-usuarios-xmpp-ra67" id="paso-10-crear-usuarios-xmpp-ra67"></a>

```bash
sudo prosodyctl adduser alumne1@empresa.local
sudo prosodyctl adduser alumne2@empresa.local
sudo prosodyctl adduser admin@empresa.local
```

### Paso 4: Abrir puertos en el firewall <a href="#paso-11-abrir-puertos-en-el-firewall" id="paso-11-abrir-puertos-en-el-firewall"></a>

Por si acaso:

```bash
sudo ufw allow 5222/tcp   # cliente → servidor
sudo ufw allow 5269/tcp   # servidor → servidor (federación)
sudo ufw allow 5280/tcp   # BOSH/HTTP
```

### Paso 5: Cliente Gajim <a href="#paso-12-cliente-gajim-ra63--ubuntu-desktop" id="paso-12-cliente-gajim-ra63--ubuntu-desktop"></a>

Vamos con nuestras máquinas clientes a instalar el cliente de chat:&#x20;

```bash
sudo apt install -y gajim
```

Configura la cuenta en Gajim:

* **JID:** `alumne1@empresa.local`
* **Servidor:** `empresa.local`
* **Puerto:** 5222
* Desmarca "Requerir cifrado" si no tienes certificado válido

Desde cada cliente debes agregarte mutuamente como contactos y enviar mensajes. Para el chat grupal, entra en *Cuentas → Unirse a sala* y conecta a `aula@conference.empresa.local`.

[^1]:
