SSD Nodes Learn 🎉 VPS $5.50/月起
指南 Matt Connor作者: Matt Connor

如何在VPS上自托管SimpleX SMP中继服务器

按项目文档在 Ubuntu 22.04 或 24.04 VPS 上部署 SimpleX SMP 中继,涵盖固定版本、客户端所需指纹、端口、TLS、备份、非特权用户与威胁模型。

自托管的 SimpleX 聊天服务器负责什么

要自托管 SimpleX 聊天服务器,您需要在 VPS 上运行一个 daemon:smp-server,即 SMP(simplex messaging protocol)的中继服务。它保存联系人写入和读取的消息队列。另一个名为 xftp-server 的可选 daemon 用于中继文件传输。两者都来自同一个项目 simplexmq,每个组件都由一个二进制文件、一个配置文件和一个追加写入日志组成。

本文面向运维人员,而不是应用用户。中继服务不保存账户、联系人列表或聊天记录。它保存消息队列、部分尚未投递的密文,以及用于标识自身的证书。您需要负责的是服务可用性、少量磁盘空间,以及经过您服务器的元数据。

下面的每条命令、路径、端口和 flag 都来自项目自己的文档:SMP server hosting pageXFTP server pageprotocol security document。如果某个数字很重要,下面会注明其来源页面。

没有用户标识符的网络为什么仍需要中继

SimpleX 没有用户名、电话号码或账户 ID。联系人是一个单向队列:它位于某个中继上,由一方写入,另一方读取。您的两个联系人不共享任何可供服务器关联的信息。

这些队列仍必须存放在某处,原因很简单。两部手机很少会在同一秒在线。必须有一个组件负责立即接收消息,并将其保存到另一台设备请求读取为止。这就是 SMP 中继的全部作用。这也意味着两台设备永远不会直接连接,因此任何一方都不会获知另一方的 IP(互联网协议)地址。中继会代替它们承受这种暴露。

中继的主机名属于队列地址的一部分,因此它会包含在您从该中继生成并发出的每个邀请链接中。阅读末尾的威胁模型时,请记住这一点。

中继可以查看和无法查看的内容

项目在 protocol/security.md 中将此内容列为威胁模型。安装任何组件前,建议先阅读该说明,因为完成本指南后,该中继将由您管理。中继即使完全受攻击者控制,也无法获知消息内容或消息类型,无法在不被发现的情况下添加、复制或篡改单条消息,也无法通过主动攻击破解端到端加密。

同一页面还列出了中继可以执行的操作。中继可以获知队列接收方何时在线,可以统计通过某个队列的消息数量,也可以获知接收方的 IP 地址。中继可以丢弃队列中之后的所有消息,也可以伪造该队列的状态。

因此,职责划分很明确。机密性由客户端负责,自托管不会影响这一点。元数据和可用性由中继运营者负责,而自托管会将这两项都交给您。

开始前的准备

  • 一台运行 Ubuntu 22.04 或 24.04 的 VPS。该项目发布的二进制文件正好针对这两个版本构建,并支持 x86-64 和 aarch64。
  • 一个 A 记录指向该 VPS 的域名;如果使用 IPv6,还需要一个 AAAA 记录。文档使用 smp1.example.com 作为示例。
  • root 或 sudo 访问权限,并在修改防火墙时保持第二个 SSH 会话处于打开状态。
  • 服务器之外的备份存储位置,因为配置目录就是服务器的身份信息。

在 ARM 实例上,请使用 aarch64 资源,而不是 x86-64。本指南的其他内容无需更改;选择 ARM 还是 x86 VPS 方案取决于价格和单核速度,而不是该软件是否能够运行。

安装固定版本,而不是“latest”

项目提供了一个安装脚本。该脚本会获取当前版本,并注册 simplex-servers-update 命令。脚本可以正常工作,但仍应固定版本:如果中继的二进制文件在运行期间发生变化,出现故障时就无法可靠判断原因。

截至 2026 年 8 月,当前的 simplexmq 版本是 v6.5.0,发布于 29 April 2026。请查看发布页面以确定所需的标签,然后在下面的所有命令中使用该标签。

sudo useradd -m smp
sudo install -d -o smp -g smp -m 755 /etc/opt/simplex /var/opt/simplex

useradd -m smp 不设置密码,因此不能直接以 smp 身份登录。请先自行创建这两个目录,再执行其他操作。因为 /etc/opt 归 root 所有,权限为 755,smp 用户无法在其中写入自己的配置目录。

VER=v6.5.0
curl -fL "https://github.com/simplex-chat/simplexmq/releases/download/$VER/smp-server-ubuntu-24_04-x86-64" -o /tmp/smp-server
sha256sum /tmp/smp-server

将该哈希值与发布说明中同一标签对应的 SHA2-256 校验和进行比较。项目还使用 SimpleX Chat 密钥 FB44AF81A45BDE327319797C85107E357D4A17FC 对发布校验和进行签名。相关信息记录在服务器页面中。这样可以验证签名,而不必信任提供哈希值的页面。

sudo install -m 755 -o root -g root /tmp/smp-server /usr/local/bin/smp-server

请特意将其安装为 root 所有。服务以 smp 身份运行,因此即使服务遭到入侵,也无法改写它启动时使用的二进制文件。

初始化服务器,并保存它输出的两个密钥

sudo su smp -c "smp-server init --yes --store-log --daily-stats --no-password --fqdn=smp1.example.com"
  • --store-log-l)将队列以追加写入方式记录到 /var/opt/simplex/smp-server-store.log,因此中继服务重启后仍可保留队列。没有该选项时,重启会丢弃所有队列,所有经由此服务器路由的联系人都会停止工作。
  • --daily-stats-s)以 CSV 格式将计数器写入 /var/opt/simplex/smp-server-stats.daily.log
  • --fqdn将您的域名写入生成的证书。如果没有域名,请改用 --ip
  • --no-password允许任何人通过您的中继创建队列。若要保持私有,请在初始化完成后,在 /etc/opt/simplex/smp-server.ini[AUTH] 下设置 create_password,而不要在此处传递 --password,因为命令行内容会在命令运行期间出现在 shell 历史记录和进程列表中。

初始化会生成证书,并输出您必须保存的两个值。第一个值是指纹,它是一个 base64 字符串,同时也会写入 /etc/opt/simplex/fingerprint。第二个值是完整的服务器地址,由指纹和主机名组成。现在复制并保存这两个值。

初始化还会创建 /etc/opt/simplex/ca.key。文档要求将该文件移至离线存储。原因如下:客户端会固定该证书颁发机构的指纹,因此任何持有 ca.key 的人都可以签发新的服务器证书,而客户端会将该证书接受为您的证书。之后只有在通过 smp-server cert 轮换服务器证书时,才需要取回该文件。

将初始化视为一次性操作。地址中的指纹来自初始化时生成的颁发机构,因此重新生成该颁发机构会得到不同的地址,并使之前分发的地址失效。

作为非特权用户通过 systemd 运行

请按文档中的原样写入 /etc/systemd/system/smp-server.service

[Unit]
Description=SMP server systemd service

[Service]
User=smp
Group=smp
Type=simple
ExecStart=/usr/local/bin/smp-server start +RTS -N -RTS
ExecStopPost=/usr/bin/env sh -c '[ -e "/var/opt/simplex/smp-server-store.log" ] && cp "/var/opt/simplex/smp-server-store.log" "/var/opt/simplex/smp-server-store.log.bak"'
LimitNOFILE=65535
KillSignal=SIGINT
TimeoutStopSec=infinity

[Install]
WantedBy=multi-user.target

上游单元文件还包含 AmbientCapabilities=CAP_NET_BIND_SERVICE。该行之所以存在,是因为进程以 smp 身份运行,而低于 1024 的端口对非 root 进程不可用;如果没有该行,守护进程就无法绑定 80 或 443。提供这些端口时,请添加该行。LimitNOFILE=65535 也很重要,因为每个订阅客户端都会保持一个打开的 TCP 连接,而默认限制远低于繁忙中继所需的数量。每次停止时,ExecStopPost 都会将存储日志复制到一个 .bak 文件中,从而免费保留一个回滚点。

sudo systemctl daemon-reload
sudo systemctl enable --now smp-server
sudo systemctl status smp-server
sudo journalctl -fu smp-server

正常启动时会记录服务器地址。然后确认套接字确实已打开:

sudo ss -tlnp | grep -E ':(443|5223)'

两行都应显示 smp-server。让守护进程使用专用账户运行,且该账户没有 sudo 权限。这与 VPS 上的每服务专用账户 中介绍的做法相同,也可以避免某个网络守护进程中的缺陷最终获得 root shell。

需要开放哪些端口,以及应保持关闭的端口

文档列出了3个端口:5223/tcp、443/tcp 和 80/tcp。端口5223用于 SMP 传输。随附配置会在 [TRANSPORT] 下设置 port: 5223,443,因此同一协议也会响应443端口。这一点很重要,因为许多限制严格的网络只允许出站443端口流量。80端口仅用于可选的信息页面及其到 HTTPS 的重定向。

sudo ufw allow 22/tcp
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
sudo ufw allow 5223/tcp
sudo ufw enable

不要开放5224端口。该端口用于控制,文档通过 nc 127.0.0.1 5224 从服务器本机访问它。它会输出服务器状态并删除队列,因此应仅绑定到 loopback,并在 [AUTH] 下设置管理员密码和用户密码。如果您不熟悉此工具,请参阅VPS 上的 ufw 基础知识,了解规则顺序以及如何避免将自己锁在服务器之外。

还有一个控制点容易被忽略。多数服务商会在控制面板中运行独立于服务器上 ufw 的网络防火墙。某个端口即使在 ufw 中已开放,也可能在到达服务器前被丢弃。

客户端需要使用的服务器地址

smp://<fingerprint>[:<password>]@<public_hostname>[,<onion_hostname>]

这段字符串就是客户端的完整配置。将其粘贴到应用的服务器设置中,或者让其他人扫描应用显示的二维码。文档指出,二维码中包含密码,因此扫描二维码的人也可以通过您的服务器接收消息。

有一个已记录的行为会让所有人感到意外。在应用中添加服务器,只会影响之后创建的联系人。现有联系人仍保留在创建其队列的中继服务器上,不会迁移。这也是替换中继服务器后不能在第二天立即关闭旧中继服务器的原因。

添加 XFTP 文件中继

XFTP(SimpleX 文件传输协议)负责网络中的文件传输部分。它是一个独立的 daemon,并使用自己的地址。根据项目的 XFTP 公告,中继完全看不到文件元数据。它们只能看到单个分块,每个分块大小为 256kb、1mb 或 4mb,访问权限通过匿名凭据授权。发送方可以将同一个文件的分块分散到多个中继,因此您的服务器保存的是文件片段,而不是完整文件。

sudo useradd -m xftp
sudo install -d -o xftp -g xftp -m 755 /etc/opt/simplex-xftp /var/opt/simplex-xftp /srv/xftp
curl -fL "https://github.com/simplex-chat/simplexmq/releases/download/$VER/xftp-server-ubuntu-24_04-x86-64" -o /tmp/xftp-server
sudo install -m 755 -o root -g root /tmp/xftp-server /usr/local/bin/xftp-server
sudo su xftp -c "xftp-server init -l --fqdn=xftp1.example.com -q '20gb' -p /srv/xftp/"

它的配置位于 /etc/opt/simplex-xftp/,状态数据位于 /var/opt/simplex-xftp/,文件分块则位于 -p 指定的位置。systemd unit 的结构相同,其中使用 User=xftpExecStart=/usr/local/bin/xftp-server start +RTS -N -RTS。Init 会输出一个 xftp:// 地址,格式与 SMP 地址相同,并在 /etc/opt/simplex-xftp/fingerprint 中输出其独立的指纹。

需要提前规划端口冲突。XFTP 服务器的文档端口是 443,SMP 配置也列出了 443。同一地址上的同一个端口不能由两个进程同时绑定,因此在一台 VPS 上必须调整其中一项。最简单的做法是在 SMP 的 [TRANSPORT] 部分设置 port: 5223,将 443 留给文件中继,但这样会失去为使用受限网络的客户端提供的 443 回退端口。其他方案包括在同一台 VPS 上配置第二个 IP 地址,或使用第二台 VPS。

请根据实际情况设置配额。-q '20gb' 表示您承诺提供的磁盘空间。文件中继会消耗大量磁盘空间和带宽,消息中继几乎不会消耗这两项资源。

磁盘上存放什么,以及备份可以恢复什么

有两个目录需要关注。/etc/opt/simplex/ 是身份目录:包含 smp-server.ini、服务器证书和密钥、ca.key 以及 fingerprint/var/opt/simplex/ 是状态目录:smp-server-store.log 保存队列;如果启用了 restore_messages: on,还会保存未投递的消息,同时保存每日统计文件。

sudo systemctl stop smp-server
sudo tar czf /root/simplex-backup.tgz -C / etc/opt/simplex var/opt/simplex
sudo chmod 600 /root/simplex-backup.tgz
sudo systemctl start smp-server

请明确这个归档文件的用途。它不是消息归档:队列中的项目是使用中继从未持有的密钥加密的密文,而且随附的 [STORE_LOG] 配置会在 21 天后使消息过期。它是服务器身份的副本,其中包括 ca.key,因此取得该文件的人可以向您的联系人冒充您的中继。请将其加密,并存放在服务器之外。

备份的价值在于恢复。将 /etc/opt/simplex 恢复到新的 VPS 上,让相同的 DNS 名称指向它,指纹就不会改变,因此您发出的每个地址仍然有效。如果丢失该目录,就无法恢复:重新安装意味着生成新的指纹,也意味着使用新的地址,所有经由您的中继路由的联系人都会失效。

TLS:两张证书承担不同职责

SMP 传输不使用公共证书颁发机构。Init 会生成一个私有证书颁发机构和一张服务器证书,该证书颁发机构的指纹会包含在服务器地址中。客户端会将服务器提供的内容与这个固定指纹进行校验。项目将此机制描述为保护客户端到服务器的连接,防止中间人攻击。该端口不需要运行 ACME(自动证书管理环境)客户端,证书轮换需要手动执行 smp-server cert,并设置 SMP_SERVER_CFG_PATH

可选的信息页面使用另一张证书。其 [WEB] 部分列出 static_pathhttps: 443cert: /etc/opt/simplex/web.crtkey: /etc/opt/simplex/web.key。浏览器并不信任您的私有证书颁发机构,因此只有这个页面需要使用公共信任证书。文档中的 Docker 快速入门会将 Caddy 放在服务器前面,正是为了完成这项工作,并自动签发证书。

通过 Tor 访问中继

文档包含 Tor 章节。该章节从 Tor Project 软件源安装 Tor,并在 /etc/tor/torrc 中添加隐藏服务:

SOCKSPort 0
HiddenServiceNonAnonymousMode 1
HiddenServiceSingleHopMode 1
HiddenServiceDir /var/lib/tor/simplex-smp/
HiddenServicePort 5223 localhost:5223
HiddenServicePort 443 localhost:443

请仔细阅读这两行模式配置。单跳且不提供匿名性,意味着中继自身的位置不会被隐藏。洋葱地址访问速度快,并且客户端可以通过它连接,而您永远无法获知客户端的 IP 地址;但服务器本身仍可通过其公网 IP 找到。来自 /var/lib/tor/simplex-smp/hostname 的洋葱主机名应放在服务器地址末尾,并用逗号分隔。如果您还希望隐藏服务器的位置,则需要采用不同的配置;在 VPS 上运行真正的洋葱服务介绍了其中的权衡。每种工具隐藏的内容不同,Tor 与 VPN 的比较对此进行了说明,该区别在这里同样直接适用。

威胁模型:自托管会改变什么

它带来的好处。元数据(包括有哪些队列、何时读取队列、哪些地址建立连接)保存在您控制的机器上,保留时长也由您决定。您也不再属于一个可以被一次性请求大量数据的用户群体。

它不会带来以下好处:

  • 加密方式没有变化。在您部署此服务之前,消息已经采用端到端加密;部署之后仍然采用端到端加密。自托管改变的是元数据归属,不是密码学方案。
  • 您的 VPS 提供商可以看到发往您 IP 地址的流量,并持有您的账单信息。您只是将信任对象从消息服务运营商换成了托管服务运营商,并没有消除信任关系。
  • 您的中继服务覆盖的用户很少。如果它只服务于一个家庭,那么连接到该中继就能识别这个家庭,而且您通过它发送的每个邀请链接中都会包含其主机名。繁忙的公共中继在这一点上能更好地隐藏您的身份,而这正是两者之间的实际取舍。
  • 可用性现在由您负责。磁盘空间耗尽或机器故障都会导致消息停止投递,您的联系人也无法绕过您建立其他路由。

同样的逻辑适用于您部署在自有机器上的任何私有服务,无论是此中继服务,还是 您自己的 VPS 上的 WireGuard VPN。您是在选择由哪一方查看元数据,而不是让元数据消失。

无法正常工作

服务启动后立即停止。 查看 sudo journalctl -u smp-server -n 50。绑定失败信息会指出无法占用的端口。然后运行 sudo ss -tlnp | grep :443,查看哪个进程已经占用该端口。在全新安装的服务器上,占用者通常是 nginx、Caddy,或您一小时前安装的 XFTP 服务器。

Init 无法写入其配置。/etc/opt/simplex 尚不存在时,以 smp 用户运行 smp-server init 会产生权限错误,因为 /etc/opt 归 root 所有。先创建目录并设置正确的所有者,然后重新运行 init。

客户端无法连接到中继。 使用 dig +short smp1.example.com 检查名称是否解析到正确的地址。然后从您的笔记本电脑测试端口,而不是从服务器测试:nc -vz smp1.example.com 5223。如果从外部连接失败,但 ss 显示服务器上的套接字已打开,问题可能出在服务商的网络防火墙上;它与 ufw 是两个独立的控制项。

联系人无法通过您的中继连接。 您分享的地址中的指纹必须与 /etc/opt/simplex/fingerprint 的当前内容匹配。如果您在 [AUTH] 下设置了 create_password,地址中也必须包含该密码,否则客户端无法创建队列。

在应用中添加服务器后没有任何数据传输。 这是预期行为。只有新联系人会使用新添加的中继。现有联系人仍会使用已有的队列。

FAQ

自托管 SimpleX 服务器会让我的消息更安全吗?

不会,这是设计如此。SimpleX 会在设备之间对消息进行端到端加密,因此无论由谁运行中继,中继都不会持有密钥。自托管改变的是谁可以观察这些消息的元数据:有哪些队列、队列何时被读取,以及哪些 IP 地址连接到服务器。这是一个元数据层面的选择。如果您自托管的原因是需要更强的加密,那么加密本来就已经存在。

SimpleX 中继运营者实际可以看到什么?

项目的 protocol/security.md 对此作出了说明。中继无法读取消息内容或类型,无法在不被发现的情况下修改单条消息,也无法通过主动攻击破解端到端加密。中继可以看到队列接收方何时在线,统计通过队列的消息数量,获知接收方的 IP 地址,丢弃队列中的后续消息,或伪造该队列的状态。中继归您所有后,您就拥有这些权限。

我需要域名和 TLS 证书吗?

可用的配置需要域名;如果您确实没有域名,smp-server init 接受 --ip。消息端口不需要公共证书颁发机构签发的证书:init 会生成自己的证书颁发机构,客户端会固定您在 smp:// 地址中提供的指纹。只有在启用可选的 Web 信息页面时,才需要受公共信任的证书;该页面在 smp-server.ini[WEB] 部分中配置为 certkey

如果我丢失了 /etc/opt/simplex,会发生什么?

您发出的所有地址都会停止工作。该目录包含证书颁发机构,其指纹已嵌入服务器地址。因此,重新构建会生成不同的指纹,也就对应一台不同的服务器。队列位于该中继上的联系人无法从客户端修复。请将该目录加密备份到服务器之外,并按照文档说明将 ca.key 离线保存,因为持有它的人可以冒充您的中继。

我可以在同一台 VPS 上运行 SMP 中继和 XFTP 文件中继吗?

可以,但需要解决一个端口冲突。XFTP 服务器的文档端口是 443,而默认 SMP 配置列出 port: 5223,443,因此两者都要使用同一个套接字。将 443 分配给其中一个:为 SMP 服务器设置 port: 5223,或者将文件中继迁移到第二个 IP 地址或第二台 VPS。还应根据实际磁盘容量设置存储配额,因为文件中继才是消耗磁盘空间和带宽的组件。

#simplex#privacy#messaging#自托管#vps