本文记录一套实际落地的个人双机同步方案:家里一台 24×7 在线的 Windows 11 VM,与一台经常在办公室、酒店、咖啡厅等网络环境移动使用的 MateBook Win11笔记本电脑,通过 Syncthing 实现项目目录双向同步,并使用 NSSM 实现开机自动运行,同时通过 DDNS 建立优先公网直连,公共 Relay 只作为兜底。
目录
1. 方案设计
需要同步的目录为:
D:\Email\Sync
D:\InfraOps\Sync
D:\SplitDNS\Sync
两台电脑在配置 Syncthing 前,已经手工复制过一次目录,所以初始数据和目录结构基本一致。最终结构如下:
家里 Win11-Home(24×7)
│
│ Syncthing 双向同步
│
├──────────── Internet ────────────┐
│ │
│ MateBook(移动)
│
├─ Email
├─ InfraOps
└─ SplitDNS
连接策略不是“只依赖 DDNS”,而是:
优先:DDNS + TCP/QUIC 直连
↓
其次:Global Discovery / NAT Traversal
↓
兜底:Public Relay
2. 把 Portable 版真正做成“便携配置”
两台电脑的 Syncthing 程序都放在:
D:\Program Files\Portable\Syncthing\syncthing.exe
需要注意:Portable/Base 版本并不意味着配置文件默认也会放在 EXE 同目录。Windows 默认配置通常位于用户目录下,因此这里主动指定独立 Home:
D:\Program Files\Portable\Syncthing\config
2.1 如果 Syncthing 从未启动过
第一次直接用 PowerShell 启动:
& "D:\Program Files\Portable\Syncthing\syncthing.exe" `
--home="D:\Program Files\Portable\Syncthing\config"
随后会自动生成类似:
D:\Program Files\Portable\Syncthing\config\
├─ config.xml
├─ cert.pem
├─ key.pem
├─ https-cert.pem
├─ https-key.pem
├─ index-v2\
└─ syncthing.log
2.2 如果已经启动过一次
先在 Web GUI 中选择:
操作 → 关闭
然后找到原来的配置目录,例如:
%LOCALAPPDATA%\Syncthing
把其中内容整体迁移到:
D:\Program Files\Portable\Syncthing\config
之后再使用带 --home 的命令启动。
cert.pem 和 key.pem 对应设备身份和 Device ID。两台设备应该各自生成自己的证书和私钥。2.3 验证配置目录
在 Syncthing 中打开“关于 / 路径”,应看到配置、证书、数据库和日志均指向:
D:\Program Files\Portable\Syncthing\config
Windows 的“用户主目录”仍显示 C:\Users\用户名 是正常的,它不是 Syncthing 配置目录。
3. 两台设备配对
先给设备起容易识别的名称,例如:
Win11-Home
MateBook
然后在两台设备上互相添加对方的 Device ID。
- 在 Win11-Home 中打开“显示 ID”,复制 Device ID。
- 在 MateBook 中“添加远程设备”,填入 Win11-Home 的 Device ID。
- 远程地址先保持
dynamic。 - Win11-Home 收到连接请求后点击接受。
- 必要时在 Win11-Home 上同样确认 MateBook 已经作为远程设备加入。
连接成功、但还没有共享任何文件夹时,界面可能显示:
已连接(未使用)
这里的“未使用”不是故障,只表示当前还没有共享文件夹给这台远程设备。
4. 配置三个项目同步目录
本文将三个项目分别建立为 Syncthing Folder,并统一放入 Folder Group:
D:\
├─ Email
├─ InfraOps
└─ SplitDNS
| 文件夹标签 | 本地路径 | 类型 |
|---|---|---|
| D:\Email\Sync | 发送和接收 | |
| InfraOps | D:\InfraOps\Sync | 发送和接收 |
| SplitDNS | D:\SplitDNS\Sync | 发送和接收 |
配置时注意:
- 文件夹标签只是 GUI 中显示的名称。
- 文件夹组也是 UI 整理用途。
- 文件夹路径是本机真实路径。
- 文件夹 ID才是 Syncthing 判断“是否为同一个共享文件夹”的标识,接受共享后不要随意修改。
由于两台电脑原本已经手工复制过一次相同数据,Syncthing 会先扫描并比较文件。若内容一致,最终会直接显示:
最新
4.1 建议做一次双向测试
可以用一个临时测试文件验证:
- Win11-Home 新建文件,确认 MateBook 收到。
- MateBook 修改该文件,确认 Win11-Home 收到修改。
- MateBook 新建另一个文件,确认 Win11-Home 收到。
- 最后删除测试文件,确认删除也双向传播。
5. 开启阶段文件版本控制
三个文件夹在两台机器上都开启:
文件版本控制:阶段文件版本控制
最大保留时间:180 天
版本目录:.stversions
“阶段文件版本控制”对应 Syncthing 的 Staggered File Versioning。它不是简单地把 180 天内每一个版本全部保留,而是越新的版本保留得越密,越旧的版本保留得越稀疏。
典型保留节奏包括:
- 最近 1 小时:保留更密集的版本;
- 最近 1 天:按小时级别逐渐稀疏;
- 最近 30 天:按天保留;
- 直到最大保留时间:按周级别保留。
例如:
Win11-Home 新建文件
↓
同步到 MateBook
↓
在 MateBook 本地删除
↓
删除动作同步回 Win11-Home
↓
Win11-Home 的 .stversions 中保存旧版本
结果:
Win11-Home → 有历史版本
MateBook → 没有该删除操作的历史版本(因为删除发生在本机)
因此双向同步场景下,两个设备都开启版本控制是有意义的:它们会分别为“来自另一端”的破坏性变化提供保护。
6. 使用 NSSM 注册为 Windows 服务
为了让两台电脑随 Windows 自动启动 Syncthing,本文使用 NSSM。
将 NSSM 放在一个长期不移动的位置,例如:
D:\Program Files\Portable\NSSM\nssm.exe
nssm.exe。因此安装完成后不要删除或随意移动 NSSM。6.1 安装服务
先关闭当前手工运行的 Syncthing:
操作 → 关闭
然后使用管理员 CMD:
"D:\Program Files\Portable\NSSM\nssm.exe" install Syncthing
在 NSSM 的 Application 页面填写:
Path:
D:\Program Files\Portable\Syncthing\syncthing.exe
Startup directory:
D:\Program Files\Portable\Syncthing
Arguments:
--no-restart --no-browser --home="D:\Program Files\Portable\Syncthing\config"
本文是两台私人 Windows 电脑,数据也都在本机磁盘上,因此为了保持简单,Log On 使用:
Local System account
启动类型建议:
Automatic (Delayed Start)
安装完成后:
net start Syncthing
然后打开:
http://127.0.0.1:8384
确认原来的三个 Folder 仍然存在并显示“最新”,说明 NSSM 加载的是原先那套 config,没有生成新身份。
如果忘记关闭手工实例,后启动的实例通常会因为数据库锁而失败,不要因此删除 config 或重新配对。正确做法是停止服务、关闭手工实例,确认任务管理器里没有
syncthing.exe 后,再只启动服务。6.2 Web GUI 不要暴露到公网
同步端口可以公网映射,但 Web GUI 的 8384 不需要也不应该映射到公网。保持:
127.0.0.1:8384
如果需要进一步保护 GUI,可以在 Syncthing 设置中配置 GUI 用户名和密码。
7. 使用 DDNS + 22000 建立公网直连
家里 Win11-Home 24×7 在线,并且已经有 DDNS,因此把它作为稳定入口。
7.1 家庭路由器端口映射
建议映射:
TCP 22000 → Win11-Home:22000
UDP 22000 → Win11-Home:22000
其中:
- TCP 22000:Syncthing TCP 直连;
- UDP 22000:用于 QUIC。
在外部网络可以先测试 TCP:
telnet 你的DDNS域名 22000
或者 PowerShell:
Test-NetConnection 你的DDNS域名 -Port 22000
看到:
TcpTestSucceeded : True
说明 TCP 端口从公网已经可达。注意,Telnet 和 Test-NetConnection -Port 只能验证 TCP,不能证明 UDP/QUIC 已经可用。
7.2 MateBook 指定家里设备地址
在 MateBook 中编辑远程设备 Win11-Home,把地址配置为:
tcp://sync.example.com:22000
quic://sync.example.com:22000
dynamic
把 sync.example.com 替换成自己的 DDNS 域名。
如果 GUI 使用单行输入,可按界面要求用逗号分隔多个地址。
Win11-Home 对 MateBook 的远程地址不需要填写固定公网地址,保持:
dynamic
即可,因为 MateBook 是移动设备,不具备稳定的公网入口。
8. 验证当前是否真的在走公网直连
在 MateBook 的 Syncthing 首页展开:
远程设备 → Win11-Home
重点看:
地址
连接类型
如果看到类似:
地址:公网IP:22000
连接类型:TCP 广域网
就说明当前正在通过公网 TCP 直连,而不是 Relay。

如果显示的是 Relay 类型,则说明当前直连条件不满足,正在使用公共中继。
另外可以验证 DDNS 解析:
Resolve-DnsName 你的DDNS域名
确认解析结果等于当前家庭公网 IP。
9. 为什么不建议关闭公共中继
即使已经配置了 DDNS,也建议继续开启:
Global Discovery 开启
NAT Traversal 开启
Relaying 开启
Local Discovery 开启
原因是 MateBook 会出现在各种网络:
- 公司网络;
- 出租屋;
- 咖啡厅 Wi-Fi;
- 手机热点;
- 带有严格 NAT 或防火墙策略的网络。
正常情况下有公网直连时,Syncthing 会使用更合适的直接连接;Relay 的存在并不意味着所有文件流量都会经过 Relay。
正常网络:
MateBook ───── DDNS / Direct TCP / QUIC ───── Win11-Home
受限网络:
MateBook ───────── Public Relay ───────────── Win11-Home
(兜底)
Syncthing 设备间数据使用 TLS 加密。Relay 负责转发流量,但不能读取同步文件的明文内容。它仍可能看到一些连接元数据,例如设备 ID、IP 和流量规模。
10. 22000 要不要换端口?
本文最终保留 Syncthing 默认的 22000。
22000 并不是传统 TCP/IP 定义中的“知名端口”(well-known ports 通常指 0–1023),但它确实是 Syncthing 的默认同步端口,因此公网扫描器更容易猜到这里可能运行着 Syncthing。
不过,Syncthing 的安全并不依赖“端口没人知道”。设备间通过 TLS 通信,并使用设备证书/Device ID 校验允许连接的设备。
| 换成随机高位端口 | 实际效果 |
|---|---|
| 减少普通扫描噪音 | 有一定作用 |
| 降低被直接识别为默认 Syncthing 端口的概率 | 有一定作用 |
| 阻止陌生设备加入同步 | 不是靠端口实现 |
| 防止文件被读取 | 不是靠端口实现 |
| 提升加密强度 | 基本没有 |
因此,对于个人双机同步,保持 22000 完全可以。更重要的是:
- 不要把 GUI
8384映射到公网; - 保护好
config\key.pem; - 不要随意接受未知 Device ID;
- 保持 Syncthing 更新。
11. Windows 重装后的恢复
如果系统重装不会动 D 盘,这套目录设计恢复非常简单。
保留:
D:\Program Files\Portable\Syncthing\
├─ syncthing.exe
└─ config\
├─ config.xml
├─ cert.pem
├─ key.pem
├─ index-v2\
└─ ...
D:\Program Files\Portable\NSSM\
└─ nssm.exe
D:\...
Windows 重装后,只需要重新使用管理员 CMD:
"D:\Program Files\Portable\NSSM\nssm.exe" install Syncthing
重新填入:
Path:
D:\Program Files\Portable\Syncthing\syncthing.exe
Startup directory:
D:\Program Files\Portable\Syncthing
Arguments:
--no-restart --no-browser --home="D:\Program Files\Portable\Syncthing\config"
然后启动服务即可。
因为原来的 config.xml、cert.pem 和 key.pem 仍然存在,所以设备身份、Device ID、远程设备、Folder ID、版本控制和连接设置都可以继续沿用。
12. 实际踩坑与排查
12.1 “已连接(未使用)”不是故障
表示设备已经连接,但还没有任何 Folder 分享给对方。
12.2 两台在不同城市的内网,不能拿内网 IP 互测 22000
例如 192.168.x.x 或 10.x.x.x 只在各自局域网内有效。跨城市时应依赖 Global Discovery、Relay、DDNS 或公网映射。
12.3 配对后始终“已断开”
先检查另一台是不是还有一个“新设备希望连接”的提示没有接受。实际配置过程中,这比端口问题更容易被忽略。
12.4 开着 Relay 不代表一定走 Relay
应直接看远程设备中的“连接类型”。显示 TCP 广域网 或 QUIC 直连类型,就不是 Relay。
12.5 历史版本为什么只在一边出现?
因为版本控制主要针对“远端同步过来的删除/覆盖”。哪台设备本地执行了删除,那台通常不会因此给自己生成一个 Syncthing 历史版本;另一端接收到删除时,才会把旧文件放进 .stversions。
12.6 NSSM 安装时忘了关闭手工运行的 Syncthing
如果只是执行了 nssm install Syncthing、服务还没启动,那么什么问题都没有。即使真的同时启动了两个实例,后启动的实例通常会遇到数据库锁。不要删除配置,停掉服务和手工实例,确认只剩一个 syncthing.exe 后重新启动服务即可。
13. 最终配置清单
- ✅ Syncthing v2.1.3 Portable
- ✅ 配置统一放到
D:\Program Files\Portable\Syncthing\config - ✅ Win11-Home 与 MateBook 双向配对
- ✅ Email / InfraOps / SplitDNS 三个 Folder
- ✅ Folder Type:发送和接收
- ✅ 阶段文件版本控制:180 天
- ✅ NSSM 注册 Windows 服务
- ✅ 家庭路由器 TCP/UDP 22000 映射
- ✅ MateBook 使用 DDNS 固定地址 +
dynamic - ✅ 实测连接类型:TCP 广域网
- ✅ Global Discovery / NAT Traversal / Relay 均保留开启
- ✅ GUI 8384 不对公网开放
- ✅ 系统重装时保留 D 盘配置即可快速恢复
参考资料
- Syncthing 官方文档:Starting Syncthing Automatically
- Syncthing 官方文档:File Versioning
- Syncthing 官方文档:Security Principles
- Syncthing 官方文档:Relay Protocol
- NSSM 官方文档:Usage
说明:本文使用 sync.example.com 作为 DDNS 示例域名。实际部署时请替换为自己的域名,不要在公开博客中暴露 Device ID、私钥或其他不必要的设备信息。
文章评论