XMPP en 2026 : messagerie décentralisée, chiffrée et fédérée — Guide complet
Installation de Prosody, configuration TLS, OMEMO E2E, salons MUC, fédération mondiale, clients recommandés et cas d'usage avancés (IoT, alertes serveur). Le guide XMPP le plus complet du web.
XMPP (Extensible Messaging and Presence Protocol) est un protocole de messagerie ouvert, décentralisé et fédéré, qui tourne sur internet depuis 1999 — bien avant Signal, WhatsApp ou Telegram. Là où ces applications sont des silos fermés contrôlés par une entreprise, XMPP est un standard : n'importe qui peut héberger son propre serveur, chiffrer ses communications avec OMEMO, et envoyer des messages à n'importe quel autre serveur XMPP dans le monde, exactement comme l'email. Ce guide couvre tout : installation de Prosody, configuration TLS, modules essentiels, chiffrement OMEMO, fédération, clients recommandés, et dépannage.
Pourquoi XMPP en 2026 ?
La question revient souvent : "XMPP n'est-il pas mort ?" La réponse courte : non. La réponse longue mérite qu'on s'y attarde.
- WhatsApp, Signal, Telegram, Discord — tous ces services peuvent disparaître, être rachetés, être censurés, ou décider de changer leurs conditions un matin. XMPP est un protocole, pas une application : il ne peut pas être "fermé".
- Fédération : ton serveur XMPP peut contacter n'importe quel autre serveur XMPP dans le monde. Ton compte azuka@ton-serveur.fr peut écrire à quelqu'un sur mojeserver.cz ou jabber.org.
- Décentralisation réelle : personne ne détient "XMPP". Pas de metadata centralisée, pas de graphe social global, pas d'entreprise qui monétise tes données.
- OMEMO (basé sur le Signal Protocol) offre un chiffrement de bout en bout avec Perfect Forward Secrecy, multi-appareils, et multi-destinataires — au même niveau que Signal.
- XMPP propulse aujourd'hui WhatsApp (leur infra interne), Google Chat (historiquement), la majorité des jeux en ligne (Xbox Live, PlayStation Network, EVE Online), l'IoT industriel, et des millions d'installations d'entreprises.
XMPP ne remplace pas Signal pour le grand public — l'expérience utilisateur est plus complexe. XMPP brille pour : hébergement auto, communications d'équipe souveraines, intégration technique, notifications serveur, et toute situation où vous ne voulez pas dépendre d'un tiers.
Architecture XMPP : comment ça fonctionne
Le JID — votre identité XMPP
Votre identifiant XMPP s'appelle un JID (Jabber ID). Il ressemble à une adresse email :
# Format complet (bare JID) :
azuka@xytherion.online
# JID complet avec ressource (full JID) — identifie un appareil spécifique :
azuka@xytherion.online/laptop
azuka@xytherion.online/phone
# JID d'un salon de discussion (MUC) :
general@conference.xytherion.online
# Chaque connexion d'un même compte sur des appareils différents = ressource différente
# Les messages sont livrés à TOUTES les ressources connectées (ou la plus prioritaire)Fédération : le modèle email appliqué à la messagerie
XMPP fonctionne exactement comme l'email au niveau transport. Quand azuka@monserveur.fr envoie un message à alice@autreserveur.com :
- 1Le client XMPP d'azuka envoie le message à monserveur.fr (connexion TLS client→serveur, port 5222)
- 2monserveur.fr résout le SRV record DNS de autreserveur.com
- 3monserveur.fr établit une connexion TLS serveur→serveur avec autreserveur.com (port 5269)
- 4Le message est livré — aucun serveur central n'est impliqué
# DNS SRV records XMPP (à configurer chez votre registrar)
# Client → Serveur (c2s) :
_xmpp-client._tcp.xytherion.online. IN SRV 5 0 5222 xytherion.online.
# Serveur → Serveur (s2s) :
_xmpp-server._tcp.xytherion.online. IN SRV 5 0 5269 xytherion.online.
# XMPP over HTTPS (BOSH/WebSocket pour clients web) :
_xmppconnect.xytherion.online. IN TXT "_xmpp-client-xbosh=https://xytherion.online/http-bind"
# Vérifier les records existants
dig SRV _xmpp-client._tcp.xytherion.online
dig SRV _xmpp-server._tcp.xytherion.onlineChoisir son serveur XMPP
Trois implémentations dominent en 2026 :
- Prosody (Lua) — léger, modulaire, excellente documentation, recommandé pour hébergement perso et PME. C'est ce guide.
- ejabberd (Erlang) — massivement scalable (WhatsApp en dérivait), utilisé pour des millions d'utilisateurs. Configuration plus complexe.
- Openfire (Java) — interface web d'administration intégrée, populaire en entreprise Windows. Plus lourd.
Pour un VPS personnel ou une petite équipe (< 1000 utilisateurs), Prosody est le meilleur choix. Sa config en Lua est lisible, ses modules sont excellents, et sa mémoire au repos est de l'ordre de 20-50 MB.
Installation de Prosody sur Debian/Ubuntu
# Ajouter le dépôt officiel Prosody (versions plus récentes que Debian stable)
echo "deb https://packages.prosody.im/debian $(lsb_release -cs) main" | tee /etc/apt/sources.list.d/prosody.list
# Importer la clé GPG
curl -fsSL https://prosody.im/files/prosody-debian-packages.key | gpg --dearmor | tee /etc/apt/trusted.gpg.d/prosody.gpg > /dev/null
apt update && apt install -y prosody
# Vérifier la version
prosodyctl about
# Prosody 0.12.x "Hermit Thrush"
# Statut
systemctl status prosody
# Structure des fichiers importants
ls /etc/prosody/
# prosody.cfg.lua ← fichier de configuration principal
# certs/ ← certificats SSL (symlinks depuis Let's Encrypt)
# conf.d/ ← configurations supplémentaires (VirtualHosts)Configuration de Prosody (prosody.cfg.lua)
Le fichier /etc/prosody/prosody.cfg.lua contrôle tout. Voici une configuration complète et sécurisée pour un serveur de production.
cp /etc/prosody/prosody.cfg.lua /etc/prosody/prosody.cfg.lua.bak
nano /etc/prosody/prosody.cfg.lua---------- Prosody Configuration — Production Ready ----------
-- Remplacez "xytherion.online" par votre domaine partout
-- Processus
pidfile = "/run/prosody/prosody.pid"
-- Modules activés globalement
modules_enabled = {
-- Essentiels
"roster"; -- Liste de contacts
"saslauth"; -- Authentification SASL
"tls"; -- Chiffrement TLS
"dialback"; -- Vérification serveur-serveur
"disco"; -- Découverte de services
"carbons"; -- Sync messages multi-appareils (XEP-0280)
"smacks"; -- Stream Management / reconnexion (XEP-0198)
"csi_simple"; -- Client State Indication / batterie (XEP-0352)
-- Présence et contacts
"presence"; -- Gestion de présence
"private"; -- Stockage privé XML
"vcard4"; -- Cartes de contact vCard4
"blocklist"; -- Liste noire (XEP-0191)
-- Messages
"mam"; -- Message Archive Management (XEP-0313) historique
"ping"; -- XMPP Ping (XEP-0199)
-- Transfert de fichiers
"http_upload"; -- Upload de fichiers via HTTP (XEP-0363)
-- Administration
"admin_adhoc"; -- Commandes d'administration
"motd"; -- Message du jour
"announce"; -- Annonces globales
-- Sécurité
"limits"; -- Limitation de débit
"s2s_bidi"; -- Connexions bidirectionnelles s2s (XEP-0288)
"watchregistrations"; -- Surveiller les nouvelles inscriptions
};
-- Modules désactivés
modules_disabled = {};
-- Stockage des données
data_path = "/var/lib/prosody"
default_storage = "internal"
-- Stockage Message Archive Management
storage = {
archive = "internal";
archive2 = "internal";
}
-- MAM : garder l'historique 3 mois
archive_expires_after = "3m"
-- Authentification
authentication = "internal_hashed" -- Mots de passe hashés (bcrypt)
-- TLS — désactiver les protocoles faibles
ssl = {
protocol = "tlsv1_2+"; -- TLS 1.2 minimum
ciphers = "ECDHE+AESGCM:ECDHE+CHACHA20:!aNULL:!eNULL:!EXPORT";
options = { "no_sslv2"; "no_sslv3"; "no_tlsv1"; "no_tlsv1_1"; "cipher_server_preference" };
dhparam = "/etc/prosody/certs/dh2048.pem"; -- Voir ci-dessous
}
-- Forcer TLS pour toutes les connexions
c2s_require_encryption = true -- Clients → Serveur
s2s_require_encryption = true -- Serveur → Serveur
s2s_secure_auth = false -- true = rejeter les s2s non-vérifiés (strict)
-- Ports
c2s_ports = { 5222 } -- Client → Serveur
s2s_ports = { 5269 } -- Serveur → Serveur
legacy_ssl_ports = { 5223 } -- SSL legacy (optionnel)
-- HTTP pour BOSH/WebSocket et upload de fichiers
http_ports = { 5280 }
http_interfaces = { "127.0.0.1" } -- Exposer via reverse proxy Apache/Nginx
https_ports = {} -- Apache/Nginx gère le TLS HTTP
-- Inscription : désactivée par défaut (créer les comptes manuellement)
allow_registration = false
-- Rate limiting pour éviter le spam
limits = {
c2s = {
rate = "10kb/s";
burst = "30kb/s";
};
s2s = {
rate = "30kb/s";
burst = "100kb/s";
};
}
-- Logs
log = {
info = "/var/log/prosody/prosody.log";
error = "/var/log/prosody/prosody.err";
-- debug = "/var/log/prosody/prosody_debug.log"; -- Activer si besoin
}
----------- VirtualHosts -----------
VirtualHost "xytherion.online"
-- Certificats Let's Encrypt (prosodyctl --root cert import après renouvellement)
ssl = {
certificate = "/etc/letsencrypt/live/xytherion.online/fullchain.pem";
key = "/etc/letsencrypt/live/xytherion.online/privkey.pem";
}
----------- Composants -----------
-- Salon de discussion multi-utilisateurs (MUC — Multi-User Chat)
Component "conference.xytherion.online" "muc"
name = "Salons Xytherion"
restrict_room_creation = "local" -- Seuls les utilisateurs locaux créent des salons
muc_log_all_rooms = true -- Archiver tous les salons
max_history_messages = 100 -- Messages récupérés à la connexion
modules_enabled = {
"muc_mam"; -- Archive des salons
"muc_occupant_id"; -- ID anonyme (XEP-0421)
}
-- Serveur de proxy SOCKS5 pour le transfert de fichiers pair-à-pair
Component "proxy.xytherion.online" "proxy65"
proxy65_address = "xytherion.online"
proxy65_acl = { "xytherion.online" }
-- PubSub (notifications push, IoT)
Component "pubsub.xytherion.online" "pubsub"
unrestricted_node_creation = falseCertificats TLS avec Let's Encrypt
# Installer Certbot si pas déjà fait
apt install -y certbot
# Obtenir le certificat (mode standalone — arrêter Apache/Nginx temporairement si nécessaire)
certbot certonly --standalone -d xytherion.online -d conference.xytherion.online -d proxy.xytherion.online -d pubsub.xytherion.online
# Ou avec Apache/Nginx actif :
certbot certonly --webroot -w /var/www/html -d xytherion.online -d conference.xytherion.online
# Générer les paramètres DH (une seule fois, peut prendre quelques minutes)
openssl dhparam -out /etc/prosody/certs/dh2048.pem 2048
# Importer les certificats dans Prosody
prosodyctl --root cert import /etc/letsencrypt/live/
# Vérifier que Prosody a accès aux certificats
ls -la /etc/prosody/certs/
# Hook de renouvellement automatique (post-hook Certbot)
cat > /etc/letsencrypt/renewal-hooks/deploy/prosody.sh << 'EOF'
#!/bin/bash
prosodyctl --root cert import /etc/letsencrypt/live/
systemctl reload prosody
EOF
chmod +x /etc/letsencrypt/renewal-hooks/deploy/prosody.shDémarrer Prosody et créer les utilisateurs
# Vérifier la configuration
prosodyctl check config
# Affiche les erreurs et avertissements de configuration
# Vérifier les certificats
prosodyctl check certs
# Démarrer Prosody
systemctl start prosody
systemctl enable prosody
# Créer un compte utilisateur
prosodyctl adduser azuka@xytherion.online
# Password: ••••••••
# Changer le mot de passe
prosodyctl passwd azuka@xytherion.online
# Supprimer un compte
prosodyctl deluser azuka@xytherion.online
# Lister les utilisateurs
prosodyctl mod_admin_adhoc # Via interface admin
# Voir les connexions en cours
prosodyctl status
# Voir les logs en temps réel
journalctl -u prosody -f
tail -f /var/log/prosody/prosody.logConfigurer le pare-feu
# Ports XMPP à ouvrir dans UFW
ufw allow 5222/tcp comment "XMPP client-to-server (c2s)"
ufw allow 5269/tcp comment "XMPP server-to-server (s2s)"
ufw allow 5223/tcp comment "XMPP legacy SSL (optionnel)"
# Port proxy65 (transfert de fichiers P2P)
ufw allow 5000/tcp comment "XMPP proxy65 file transfer"
# HTTP/HTTPS pour BOSH, WebSocket et upload (géré par Apache/Nginx)
# Déjà ouvert si vous avez un site web
# Port 5280/5281 : NE PAS ouvrir depuis l'extérieur
# Prosody HTTP est sur 127.0.0.1 — Apache proxifie vers lui
ufw reload
ufw status numberedReverse proxy Apache pour BOSH et WebSocket
BOSH et WebSocket permettent aux clients web (Converse.js, etc.) de se connecter via HTTPS. Prosody écoute sur 127.0.0.1:5280, Apache proxifie.
a2enmod proxy proxy_http proxy_wstunnel headers rewrite# Dans le VirtualHost HTTPS de xytherion.online
# BOSH (HTTP long-polling)
ProxyPass /http-bind http://127.0.0.1:5280/http-bind
ProxyPassReverse /http-bind http://127.0.0.1:5280/http-bind
# WebSocket XMPP
RewriteEngine On
RewriteCond %{HTTP:Upgrade} websocket [NC]
RewriteCond %{HTTP:Connection} upgrade [NC]
RewriteRule ^/xmpp-websocket$ "ws://127.0.0.1:5280/xmpp-websocket" [P,L]
ProxyPass /xmpp-websocket ws://127.0.0.1:5280/xmpp-websocket
ProxyPassReverse /xmpp-websocket ws://127.0.0.1:5280/xmpp-websocket
# Upload de fichiers HTTP (XEP-0363)
ProxyPass /upload http://127.0.0.1:5280/upload
ProxyPassReverse /upload http://127.0.0.1:5280/uploadDans prosody.cfg.lua, configurez les URLs publiques pour l'upload :
-- Dans la section VirtualHost ou globale de prosody.cfg.lua
http_upload_base_url = "https://xytherion.online/upload"
http_upload_file_size_limit = 104857600 -- 100 MB max par fichier
http_upload_quota = 1073741824 -- 1 GB par utilisateurModules essentiels détaillés
Message Carbons (XEP-0280) — sync multi-appareils
Sans Carbons, un message reçu sur votre téléphone n'apparaît pas sur votre PC. Carbons résout ça : chaque message est copié sur tous vos appareils connectés.
-- Déjà activé avec "carbons" dans modules_enabled
-- Aucune configuration supplémentaire nécessaire
-- Le client doit demander l'activation (tous les clients modernes le font automatiquement)Message Archive Management — MAM (XEP-0313)
MAM stocke les messages côté serveur et les synchronise quand vous vous reconnectez — indispensable si vous éteignez votre téléphone.
-- Dans prosody.cfg.lua
archive_expires_after = "3m" -- Conserver 3 mois (ou "1w", "1y", "never")
-- Par VirtualHost si besoin de règles différentes :
VirtualHost "xytherion.online"
archive_expires_after = "6m"
-- Pour les salons MUC :
Component "conference.xytherion.online" "muc"
modules_enabled = { "muc_mam" }
muc_log_all_rooms = true
muc_log_expires_after = "1y"Stream Management — Smacks (XEP-0198)
Smacks permet de reprendre une session après une coupure réseau sans perdre de messages. Essentiel sur mobile (3G, WiFi fluctuant).
-- Déjà dans modules_enabled avec "smacks"
-- Paramètres optionnels :
smacks_hibernation_time = 600 -- Garder la session en hibernation 10 minutes
-- (permet de reprendre après coupure mobile)HTTP File Upload (XEP-0363) — partage de fichiers
-- Dans modules_enabled : "http_upload"
-- Dans prosody.cfg.lua :
http_upload_base_url = "https://xytherion.online/upload"
http_upload_file_size_limit = 104857600 -- 100 MB par fichier
http_upload_quota = 1073741824 -- 1 GB par utilisateur
-- Nettoyage automatique des vieux fichiers (optionnel)
http_upload_expire_after = 60 * 60 * 24 * 30 -- 30 jours (en secondes)OMEMO : chiffrement de bout en bout
OMEMO (XEP-0384) est le protocole de chiffrement de bout en bout de XMPP. Il est basé sur le Signal Protocol (Double Ratchet + X3DH), exactement le même que Signal utilise. Ses propriétés :
- E2E : le serveur ne voit jamais le contenu des messages
- Perfect Forward Secrecy : une clé compromise ne compromet pas les messages passés
- Multi-appareils : un message chiffré pour alice@serveur.com est chiffré pour TOUS ses appareils simultanément
- Asynchrone : vous pouvez chiffrer un message même si le destinataire est hors ligne (les clés publiques sont stockées sur le serveur via PEP)
Activer PEP (Personal Eventing Protocol) — requis pour OMEMO
-- PEP est nécessaire pour stocker les clés OMEMO sur le serveur
-- Ajouter dans modules_enabled :
modules_enabled = {
-- ... autres modules ...
"pep"; -- Personal Eventing Protocol (XEP-0163)
"pep_simple"; -- Implémentation simplifiée, recommandée
}
-- PEP storage (garder les clés OMEMO)
storage = {
archive = "internal";
archive2 = "internal";
-- Les clés OMEMO sont stockées dans pep, automatiquementComment OMEMO fonctionne techniquement
Quand Alice installe un client XMPP avec OMEMO :
- 1Son client génère une paire de clés d'identité (IK) et des pré-clés (PreKeys) Curve25519
- 2Ces clés publiques sont publiées sur le serveur via PEP
- 3Quand Bob veut écrire à Alice, il récupère ses clés publiques et les utilise pour dériver une clé de session (X3DH)
- 4Les messages sont chiffrés avec cette clé + Double Ratchet (clé différente pour chaque message)
- 5Le serveur ne voit que du chiffré — il ne peut pas lire, et ne peut pas recalculer les clés passées
OMEMO est activé côté CLIENT, pas côté serveur. Le serveur doit juste supporter PEP et MAM. Côté serveur, vous n'avez rien de plus à configurer que ce qui est ci-dessus.
Salons de discussion (MUC — Multi-User Chat)
# Les salons sont créés par les clients (si restrict_room_creation = "local")
# Vous pouvez aussi les créer en ligne de commande via prosodyctl :
# Lister les salons existants
prosodyctl mod_muc_config --host conference.xytherion.online list
# Créer un salon permanent depuis un client :
# Se connecter au JID : general@conference.xytherion.online
# Dans la config du salon, cocher "Persistent"
# Voir les occupants d'un salon
prosodyctl shell
> muc:room("general@conference.xytherion.online"):occupants()-- Configuration avancée MUC dans prosody.cfg.lua
Component "conference.xytherion.online" "muc"
name = "Salons Xytherion"
restrict_room_creation = "local" -- "local", true (admin only), false (tous)
-- Valeurs par défaut pour les nouveaux salons
muc_room_default_public = false -- Salon privé par défaut
muc_room_default_members_only = true -- Membres uniquement par défaut
muc_room_default_persistent = true -- Salon permanent par défaut
muc_room_default_history_length = 50 -- Historique à la connexion
-- Logging et archivage
modules_enabled = { "muc_mam"; "muc_occupant_id"; }
muc_log_all_rooms = true
muc_log_expires_after = "1y"
max_history_messages = 100Push notifications (XEP-0357)
Sur mobile, les clients XMPP utilisent les push notifications pour recevoir les messages quand l'app est en arrière-plan. Prosody supporte cela via mod_cloud_notify.
# Installer le module community (hors dépôt Debian)
# Via luarocks ou le dépôt Prosody modules :
apt install -y mercurial
hg clone https://hg.prosody.im/prosody-modules/ /opt/prosody-modules
# Ajouter le chemin dans prosody.cfg.lua
plugin_paths = { "/opt/prosody-modules" }
# Puis dans modules_enabled :
# "cloud_notify" -- XEP-0357 push notifications
# Alternative : utiliser un serveur de push externe compatible
# (UnifiedPush, ntfy, etc.)Vérifier la conformité de votre serveur
Le site xmpp.net/observe permet de tester votre serveur XMPP et d'obtenir un score de conformité aux XEPs modernes.
# Tester manuellement avec prosodyctl check
prosodyctl check
# Vérifier la connectivité s2s
prosodyctl check cert xytherion.online
# Test de connexion TLS
openssl s_client -connect xytherion.online:5222 -starttls xmpp -name xytherion.online 2>/dev/null | grep -E "Protocol|Cipher|Verify"
# Test s2s
openssl s_client -connect xytherion.online:5269 -starttls xmpp-server -name xytherion.online 2>/dev/null | grep -E "Protocol|Cipher|Verify"
# Test DNSSEC sur les SRV records
drill -TD _xmpp-client._tcp.xytherion.online SRV 2>/dev/null | grep -E "AD|Secure"
# Depuis un autre serveur XMPP, envoyer un message à votre JID est le meilleur testClients XMPP recommandés en 2026
Desktop
- Gajim (Windows/Linux/macOS) — le client desktop le plus complet, OMEMO natif, gestion MUC avancée, plugins
- Dino (Linux, GTK4) — interface épurée style moderne, OMEMO, MUC, intégration GNOME. Excellent pour les linuxiens
- Beagle IM / Siskin IM (macOS/iOS — même projet) — les meilleurs clients Apple, OMEMO, push iOS
- Monal (macOS/iOS) — alternatif Apple, open source, OMEMO
Mobile
- Conversations (Android) — LA référence Android, OMEMO natif, excellente gestion de la batterie, push, transfert de fichiers. Payant sur Play Store, gratuit sur F-Droid
- Monocles Chat (Android, fork de Conversations) — plus de features, F-Droid
- Cheogram (Android) — fork de Conversations avec support appels, mieux sur certains réseaux
- Monal (iOS) — meilleur client iOS actuel, OMEMO, push APNs
- Siskin IM (iOS) — alternative Monal
Web
- Converse.js — client web JavaScript, peut être self-hosted ou intégré dans votre site, OMEMO
- ConverseJS + Prosody = stack complète self-hosted accessible depuis n'importe quel navigateur
# Installer Converse.js en self-hosted avec Prosody
apt install -y npm
npm install -g @converse/headless
# Ou télécharger la version pré-buildée
wget https://github.com/conversejs/converse.js/releases/latest/download/converse.min.js
# Intégrer dans votre page HTML :
# <script src="converse.min.js"></script>
# <script>
# converse.initialize({
# bosh_service_url: 'https://xytherion.online/http-bind',
# websocket_url: 'wss://xytherion.online/xmpp-websocket',
# });
# </script>Fédération : se connecter au réseau XMPP mondial
Par défaut, votre serveur Prosody accepte les connexions fédérées. Dès que les DNS SRV sont configurés et que TLS fonctionne, vous pouvez contacter n'importe quel serveur XMPP dans le monde.
-- Contrôle de la fédération dans prosody.cfg.lua
s2s_require_encryption = true -- TLS obligatoire pour s2s
s2s_secure_auth = false -- false = fédérer avec tous (même sans DNSSEC)
-- true = uniquement avec DNSSEC + TLS valide
-- Liste blanche (n'accepter que ces serveurs) :
s2s_whitelist = { "jabber.org", "conversations.im" }
-- Liste noire (bloquer certains serveurs spammeurs) :
s2s_blacklist = { "spam.example.com" }
-- Serveurs XMPP publics notables avec lesquels fédérer :
-- jabber.org (le serveur historique, depuis 1999)
-- conversations.im (serveur des développeurs de Conversations Android)
-- disroot.org (serveur militant, privacy-first)
-- 404.city (serveur technique russe)# Tester la connexion fédérée vers un autre serveur
prosodyctl shell
> s2s:show() -- Voir toutes les connexions s2s actives
> s2s:show("jabber.org") -- Connexion vers jabber.org
# Depuis un compte sur votre serveur, envoyer un message cross-serveur :
# alice@xytherion.online → bob@jabber.org
# Si ça marche → votre fédération est opérationnelleCas d'usage avancés
Notifications serveur / alertes système via XMPP
XMPP est excellent pour envoyer des alertes système (Zabbix, Grafana, cron) depuis un serveur vers votre téléphone.
# Envoyer un message XMPP depuis un script bash
apt install -y sendxmpp
# Configurer sendxmpp
cat > ~/.sendxmpprc << 'EOF'
bot@xytherion.online motdepasse
EOF
chmod 600 ~/.sendxmpprc
# Envoyer une alerte
echo "⚠️ Disque plein sur /dev/sda1 — 95%" | sendxmpp azuka@xytherion.online
# Depuis un cron job de monitoring :
# */5 * * * * df / | awk 'NR==2 {if($5+0>90) print "Disque "$5}' | sendxmpp azuka@xytherion.online
# Python — send XMPP message
pip install slixmpp
python3 << 'EOF'
import asyncio, slixmpp
class SendMsg(slixmpp.ClientXMPP):
def __init__(self, jid, pwd, to, msg):
super().__init__(jid, pwd)
self.to, self.msg = to, msg
self.add_event_handler("session_start", self.start)
async def start(self, event):
self.send_message(mto=self.to, mbody=self.msg, mtype='chat')
self.disconnect()
xmpp = SendMsg("bot@xytherion.online", "password", "azuka@xytherion.online", "Alerte!")
xmpp.connect()
xmpp.process(forever=False)
EOFXMPP pour l'IoT — protocole léger sur appareils embarqués
XMPP est utilisé dans l'IoT industriel (IEEE 802.15.4, Matter) grâce à son modèle publish-subscribe (PubSub). Un Raspberry Pi ou un ESP32 peut publier des mesures sur un nœud PubSub XMPP.
# Exemple : Raspberry Pi publie la température sur un nœud PubSub XMPP
pip3 install slixmpp
python3 << 'EOF'
import asyncio, slixmpp
from slixmpp.plugins.xep_0060.stanza.pubsub import EventItem
class TempPublisher(slixmpp.ClientXMPP):
def __init__(self):
super().__init__("pi@xytherion.online", "password")
self.register_plugin('xep_0030') # Service discovery
self.register_plugin('xep_0060') # PubSub
self.add_event_handler("session_start", self.publish_temp)
async def publish_temp(self, event):
# Lire la température du CPU
with open('/sys/class/thermal/thermal_zone0/temp') as f:
temp = int(f.read()) / 1000
# Publier sur le nœud PubSub
await self['xep_0060'].publish(
'pubsub.xytherion.online',
'temperature/pi',
payload=f'<temp unit="C">{temp:.1f}</temp>'
)
print(f"Température publiée : {temp:.1f}°C")
self.disconnect()
xmpp = TempPublisher()
xmpp.connect()
xmpp.process(forever=False)
EOFDiagnostic et dépannage
# Vérification complète de l'installation
prosodyctl check # Syntaxe config + certificats + DNS
# Voir les connexions en temps réel
prosodyctl shell
> c2s:show() -- Clients connectés
> s2s:show() -- Serveurs fédérés connectés
> host:users("xytherion.online") -- Utilisateurs actifs
# Activer le debug temporairement
# Dans prosody.cfg.lua : log = { debug = "*" }
systemctl reload prosody
tail -f /var/log/prosody/prosody.log | grep -E "ERROR|WARN|debug"
# Tester la connexion client manuellement
openssl s_client -connect xytherion.online:5222 -starttls xmpp
# Puis envoyer : <stream:stream xmlns='jabber:client' to='xytherion.online'>
# Vérifier les SRV DNS depuis l'extérieur
dig +short SRV _xmpp-client._tcp.xytherion.online
dig +short SRV _xmpp-server._tcp.xytherion.online
# Test de connexion s2s depuis un autre serveur
# Sur le serveur distant :
telnet xytherion.online 5269
# ou
curl -v telnet://xytherion.online:5269Problèmes fréquents et solutions
- Erreur 'No valid certificate' : prosodyctl --root cert import /etc/letsencrypt/live/ puis systemctl reload prosody
- Fédération échoue avec 'certificate-mismatch' : vérifiez que le certificat couvre les sous-domaines (conference., proxy., pubsub.)
- Client se déconnecte souvent sur mobile : activez smacks avec smacks_hibernation_time = 600
- Upload de fichiers échoue : vérifiez le reverse proxy Apache et que http_upload_base_url est en HTTPS
- Pas de messages hors ligne : vérifiez que 'mam' est dans modules_enabled et que archive_expires_after > 0
- OMEMO ne fonctionne pas : vérifiez que PEP est activé ('pep' dans modules_enabled) et que MAM est configuré
- Erreur 'no shared cipher' : mettez à jour openssl et vérifiez la directive ssl.ciphers dans prosody.cfg.lua
XMPP vs Signal vs Matrix vs Telegram
Chaque protocole a ses forces. Voici une comparaison honnête :
- XMPP : décentralisé, fédéré, self-hostable, OMEMO E2E, protocole 25 ans. Interface client variable selon l'app. Idéal pour contrôle total et infrastructure proprio.
- Signal : E2E parfait, UX excellente, protocole ouvert. Mais centralisé (Signal Foundation) — dépend de numéros de téléphone et d'une infrastructure unique. Ne se fédère pas.
- Matrix/Element : décentralisé, fédéré, multi-device. Serveurs très lourds (Synapse consomme 1-4 GB de RAM vs ~50 MB pour Prosody). Bridges vers WhatsApp/Telegram/Discord.
- Telegram : pratique, populaire. Pas de E2E par défaut (chiffrement cloud uniquement), propriétaire, serveurs en Dubaï. Chats secrets = E2E mais pas multi-device.
- WhatsApp : E2E Signal Protocol (ironie), mais Meta collecte les métadonnées, propriétaire, pas fédéré.
Le meilleur choix dépend de votre use case. Pour la vie privée personnelle maximale avec UX simple → Signal. Pour infrastructure d'équipe souveraine et contrôle total → XMPP. Pour bridges vers tous les protocoles → Matrix. Pour audience grand public → Telegram ou Signal.
Sécuriser votre serveur Prosody
-- prosody.cfg.lua — section sécurité complète
-- 1. Interdire l'inscription publique
allow_registration = false
-- 2. Forcer TLS partout
c2s_require_encryption = true
s2s_require_encryption = true
-- 3. Mots de passe hashés
authentication = "internal_hashed"
-- 4. Rate limiting
limits = {
c2s = { rate = "10kb/s"; burst = "50kb/s" };
s2s = { rate = "30kb/s"; burst = "300kb/s" };
}
-- 5. Timeout des connexions inactives (secondes)
c2s_timeout = 300
-- 6. Limiter la taille des stanzas (anti-DoS)
limits = {
c2s = {
rate = "10kb/s";
burst = "50kb/s";
max_stanza_size = 262144; -- 256 KB max par stanza
}
}# Vérifier que Prosody tourne sous son propre utilisateur (non-root)
ps aux | grep prosody
# prosody 12345 ... prosody (version) ← doit être l'utilisateur "prosody", pas root
# Permissions des fichiers
ls -la /var/lib/prosody/ # Doit appartenir à prosody:prosody
ls -la /etc/prosody/certs/ # Les clés privées doivent être 600
# Configurer fail2ban pour XMPP (optionnel)
# /etc/fail2ban/filter.d/prosody.conf
cat > /etc/fail2ban/filter.d/prosody.conf << 'EOF'
[Definition]
failregex = <HOST> failed to authenticate
ignoreregex =
EOF
# /etc/fail2ban/jail.d/prosody.conf
cat > /etc/fail2ban/jail.d/prosody.conf << 'EOF'
[prosody]
enabled = true
port = 5222,5223
filter = prosody
logpath = /var/log/prosody/prosody.log
maxretry = 5
bantime = 3600
EOF
systemctl restart fail2banMonitoring de votre serveur XMPP
# Statistiques Prosody en temps réel
prosodyctl shell
# Dans le shell Prosody :
> stats:show() -- CPU, mémoire, connexions
> c2s:count() -- Nombre de clients connectés
> s2s:count() -- Connexions fédérées
> host:users("xytherion.online") -- Comptes actifs
# Statistiques via HTTPS (activer mod_http_status dans prosody.cfg.lua)
# modules_enabled = { ... "http_status" ... }
# curl http://127.0.0.1:5280/status_json
# Intégration Prometheus (module community)
# plugin_paths = { "/opt/prosody-modules" }
# modules_enabled = { ... "prometheus" ... }
# curl http://127.0.0.1:5280/metrics → format Prometheus
# Alertes simples via cron
# Vérifier que Prosody tourne et qu'un ping répond
# */5 * * * * systemctl is-active prosody || echo "Prosody DOWN" | sendxmpp admin@xytherion.onlineTestez régulièrement votre serveur sur xmpp.net/observe — il vérifie TLS, SRV DNS, XMPP compliance et donne un score. Visez A ou A+. Le site conversations.im/compliance vérifie aussi les XEPs supportées.
Sources & références
- 1Prosody IM — Documentation officielle
Documentation complète de référence Prosody — la meilleure source pour la config
- 2XMPP Standards Foundation — XEPs
Toutes les extensions XMPP (XEPs) — la référence protocolaire officielle
- 3conversations.im — Compliance Tester
Tester la conformité de votre serveur aux XEPs modernes
- 4OMEMO — XEP-0384
Spécification officielle OMEMO E2E basé sur le Signal Protocol
- 5xmpp.net/observe — Server Tester
Test de sécurité TLS et conformité de votre serveur XMPP
- 6Prosody modules community
Catalogue des modules communautaires Prosody (cloud_notify, prometheus, etc.)
Testez vos configurations
Xytherion Tools propose des outils gratuits pour vérifier vos DNS, auditer votre SSL, tester SPF/DKIM/DMARC et bien plus — directement depuis votre navigateur.