为什么是 SimpleX

市面上号称"加密聊天"的软件不少,但大多数都有同一个问题——你有一个身份标识

  • Telegram:手机号
  • Signal:手机号
  • WhatsApp:手机号
  • Matrix:用户名(可选绑邮箱)

这些标识意味着:服务器知道你是谁,知道你和在聊天,知道你什么时间在聊天。端到端加密只保护了消息内容,但元数据(谁和谁在聊、什么时候聊、聊多久)全部暴露。

SimpleX 从架构层面解决了这个问题:没有用户标识符

你不是一个用户名或手机号,你只是一个 X3DH 密钥对。每次连接使用不同的临时地址,服务端看不到群组成员,看不到谁给谁发了消息——它只知道有"一个加密的数据包被转发了"。

这是目前唯一能在架构层面做到"元数据零暴露"的聊天协议。

架构速览

┌─────────────┐     ┌──────────────────┐     ┌─────────────┐
│ 发送方 App  │────→│  SMP 中继(VPS) │────→│ 接收方 App  │
│ (E2EE加密)  │     │ (只中转加密数据)  │     │ (E2EE解密)   │
└─────────────┘     └──────────────────┘     └─────────────┘
                            │
                    看不见任何内容
                    看不见群组成员
                    看不见谁发给谁

发送方用接收方的公钥加密消息 → 加密后的密文发到 SMP 中继 → 接收方取走解密。中继自始至终看到的都是密文。

部署过程

环境

项目
VPS香港 PetaExpress
CPU2核 Xeon E5-2699 v4
RAM1.5GB (实际占用 ~11MB)
系统Ubuntu 24.04 LTS
域名smp.cn-res.vip

步骤

1. 下载二进制

SimpleX 服务端叫 smp-server,用 Haskell 编写,编译成单二进制文件。v6.5.0 原生支持 Ubuntu 24.04 x86-64:

wget https://github.com/simplex-chat/simplexmq/releases/download/v6.5.0/smp-server-ubuntu-24_04-x86-64
chmod +x smp-server-ubuntu-24_04-x86-64
sudo cp smp-server-ubuntu-24_04-x86-64 /usr/local/bin/smp-server

二进制体积 46MB,含全部依赖。

2. 创建用户和目录

sudo useradd -m -s /bin/bash smp
sudo mkdir -p /var/opt/simplex /etc/opt/simplex
sudo chown smp:smp /var/opt/simplex /etc/opt/simplex
sudo chmod 750 /var/opt/simplex /etc/opt/simplex

3. 初始化服务端

sudo su smp -c 'smp-server init -y -l \
  --fqdn smp.cn-res.vip \
  --password 你的随机密码'

参数说明:

  • -y:非交互模式
  • -l:启用 store log(重启后恢复队列和消息)
  • --fqdn:服务器域名,用于生成 TLS 证书的 CN
  • --password:创建消息队列需要的密码(相当于中继的入场券)

初始化后会输出:

  • Fingerprint:服务器证书指纹,客户端用于验证连接的服务器身份
  • Server address:完整的 SMP 地址

4. 配置 systemd 服务

[Unit]
Description=SMP server systemd service (SimpleX Chat relay)
After=network.target

[Service]
User=smp
Group=smp
Type=simple
ExecStart=/usr/local/bin/smp-server start +RTS -N -RTS
LimitNOFILE=65535
KillSignal=SIGINT
TimeoutStopSec=infinity
AmbientCapabilities=CAP_NET_BIND_SERVICE
Restart=on-failure
RestartSec=5

[Install]
WantedBy=multi-user.target

5. 防火墙和启动

sudo ufw allow 5223/tcp comment 'SimpleX SMP relay'
sudo systemctl enable --now smp-server.service

6. 检查运行状态

sudo systemctl status smp-server.service

应该看到 Active: active (running)

服务器信息配置

修改 /etc/opt/simplex/smp-server.ini[INFORMATION] 段,填写服务器信息:

[INFORMATION]
source_code = https://github.com/simplex-chat/simplexmq
server_country = HK
operator = Grout
operator_country = CN
website = https://cn-res.vip
hosting = PetaExpress
hosting_country = HK

SimpleX 客户端 App 连接中继后会显示这些信息,方便用户了解谁在运营这个节点。

密钥安全

初始化时,smp-server 会生成一对 CA 密钥。CA 私钥可以用于重新签发服务器证书而保持指纹不变。

安全建议(官方文档强制要求):

  1. 将 CA 私钥从服务器下载到安全存储(离线电脑/加密U盘/密码管理器)
  2. 删除服务器上的 CA 私钥文件
  3. 定期轮换服务器证书(比如每 3 个月)

如果 CA 私钥丢失,服务器指纹会改变,所有已建立的连接都需要重新建立。所以一定要备份好。

性能实测

指标数值
内存占用(空闲)~11 MB
内存占用(峰值)~60 MB
二进制体积46 MB
CPU 开销几乎为 0(纯 IO 密集型)
单条消息大小1-3 KB
5Mbps 可支撑~200 条/秒,3000-5000 注册用户

结论:1.5GB VPS 跑 SMP 中继绰绰有余。 你的 VPS 上即使同时跑着 nginx、Zola 博客,再加一个 SMP 中继,内存占用连 300MB 都不到。

客户端使用方法

SimpleX 有全平台客户端:

平台获取方式
iOSApp Store 搜索 "SimpleX Chat"
AndroidGoogle Play / F-Droid
Desktop终端版 TUI(官网提供)

添加自定义中继的步骤:

  1. 打开 App → Settings(设置)
  2. Network & Servers → Add Server
  3. 粘贴 SMP 地址

地址格式:

smp://指纹:密码@域名

添加后,你创建的所有新联系人将默认使用你的中继。旧联系人不会自动迁移,需要在联系人信息页手动"Change receiving address"。

(我的中继地址在内测阶段,如需使用请联系我。)

密码保护机制详解

SMP 中继的密码不是"群密码",而是"入场券":

你的 SMP 中继(一个实例,一个密码)
       │
       ├─ 用户A 用密码创建自己的收件队列 → 给朋友B发队列地址
       │    B 直接发消息(不需要知道密码)
       ├─ 用户C 用密码创建自己的收件队列 → 给朋友D发队列地址
       │    D 直接发消息(不需要知道密码)
       └─ 用户E 用密码创建自己的收件队列 → 给朋友F发队列地址
             F 直接发消息(不需要知道密码)

关键特性:

  • 只有"注册"需要密码,收发消息不需要
  • 各用户的消息队列天然加密隔离
  • 一个中继可以同时服务多组用户
  • 密码可以定期更换,不续费的用户拿不到新密码

GFW 防封策略

香港 VPS 跑 SMP 中继,面临的核心风险是被 GFW 封锁 IP。SimpleX 的架构天然适合多层冗余:

策略一:多中继冗余(推荐,必须)

SimpleX 客户端支持配置多个中继,发送方会自动在多个中继上创建收件队列。当你的中继被封时,其他中继的队列继续工作,用户无感。

配置方式:在 App 中添加你的中继+官方中继,App 自动做 failover。

用户A中继列表:
  你的HK中继  →  快,但可能被封
  官方中继1   →  慢,但不会被墙(smp11.simplex.im)
  官方中继2   →  官方备用
  朋友的中继  →  社区节点

核心原则:你的中继是附加价值(加速+隐私),不是唯一通道。

策略二:nginx 反代 + 443 端口(伪装 HTTPS)

SMP 原生协议走 TLS 加密,再用 nginx stream 模块反代到 443 端口,流量看起来就是 HTTPS:

stream {
    upstream smp_backend {
        server 127.0.0.1:5223;
    }
    server {
        listen 443;
        proxy_pass smp_backend;
    }
}

注意: 这只伪装端口,不隐藏 IP。且需要为 SMP 分配独立的域名和证书。

其他选项

方案成本防封效果说明
Cloudflare Spectrum$1/月⭐⭐⭐⭐隐藏真实 IP,TCP 代理
国内转发机¥30-50/月⭐⭐⭐⭐⭐最彻底,但需要额外机器
frp 内网穿透免费+国内机器⭐⭐⭐⭐低成本替代方案

推荐组合: 多中继冗余(必须) + Cloudflare Spectrum(可选)。不推荐一开始就上转发机。

商业化思路

SMP 中继的密码机制天然适合做付费服务:

  • 月付 $2-3:提供专属中继,低延迟
  • 年付 $10-30:相当于送两个月
  • 一次付费 $50-99:长期使用

卖点不是"加密聊天"(这大家都有),而是:

  1. 地理优势:香港节点,亚洲用户延迟低
  2. 隐私加分:不在 SimpleX 默认中继列表,少一层信任依赖
  3. 可靠性:自己控制,不担心官方中继被 DDoS
  4. 去中心化支持:付费本质是支持去中心化网络

可行性测算:VPS 边际成本几乎为零(本来就在跑博客),单中继理论支撑 3000-5000 注册用户。1% 付费转化率 → 30-50 用户 → $60-150/月。

与竞品对比

特性SimpleXMatrix (Conduit)XMPP+OMEMOSignal
无身份标识❌ 有用户名❌ JID❌ 手机号
强制 E2EE⚠️ 可选⚠️ 需插件
阅后即焚✅ 原生❌ 仅服务端删除
自托管✅ 单二进制✅ Rust 单二进制✅ Lua 极轻❌ 无
Web 客户端✅ Element✅ 多种
内存占用~11MB~50MB~30MBN/A
部署难度⭐ 极简⭐⭐ 简单⭐⭐⭐ 中等N/A

总结

SimpleX 是我在 VPS 上部署过的最省心的聊天服务端。单二进制、11MB 内存、15 分钟上线。值得关注的是它的协议设计比市面上任何聊天工具都更注重隐私——不是通过"承诺保密"来实现,而是通过"技术上就无法获取信息"来实现。

如果你的需求是"安全聊天",Signal 或 Matrix 已经够用。如果你的需求是"连元数据都不想让任何人知道",目前只有 SimpleX 能做到。


本文演示的 SMP 中继已部署在 smp.cn-res.vip:5223,在实测阶段,欢迎有兴趣的朋友联系。