202510
systems

使用 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,确保生产落地。