在 HK VPS 上自建 SimpleX SMP 中继:真正匿名的端到端加密聊天
为什么是 SimpleX
市面上号称"加密聊天"的软件不少,但大多数都有同一个问题——你有一个身份标识。
- Telegram:手机号
- Signal:手机号
- WhatsApp:手机号
- Matrix:用户名(可选绑邮箱)
这些标识意味着:服务器知道你是谁,知道你和谁在聊天,知道你什么时间在聊天。端到端加密只保护了消息内容,但元数据(谁和谁在聊、什么时候聊、聊多久)全部暴露。
SimpleX 从架构层面解决了这个问题:没有用户标识符。
你不是一个用户名或手机号,你只是一个 X3DH 密钥对。每次连接使用不同的临时地址,服务端看不到群组成员,看不到谁给谁发了消息——它只知道有"一个加密的数据包被转发了"。
这是目前唯一能在架构层面做到"元数据零暴露"的聊天协议。
架构速览
┌─────────────┐ ┌──────────────────┐ ┌─────────────┐
│ 发送方 App │────→│ SMP 中继(VPS) │────→│ 接收方 App │
│ (E2EE加密) │ │ (只中转加密数据) │ │ (E2EE解密) │
└─────────────┘ └──────────────────┘ └─────────────┘
│
看不见任何内容
看不见群组成员
看不见谁发给谁
发送方用接收方的公钥加密消息 → 加密后的密文发到 SMP 中继 → 接收方取走解密。中继自始至终看到的都是密文。
部署过程
环境
| 项目 | 值 |
|---|---|
| VPS | 香港 PetaExpress |
| CPU | 2核 Xeon E5-2699 v4 |
| RAM | 1.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 私钥可以用于重新签发服务器证书而保持指纹不变。
安全建议(官方文档强制要求):
- 将 CA 私钥从服务器下载到安全存储(离线电脑/加密U盘/密码管理器)
- 删除服务器上的 CA 私钥文件
- 定期轮换服务器证书(比如每 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 有全平台客户端:
| 平台 | 获取方式 |
|---|---|
| iOS | App Store 搜索 "SimpleX Chat" |
| Android | Google Play / F-Droid |
| Desktop | 终端版 TUI(官网提供) |
添加自定义中继的步骤:
- 打开 App → Settings(设置)
- Network & Servers → Add Server
- 粘贴 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:长期使用
卖点不是"加密聊天"(这大家都有),而是:
- 地理优势:香港节点,亚洲用户延迟低
- 隐私加分:不在 SimpleX 默认中继列表,少一层信任依赖
- 可靠性:自己控制,不担心官方中继被 DDoS
- 去中心化支持:付费本质是支持去中心化网络
可行性测算:VPS 边际成本几乎为零(本来就在跑博客),单中继理论支撑 3000-5000 注册用户。1% 付费转化率 → 30-50 用户 → $60-150/月。
与竞品对比
| 特性 | SimpleX | Matrix (Conduit) | XMPP+OMEMO | Signal |
|---|---|---|---|---|
| 无身份标识 | ✅ | ❌ 有用户名 | ❌ JID | ❌ 手机号 |
| 强制 E2EE | ✅ | ⚠️ 可选 | ⚠️ 需插件 | ✅ |
| 阅后即焚 | ✅ 原生 | ❌ 仅服务端删除 | ❌ | ✅ |
| 自托管 | ✅ 单二进制 | ✅ Rust 单二进制 | ✅ Lua 极轻 | ❌ 无 |
| Web 客户端 | ❌ | ✅ Element | ✅ 多种 | ❌ |
| 内存占用 | ~11MB | ~50MB | ~30MB | N/A |
| 部署难度 | ⭐ 极简 | ⭐⭐ 简单 | ⭐⭐⭐ 中等 | N/A |
总结
SimpleX 是我在 VPS 上部署过的最省心的聊天服务端。单二进制、11MB 内存、15 分钟上线。值得关注的是它的协议设计比市面上任何聊天工具都更注重隐私——不是通过"承诺保密"来实现,而是通过"技术上就无法获取信息"来实现。
如果你的需求是"安全聊天",Signal 或 Matrix 已经够用。如果你的需求是"连元数据都不想让任何人知道",目前只有 SimpleX 能做到。
本文演示的 SMP 中继已部署在 smp.cn-res.vip:5223,在实测阶段,欢迎有兴趣的朋友联系。