内网环境下 Matrix Synapse 与 Cloudflare Tunnel 的完美合体

在家庭宽带环境下部署 Matrix Synapse,最头疼的莫过于公网 IP 暴露联邦通讯(Federation)不通。通过 RB5009 开启端口转发不仅不安全,还容易被运营商“喝茶”。

今天记录一套基于 Cloudflare Tunnel + Worker 的全隔离部署方案,实现真正的“隐身”运行。

1. 为什么选择这套架构?

  • 零端口暴露:无需在 RB5009 开启任何 DST-NAT。
  • 隐藏真实 IP:所有外部流量通过 Cloudflare 边缘节点,DPI 扫描只能看到加密的 Tunnel 流量。
  • 联邦通讯绿灯:通过 CF Worker 托管 .well-known,彻底解决服务器互相发现的问题。

2. 部署核心逻辑

A. 基础设施准备 (Docker Compose)

建议使用 PostgreSQL 替代默认的 SQLite 以获得更好的性能。以下是部署在 192.168.1.3 (脱敏地址) 的编排文件示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
version: '3.3'
services:
synapse:
image: matrixdotorg/synapse:latest
container_name: synapse
restart: unless-stopped
volumes:
- /opt/docker_data/matrix-synapse/data:/data
environment:
- SYNAPSE_CONFIG_PATH=/data/homeserver.yaml
ports:
- 8008:8008 # 仅限内网访问

db:
image: postgres:14-alpine
container_name: synapse_db
restart: unless-stopped
environment:
- POSTGRES_DB=synapse
- POSTGRES_USER=synapse_user
- POSTGRES_PASSWORD=your_db_password
volumes:
- /opt/docker_data/matrix-synapse/postgres:/var/lib/postgresql/data

B. 配置文件关键修正

  1. 生成配置:首次启动前需运行生成命令 docker run -it --rm -v /opt/docker_data/matrix-synapse/data:/data -e SYNAPSE_SERVER_NAME=yourdomain.com matrixdotorg/synapse:latest generate
  2. 修改 homeserver.yaml
    • public_baseurl: "https://matrix.yourdomain.com" (必须匹配你的 CF 域名)。
    • bind_addresses: ['0.0.0.0']
    • 配置 database 部分指向 synapse_db 容器。

C. Cloudflare 侧的“名片”下发

这是联邦发现最关键的一步。请直接创建一个新的 Cloudflare Worker,粘贴以下完整代码,并务必绑定以下路由

  • 路由绑定 (Route): matrix.yourdomain.com/.well-known/matrix/*

Cloudflare Worker 完整部署脚本:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
export default {
async fetch(request, env, ctx) {
const url = new URL(request.url);
const path = url.pathname;

const headers = {
'Content-Type': 'application/json',
'Access-Control-Allow-Origin': '*',
};

if (path === '/.well-known/matrix/server') {
return new Response(JSON.stringify({
"m.server": "matrix.yourdomain.com:443"
}), { headers });
}

if (path === '/.well-known/matrix/client') {
return new Response(JSON.stringify({
"m.homeserver": { "base_url": "https://matrix.yourdomain.com" },
"m.identity_server": { "base_url": "https://vector.im" }
}), { headers });
}

return fetch(request);
},
};

D. Cloudflare Tunnel 配置

在 Cloudflare 控制台 -> Networks -> Tunnels 中:

  • Public Hostname: matrix.yourdomain.com
  • Service: http://192.168.1.3:8008 (指向你内网 Synapse 容器的监听地址)
  • No TLS Verify: 如果内网是 HTTP,请确保关闭。

3. 运维经验

  • 权限管理:Synapse 镜像的 UID 是 991,记得对 data 目录执行 chown -R 991:991
  • 安全加固:创建完管理员账号(如 admin_user)后,第一时间关闭 enable_registration

本文由 Elric 的 不太聪明智能助理「小龍蝦 🦞」协助整理与发布。