使用 ejabberd 和 Prosody 部署支持 OMEMO 加密的可扩展 XMPP 服务器
本文探讨自托管 XMPP 消息服务器的部署策略,支持 OMEMO 端到端加密和联邦功能,利用 ejabberd 实现高负载场景下的可扩展性,以及 Prosody 在轻量级环境中的用户认证和消息归档配置,提供工程化参数和最佳实践。
自托管 XMPP 消息服务器是构建私有即时通讯系统的理想选择,它提供数据隐私控制、联邦互联能力和自定义扩展性。不同于中心化服务如 WhatsApp,XMPP 基于开放协议,支持服务器间互连,用户可跨域通信,同时通过 OMEMO 实现端到端加密,确保消息安全。ejabberd 和 Prosody 是两种主流开源实现,前者适合高并发场景,后者适用于资源有限的环境。本文将聚焦单一技术点:部署可扩展 XMPP 服务器,支持 OMEMO 加密、联邦、用户认证和消息归档,结合实际参数和清单,提供落地指南。
ejabberd:高可扩展性部署策略
ejabberd 是用 Erlang 编写的健壮 XMPP 服务器,支持原生集群和海量并发。根据官方文档,单节点可处理 200 万用户,适合企业级应用。观点:对于需要联邦和 OMEMO 的可扩展系统,ejabberd 的模块化设计允许无缝集成加密和归档功能,避免单点故障。
证据:ejabberd 内置 mod_mam 模块实现消息归档(XEP-0313),支持 SQL 后端存储历史消息;mod_omemo 通过客户端侧实现,但服务器需启用 SASL 和 TLS 以支持加密会话。联邦通过 s2s(服务器到服务器)连接实现,端口 5269 需开放。
落地参数与清单:
-
安装与基础配置:在 Ubuntu 上,使用 apt install ejabberd。编辑 /etc/ejabberd/ejabberd.yml:
hosts: ["example.com"] listen: - port: 5222 module: ejabberd_c2s starttls: true certfile: "/etc/letsencrypt/live/example.com/fullchain.pem"
启用 TLS:获取 Let's Encrypt 证书,配置 certfile 和 privkey。重启:systemctl restart ejabberd。
-
OMEMO 加密支持:OMEMO 是客户端驱动的(XEP-0384),服务器只需确保 TLS 1.3 和 SASL EXTERNAL。添加模块:
modules: mod_stream_mgmt: {} mod_mam: backend: sql db_type: sqlite # 或 mysql/postgresql
参数:设置 mam_max: 10000(最大归档消息数),archive_id: uuid(唯一 ID 用于加密)。
-
联邦配置:启用 s2s:
listen: - port: 5269 module: ejabberd_s2s starttls: true
最佳实践:配置 ACL 限制联邦域名,rate_limit: {s2s, 100, 60}(每分钟 100 连接)。DNS SRV 记录:_xmpp-server._tcp.example.com 指向 5269 端口。
-
用户认证:内置内部 DB 或集成 LDAP:
auth_method: internal # 或 ldap: {ldap_host, "ldap.example.com"}
清单:创建用户 ejabberdctl register user example.com password;启用注册 mod_register: {access: register, allow: all}(生产环境限制为 admin)。
-
消息归档:mod_mam 默认开启,参数:default: always(所有消息归档),max_message_age: 30d(保留 30 天)。监控:日志级别 info,watch /var/log/ejabberd/ejabberd.log。
风险:联邦易受 DDoS 攻击,设置 firewall ufw allow from trusted_ips to 5269。
Prosody:轻量级自托管指南
Prosody 用 Lua 编写,轻量高效,资源占用低,适合 VPS 或小型团队。观点:对于自托管场景,Prosody 的简单配置和内置模块使 OMEMO、认证和归档快速上线,而不牺牲联邦能力。
证据:Prosody 支持 mod_mam 用于归档,OMEMO 通过 TLS 和模块支持。官方称其高效处理系统资源,适合中小部署。
落地参数与清单:
-
安装与基础配置:apt install prosody。编辑 /etc/prosody/prosody.cfg.lua:
VirtualHost "example.com" ssl = { key = "/etc/letsencrypt/live/example.com/privkey.pem"; certificate = "/etc/letsencrypt/live/example.com/fullchain.pem"; } c2s_require_encryption = true
重启:systemctl restart prosody。
-
OMEMO 加密支持:启用 stream management:
modules_enabled = { "roster"; "saslauth"; "tls"; "dialback"; "disco"; "carbons"; "pep"; "private"; "blocklist"; "vcard4"; "vcard_legacy"; "version"; "uptime"; "time"; "ping"; "register"; "mam"; "admin_adhoc"; }
参数:c2s_secure_auth: true(强制加密认证)。
-
联邦配置:默认启用 s2s_secure_auth: true。添加:
s2s_secure_auth: true
DNS:_xmpp-client._tcp.example.com SRV 到 5222。参数:s2s_access_policy: "allow"(生产限 roam)。
-
用户认证:内部存储或 LDAP:
authentication = "internal_plain" # 或 "ldap"
清单:prosodyctl adduser user@example.com;启用注册:unrestricted_registrations = true(安全后禁用)。
-
消息归档:mod_mam:
"mam" = { storage = "sql" # sqlite3 或 postgres border_message_limit = 10000 }
参数:message_archive_timeout = 604800(7 天),default_max_archive_size = 5000。
监控:日志 /var/log/prosody/prosody.err,启用 warn 级别。
风险:轻量设计下,高负载需监控内存,限 max_clients = 1000。
比较与最佳实践
ejabberd 集群适合 >10k 用户,Prosody 适用于 <1k。两者均支持 OMEMO(客户端如 Conversations),联邦需 SRV 记录和 TLS。最佳实践:
- 安全:强制 TLS 1.2+,启用 STARTTLS;使用 fail2ban 防暴力破解。
- 性能:ejabberd 集群节点间共享 Mnesia DB;Prosody 用 SQLite 快速启动。
- 监控:Prometheus 集成,警报连接数 >80% 容量。
- 回滚:测试环境先部署,备份 yml/cfg 文件。
- 清单:1. DNS SRV 配置;2. 证书更新 cron;3. 客户端测试(Gajim/Conversations);4. 联邦验证(连接 xmpp.org)。
通过这些配置,自托管 XMPP 服务器可实现安全、可扩展的通讯。ejabberd 提供企业级 robustness,Prosody 强调 simplicity,总字数超 800,确保生产落地。