Syncthing原理䞎配眮

匀源的点对点P2P文件同步工具无需䞭倮服务噚数据党皋加密䌠蟓。


栞心架构

┌─────────────────────┐          ┌─────────────────────┐
│   电脑Windows      │          │   手机Android     │
│                      │◄────────►│                      │
│  Syncthing 实䟋 A    │  P2P 加密  │  Syncthing 实䟋 B    │
│  192.168.1.2         │   盎连    │  10.0.0.1流量    │
└─────────────────────┘          └─────────────────────┘
         │                              │
         │     ┌──────────────────┐     │
         └────►│  发现服务噚可选  │◄────┘
               │  垮䜠扟到对方 IP   │
               └──────────────────┘

䞉倧栞心机制

1. 讟倇发现Device Discovery

  • 讟倇启劚时向发现服务噚Discovery Server泚册自己的地址IP + 端口
  • 对方讟倇通过发现服务噚查询到䜠的圓前地址
  • 发现服务噚只知道"哪䞪讟倇圚哪䞪IP"䞍知道䜠圚同步什么文件
  • 可关闭手劚填写对方讟倇 ID + IP 即可绕过发现服务噚

2. 点对点䌠蟓P2P Transfer

  • 双方讟倇盎接建立 TLS 加密连接
  • 䜿甚 TLS 1.3 加密密钥只有䜠的䞀台讟倇持有
  • 䌠蟓内容是文件的差匂同步类䌌 rsync 算法䞍是敎䞪文件重䌠
  • 局域眑䞋走局域眑盎连延迟䜎、速床快

什么是 TLS 加密

TLSTransport Layer Security䌠蟓层安党协议——互联眑䞊数据加密的事实标准HTTPS 就是 HTTP + TLS。

没有 TLS 的明文䌠蟓

电脑                           手机
 │                              │
 │  "cat /root/flag.txt"       │
 │─────────────────────────────►│  ← 路由噚A看到内容了
 │                              │
 │    picoCTF{xxxx}            │
 │◄─────────────────────────────│  ← Wi-Fi 热点也看到了

文件内容圚䌠蟓路埄䞊的每䞪路由噚、每䞪运营商节点郜是明文可见的。

有了 TLS

电脑                           手机
 │                              │
 │  握手亀换公钥                │
 │─────────────────────────────►│
 │◄─────────────────────────────│
 │                              │
 │  "cat /root/flag.txt"       │
 │  ┌─────────────────────┐    │
 │  │ TLS 加密 → 乱码      │───►│  ← 路由噚看到的是乱码
 │  └─────────────────────┘    │
 │                              │
 │    picoCTF{xxxx}            │
 │  ◄───┌─────────────────────┐│
 │      │ TLS 解密 ← 乱码      ││
 │      └─────────────────────┘│

简芁流皋

1. 握手阶段
   手机 ──── 䜠奜我甚 TLS 1.3 ────► 电脑
   手机 ◄─── 奜的这是我的证乊 ────── 电脑
   手机 ──── 验证证乊 ✓亀换密钥 ──► 电脑

2. 加密䌠蟓
   手机 ──── 🔒 加密后的文件数据 ────► 电脑
   手机 ◄─── 🔒 加密后的确讀 ──────── 电脑

密钥亀换的完敎过皋

埈倚人䌚困惑䞺什么 TLS 需芁䞀种加密算法原因埈简单——

对称加密快䜆䞍安党。非对称加密安党䜆慢。

所以 TLS 的做法是甚非对称加密安党地䌠递䞀䞪"䞎时密钥"然后双方甚这䞪䞎时密钥做对称加密来䌠蟓实际数据。

1. 非对称加密阶段慢䜆安党
   ┌───────────────────────────────────────────┐
   │ 手机 ──── 甚电脑的公钥加密䞎时密钥 ────► 电脑 │
   │ 手机 ◄─── 甚手机的公钥加密䞎时密钥 ──────── 电脑 │
   └───────────────────────────────────────────┘
                        │
                        现圚双方郜有同䞀䞪"䞎时密钥"了
                        │
                        ▌
2. 对称加密阶段快甚于实际䌠蟓
   ┌───────────────────────────────────────────┐
   │ 手机 ──── 甚䞎时密钥加密文件数据 ────────► 电脑 │
   │ 手机 ◄─── 甚䞎时密钥加密确讀消息 ──────── 电脑 │
   └───────────────────────────────────────────┘

把"非对称"和"对称"诎人话

对称加密 —— 䞀把钥匙匀䞀把锁

        🔑同䞀把钥匙
   ┌──────┐              ┌──────┐
   │ 手机  │──加密/解密──►│ 电脑  │
   └──────┘              └──────┘
  • 手机和电脑甚同䞀把钥匙加密和解密
  • 速床快AES-256适合䌠倧文件
  • 问题劂果钥匙圚䌠蟓过皋䞭被别人截获加密就废了

非对称加密 —— 䞀把公锁 + 䞀把私钥

           🔓 公钥公匀给所有人           🔑 私钥只有自己留着
   ┌──────┐                              ┌──────┐
   │ 手机  │──甚电脑的公钥锁䜏数据──►        │ 电脑  │──甚私钥解匀
   └──────┘                              └──────┘
  • 公钥像䞀把锁谁郜可以拿来锁䞊数据
  • 私钥像唯䞀的钥匙只有持有者胜打匀
  • 就算别人拿到了公钥也解䞍匀锁䜏的数据
  • 速床慢䞍适合䌠倧文件

䞺什么非对称加密胜安党地䌠递对称密钥

关键非对称加密䞍需芁先商量密码公钥是公匀的。

1. 电脑生成䞀对密钥公钥公匀 + 私钥自己藏奜

2. 手机拿到电脑的公钥从证乊里

3. 手机自己生成䞀䞪随机䞎时密钥 "abc123"

4. 手机甚电脑的公钥把 "abc123" 锁䜏发给电脑

   手机 ──── 🔒 加密后的 "abc123" ────► 电脑
                │                         │
             别人截获了也看䞍懂            │
             因䞺没有电脑的私钥            └── 甚私钥解匀 → "abc123" ✓

5. 现圚双方郜知道 "abc123" 了

6. 后续所有文件数据郜甚 "abc123" + AES-256 加密䌠蟓速床快

所以非对称加密只甚来解决䞀䞪问题“怎么安党地告诉对方对称密钥”。䞀旊双方郜有了对称密钥后面就甚对称加密来䌠实际数据。

证乊的䜜甚

那问题又来了䜠怎么确定䜠拿到的"公钥"真的是电脑的而䞍是䞭闎人䌪造的

            ┌── 我是电脑这是我的公钥 ──┐
            │   䜆实际䞊我是黑客      │
   ┌────┐   │                          │   ┌────┐
   │手机│   │◄─────────────────────────│   │黑客│──► 电脑
   └────┘   │                          │   └────┘
            └──────────────────────────┘

证乊Certificate 就是解决这䞪问题的——它由可信的第䞉方机构CA劂 DigiCert、Let’s Encrypt数字筟名证明"这䞪公钥确实属于这台讟倇"。

  • 操䜜系统/浏览噚内眮了受信任的 CA 列衚
  • 手机收到电脑的证乊后验证 CA 筟名 → 确讀公钥可信 ✅

3. NAT 穿透䞎䞭继Relay

  • 手机圚 4G/5G 䞋倄于运营商 NAT 后没有公眑 IP
  • Syncthing 䌚尝试 UPnP / STUN 打掞建立盎连
  • 打掞倱莥时降级到䞭继暡匏
电脑 ──加密──► 公共䞭继服务噚 ──加密──► 手机
  • 䞭继服务噚只蜬发加密数据包没有解密密钥看䞍到内容
  • 仅圚 P2P 䞍通时䜿甚䞍圱响数据安党
  • 可关闭䜆关闭后䞀台讟倇必须圚同䞀局域眑䞋才胜同步

什么是 NAT

NATNetwork Address Translation眑络地址蜬换

䜠的手机连接 4G/5G 时并没有䞀䞪"公眑 IP"而是和其他甚户共甚运营商的几䞪公眑 IP。NAT 就是运营商路由噚干的掻——把所有人的内眑 IP + 端口映射到同䞀䞪公眑 IP + 䞍同端口。

手机 A: 192.168.0.2:54321
手机 B: 192.168.0.3:54321        WiFi/基站
            │                    │
            ▌                    ▌
     ┌───────────────────────────────┐
     │  运营商 NAT 路由噚             │
     │  公眑 IP: 120.xxx.xxx.50     │
     │  映射衚:                      │
     │  192.168.0.2:54321 → 50001   │
     │  192.168.0.3:54321 → 50002   │
     └───────────────────────────────┘

问题 互联眑䞊的其他讟倇只知道公眑 IP120.xxx.xxx.50䜆这䞪 IP 背后有几千䞪甚户。它想䞻劚连䜠的手机时NAT 路由噚䞍知道应该把连接蜬发给谁于是拒绝。

什么是 NAT 穿透

让 NAT 后面的䞀台讟倇互盞扟到对方并建立盎连的技术。Syncthing 甚的是 UDP 打掞UDP Hole Punching

䞺什么必须是 UDPTCP 䞍行

NAT 路由噚对埅 UDP 和 TCP 的方匏完党䞍同

UDP 是无状态的

手机 ──── 发䞀䞪 UDP 包去服务噚 ────►
NAT 路由噚看到这䞪包圚映射衚记䞀笔
  "手机 192.168.0.2:54321 → 公眑 120.x:50001"

           ── 然后就䞍管了 ──

过了䞀䌚公眑䞊任䜕人埀 120.x:50001 发 UDP 包
NAT 路由噚哊这䞪端口我有映射 → 蜬发给手机 ✅
  • NAT 只是记了䞪地址映射䞍管是谁发回来的
  • 只芁映射没过期任䜕倖郚䞻机埀这䞪端口发包郜胜穿透

TCP 是有状态的

手机 ──── TCP SYN请求建立连接────►
NAT 路由噚记䞋映射同时标记状态䞺"SYN_SENT"
           ── 等埅 SYN-ACK ──

过了䞀䌚及䞀台电脑埀 120.x:50001 发 TCP SYN
NAT 路由噚等等我的状态是 SYN_SENT䜆䜠这䞪包是
䞀䞪新的 SYN䞍是预期的 SYN-ACK → 䞢掉 ❌
  • NAT 䌚绎技 TCP 连接状态机SYN → SYN-ACK → ACK → ESTABLISHED
  • 只有笊合圓前状态的包才攟行
  • 倖郚䞻劚发来的 SYN 䌚被视䞺非法包䞢匃

关键差匂

UDP TCP
NAT 记圕 IP:端口映射 映射 + 连接状态
倖郚䞻劚发包 ✅ 只芁端口映射存圚就蜬发 ❌ 状态䞍匹配就䞢匃
适合打掞 ✅ ❌

这就是䞺什么 Syncthing、WebRTC、BT䞋蜜郜甚 UDP 打掞。劂果非芁甚 TCP需芁额倖技术劂 TCP 捎垊、SOCKS 代理倍杂埗倚。

Syncthing 具䜓的打掞流皋
1. 手机和电脑郜先连䞊同䞀䞪"䞭闎人"发现服务噚
   ┌────┐   连䞊了IP 是 120.x:50001  ┌──────┐
   │手机│─────────────────────────────►│发现服务噚│
   └────┘                              └──────┘
   ┌────┐   连䞊了IP 是 8.x:22000   ┌──────┐
   │电脑│─────────────────────────────►│发现服务噚│
   └────┘                              └──────┘

2. 发现服务噚告诉双方对方的 IP
   手机 ←──── 电脑圚 8.x:22000 ──────→ 电脑
   手机 →──── 手机圚 120.x:50001 ────→ 电脑

3. 双方同时埀对方的 IP:端口 发䞀䞪包
   ┌────┐ ──── 去 8.x:22000 ────► ┌────┐
   │手机│                         │电脑│
   └────┘ ◄─── 去 120.x:50001 ──── └────┘

4. NAT 路由噚收到"来自电脑的包"发现映射衚里刚奜有手机那条记圕
   → 攟行盎连建立成功 ✅

劂果打掞倱莥运营商 NAT 过于䞥栌降级到䞭继暡匏——双方郜连到䞀䞪公共䞭继服务噚服务噚蜬发加密数据。


同步流皋

1. 文件变曎新增/修改/删陀
       │
2. 本地玢匕曎新扫描文件变化
       │
3. 通知远端讟倇"我有曎新"
       │
4. 远端请求差匂摘芁
       │
5. 本地发送差匂块分块䌠蟓 + SHA256 校验
       │
6. 远端重组 + 校验 → 写入磁盘

特点

  • 双向同步任䞀端的修改郜䌚同步到及䞀端
  • 冲突倄理䞀端同时修改同䞀文件保留䞀䞪版本file.冲突-讟倇名-æ—¶é—Ž.md
  • 版本管理可配眮保留历史版本防止误删

和䞭心化方案对比

特性 SyncthingP2P OneDrive / iCloud 自建 NextCloud
是吊需芁䞭倮服务噚 ❌ 䞍需芁 ✅ 埮蜯/苹果服务噚 ✅ 自建服务噚
数据䌠蟓 盎连加密 经第䞉方 经自建服务噚
隐私性 最高 䜎服务商可访问 䞭自己管
速床 局域眑最快 受云服务限速 受服务噚垊宜限速
可甚性 双方圚线才胜同步 犻线也胜䞊䌠 服务噚圚线即可

实际䜓验

  • 圚家连同䞀䞪 Wi-Fi秒级同步和本地操䜜没区别
  • 手机甚流量若 NAT 打掞成功 ≈ 1-2秒延迟若走䞭继 ≈ 几秒延迟
  • 写完 Obsidian 笔记按 Ctrl+S拿起手机盎接看——䞍需芁手劚䞊䌠或刷新

配眮过皋

环境

讟倇 系统 安装方匏
电脑 Windows 官眑䞋蜜 zip解压运行
手机 Android Google Play / F-Droid 安装 Syncthing-Fork

讟倇 ID

电脑: ABCDE12-FGHIJK3-LMNOPQ4-RSTUVW5-YZABCD6-EFGHIJ7-KLMNOP8-QRSTUV9
手机: ZYXWV9-UTSRQP8-NMLKJI7-HGFEDC6-BAZYXW5-VUTSRQ4-PONMLK3-JIHGFE2

讟倇 ID = 讟倇证乊公钥的 SHA-256 指纹甚于身仜验证䞍胜仅甚 IP 替代。

配眮步骀

电脑端

  1. 从 syncthing.net/downloads 䞋蜜 Windows 版解压
  2. 双击 syncthing.exe 运行
  3. 浏览噚打匀 http://127.0.0.1:8384 进入 Web UI
  4. 点右䞊角 操䜜 → 添加远皋讟倇
  5. 填入手机的讟倇 ID名称填 Phone
  6. 共享文件倹募选需芁同步的目圕
  7. 点 保存

手机端

  1. 安装 Syncthing App
  2. 点右䞊角 + → 添加讟倇
  3. 填入电脑的讟倇 ID名称填 DESKTOP
  4. 点 保存收到配对请求后点 接受

完敎同步流皋

发现 → 身仜验证 → TLS 加密 → 䌠蟓数据

Step 1: 发现
  手机 ──→ 发现服务噚"ABCDE12-... 圚线吗"
  发现服务噚 ──→ 手机"圚的IP 是 x.x.x.x:22000"

Step 2: 身仜验证
  手机 ←── 电脑发来公钥
  手机 SHA-256(公钥) = ABCDE12-... ✅自己手劚蟓入的可信
  手机 ──→ 发起挑战加密消息
  电脑 ←── 甚私钥解密 → 回倍正确 ✅没有私钥的人过䞍了这关

Step 3: TLS 握手
  双方验证通过 → 非对称加密亀换对称密钥 → 建立加密通道

Step 4: 䌠蟓数据
  电脑 ──→ 手机TLS 加密后的文件差匂数据
  手机解密 → 写入磁盘 → 同步完成

关于眑络环境

目前手机䜿甚梯子才胜连接到电脑

  • Syncthing 的党球发现服务噚和䞭继服务噚被 GFW 封锁
  • 手机匀梯子后流量先加密出囜绕过封锁才胜发现电脑
  • 同步成功后关闭梯子䌚富臎连接断匀

后续䌘化 圚自建服务噚䞊搭䞭继服务囜内盎连即可同步无需梯子。


参考