Syncthing 部署实战指南:三步完成三平台的自启后台服务配置
【免费下载链接】syncthingOpen Source Continuous File Synchronization项目地址: https://gitcode.com/GitHub_Trending/sy/syncthing
晚上十一点,你在办公室的电脑上改完最后一版文档,想直接回家用笔记本接着干——但不想再往网盘里传一遍文件。Syncthing(开源连续文件同步工具)能解决这个问题:它让多台电脑之间点对点直连、全程 TLS 加密地实时同步文件,数据不落任何第三方服务器。本文带你把 Syncthing 在 Windows、macOS、Linux 上装起来、跑成开机自启的后台服务,并完成防火墙与安全加固,每步都给出可验证的预期结果。
一、动手前:一张表看懂部署路线
先建立全局认识。Syncthing 的同步过程可以压缩成 5 步:
- 设备发现——先通过局域网广播(UDP 21027)找到对方,找不到就退回全球发现服务器
- 建立连接——优先 TLS 直连;连不通时走中继服务器中转(可选)
- 交换索引——两台设备先同步"各自有哪些文件"的元数据
- 传输差异块——只传变化的数据块(BEP 块交换协议),不传整个文件
- 校验确认——逐块校验完整性后标记同步完成
整个部署过程则按下面 5 个任务推进,本文每个章节对应一个任务:
| 任务 | 做什么 | 预期结果 |
|---|---|---|
| 1 安装运行 | 下载程序并首次启动 | 浏览器打开 8384 端口能看到 Web 界面 |
| 2 自启服务 | 交给系统的服务管理器托管 | 重启电脑后无需手动启动 |
| 3 防火墙 | 放行 4 个关键端口 | 跨设备能互相发现并直连 |
| 4 安全加固 | 锁 Web 界面 + 沙箱化进程 | 界面不可匿名访问 |
| 5 排障 | 查日志对表 | 常见故障 5 分钟内定位 |
环境方面只需记住端口清单:TCP 22000(文件传输,必需)、UDP 22000(QUIC 传输,推荐)、UDP 21027(本地发现,可选)、TCP 8384(Web 管理界面)。系统要求不高:Windows 7 SP1 及以上、macOS 10.13 及以上、Linux 内核 3.10 及以上均可运行,推荐 4GB 内存。
二、第一步:装上程序,跑通第一次同步
选哪种安装方式,一张表定
| 平台 | 方式 | 适合谁 |
|---|---|---|
| Windows | 官网 ZIP 包解压即用 | 所有人 |
| macOS | 官方 DMG / Homebrew | DMG 图省事,Homebrew 方便升级 |
| Linux | 官方二进制 / 发行版仓库 | 追求最新版选二进制,图自动更新选仓库 |
Windows:解压、双击、设密码
把官方 ZIP 解压到C:\Program Files\Syncthing,双击syncthing.exe。首次运行会自动生成配置文件并弹出浏览器,停在http://localhost:8384的 Web 界面——看到界面就说明程序已经活起来了。接下来在界面右上角"操作 → 设置 → GUI"里设置账号密码(强烈建议),并取消"启动时打开浏览器",因为下一步程序要退到后台。
macOS:两种入口任选其一
DMG 方式:下载后拖入"应用程序",首次启动若被系统拦截,到"系统偏好设置 → 安全性与隐私"里放行。
Homebrew 方式只需一条命令:
brew install syncthing装完直接syncthing启动,同样会打开 8384 的 Web 界面。
Linux:二进制三步走
以下命令下载并安装官方二进制(版本号请按实际替换),预期结果是syncthing --version能打印出版本号:
wget https://github.com/syncthing/syncthing/releases/download/v1.23.6/syncthing-linux-amd64-v1.23.6.tar.gz tar -xvzf syncthing-linux-amd64-v1.23.6.tar.gz sudo cp syncthing-linux-amd64-v1.23.6/syncthing /usr/local/bin/三个平台装好后,登录 Web 界面把"添加远程设备"走一遍:把 A 设备的设备 ID 填进 B 设备,反过来再填一次,双方点同意授权。之后往共享文件夹丢个文件,几秒内另一台机器出现——第一次同步就算跑通了。
三、第二步:让程序开机自启,退到后台常驻
⚠️ 三个平台的核心思路一致:用
--no-restart让 Syncthing 自己不再拉活,重启职责全部交给系统服务管理器(Windows 服务 / launchd / systemd),避免"两套机制互相抢着拉起进程"。
Linux:用户级 systemd 服务最省事
先建好用户级 unit 目录,再创建~/.config/systemd/user/syncthing.service。项目仓库的etc/linux-systemd/user/syncthing.service里就是官方维护的版本,简化后内容如下:
[Unit] Description=Syncthing - Open Source Continuous File Synchronization After=network.target StartLimitIntervalSec=60 StartLimitBurst=4 [Service] ExecStart=/usr/local/bin/syncthing serve --no-browser --no-restart Restart=on-failure RestartSec=5 SuccessExitStatus=3 4 [Install] WantedBy=default.targetSuccessExitStatus=3 4这行别删:3 和 4 是 Syncthing"收到停止信号后正常退出"的状态码,不声明的话 systemd 会误判为崩溃。然后启用并启动:
systemctl --user enable syncthing.service systemctl --user start syncthing.service预期结果:systemctl --user status syncthing.service显示active (running)。如果是要给整个服务器用的多用户场景,改用系统级模板服务(etc/linux-systemd/system/syncthing@.service,sudo systemctl enable syncthing@用户名.service即可按用户实例化),它在用户级基础上还叠了一整套沙箱配置,后面第五节细说。
Windows:两条 sc 命令建成系统服务
以管理员身份打开 CMD,第一条命令创建服务,第二条启动它:
sc create Syncthing binPath= "\"C:\Program Files\Syncthing\syncthing.exe\" serve --no-browser --no-restart" start= auto displayname= "Syncthing File Synchronization" sc start Syncthing再跑sc query Syncthing验证——状态为RUNNING即成功。以后重启用sc stop Syncthing+sc start Syncthing即可。
macOS:写一个 LaunchAgent 交给 launchd
macOS 的服务框架叫 launchd,用户级任务放在~/Library/LaunchAgents/。项目里etc/macos-launchd/syncthing.plist就是现成模板,把其中USERNAME换成你的用户名、程序路径改成实际位置,内容长这样:
<plist version="1.0"> <dict> <key>Label</key> <string>net.syncthing.syncthing</string> <key>ProgramArguments</key> <array> <string>/Applications/Syncthing.app/Contents/MacOS/syncthing</string> <string>serve</string> <string>--no-browser</string> </array> <key>EnvironmentVariables</key> <dict> <key>HOME</key> <string>/Users/你的用户名</string> <key>STNORESTART</key> <string>1</string> </dict> <key>KeepAlive</key> <true/> <key>LowPriorityIO</key> <true/> <key>StandardOutPath</key> <string>/Users/你的用户名/Library/Logs/Syncthing.log</string> <key>StandardErrorPath</key> <string>/Users/你的用户名/Library/Logs/Syncthing-Errors.log</string> </dict> </plist>几个关键键值:KeepAlive让 launchd 负责进程挂掉后拉起;LowPriorityIO降低同步的磁盘 IO 优先级,避免卡前台操作;STNORESTART=1等价于--no-restart。保存后执行加载命令,预期结果是launchctl list | grep syncthing能列出该任务:
launchctl load ~/Library/LaunchAgents/net.syncthing.syncthing.plist launchctl list | grep syncthing四、第三步:防火墙放行,只需几条命令
Ubuntu / Debian(UFW)
放行数据端口和本地发现端口,一条命令搞定(Web 界面默认只监听本机,通常不用放行 8384):
sudo ufw allow 22000/tcp sudo ufw allow 22000/udp sudo ufw allow 21027/udp项目仓库etc/firewall-ufw/syncthing里还有一份包含 8384 的完整 UFW 描述,需要远程访问 Web 界面时可参考。
Windows
打开"控制面板 → 系统和安全 → Windows Defender 防火墙 → 允许应用通过防火墙",点"允许其他应用"选择syncthing.exe,按你的网络环境勾选"私有"或"公用",添加即可。
macOS
Homebrew 装的版本一般自带放行;DMG 版本若被拦截,macOS 会弹系统提示,点"允许传入连接"放行syncthing进程即可。
五、进阶加固:两件事别省
把 Web 界面锁死
8384 端口默认只监听127.0.0.1,这是最安全的状态。只要你在设置里把监听地址改成了0.0.0.0:8384以便远程访问,就必须同时确认 GUI 已设好强密码——界面上"未授权"访问日志一出现就说明有人在尝试登录。
给进程套上 systemd 沙箱
Linux 系统级服务值得直接采用项目etc/linux-systemd/system/syncthing@.service里维护的加固项,挑几个关键的:
ProtectSystem=full+PrivateTmp:系统目录只读、临时目录隔离MemoryDenyWriteExecute:禁止"可写又可执行"的内存页,直接封死 JIT 类攻击NoNewPrivileges+RestrictSUIDSGID:进程无权提权、不能在文件上种 SUID 位SystemCallFilter=@system-service:系统调用白名单,未列出的调用直接返回EPERM
这些选项组合的目的是"爆炸半径"控制:即使某个漏洞被利用,攻击者拿到的也是一个被锁进笼子、改不了系统文件的进程。验证方式是在启动服务后跑一次systemd-analyze security syncthing@用户名.service查看暴露面评分。
⚠️ 该文件注释里特别强调:沙箱选项看似"冗余",但不同 systemd/内核版本下生效情况不同,官方建议全部保留,不要嫌长删掉。
六、排障速查:先看日志,再对这张表
三个平台的日志入口各不相同,先定位日志再谈排错:
| 平台 | 日志位置 |
|---|---|
| Linux(systemd) | journalctl --user -u syncthing -f(系统级用--unit syncthing@用户名) |
| macOS | ~/Library/Logs/Syncthing.log与Syncthing-Errors.log,tail -f实时跟踪 |
| Windows | 事件查看器中的 Syncthing 服务日志,或启动时未加--no-browser的窗口输出 |
高频故障对照表,覆盖 90% 的部署问题:
| 症状 | 大概率原因 | 处理 |
|---|---|---|
| 两台设备互相发现不了 | 防火墙没放行 UDP 21027,或跨网络段 | 按第四节放行端口;跨网段依赖全球发现或手动加对方地址 |
| 能发现但连接失败 | 22000 端口被拦 / NAT 严格 | 放行 22000 tcp+udp;确认已启用中继兜底 |
| 服务启动后立刻退出 | 配置文件目录无写权限 | 检查配置目录属主(systemd 下应为运行用户) |
| 文件同步了但权限不对 | 服务以其他用户身份运行 | 系统级服务改用同用户实例(syncthing@用户名),或启用 syncOwnership 能力 |
| 升级后 Web 界面打不开 | 监听地址被改到非默认端口 | syncthing --gui-address查看实际端口,别猜 |
排障口诀:先看日志最后一屏,再对照上表;日志里带panic字样的行基本都指向上面前两项,Access denied系列则指向权限。
七、延伸阅读:仓库里值得看的模块
想深入理解某个环节时,可以直接进项目源码对照,几个入口:
lib/model/:同步核心逻辑,文件夹状态机、索引处理、块拉取都在这里lib/api/:Web 界面与 REST API 的实现,8384 端口背后的代码lib/connections/:TCP、QUIC、中继三种连接方式的拨号与监听lib/versioner/:文件版本控制(简单/垃圾桶/时间间隔/外部四种策略)proto/bep/bep.proto:块交换协议的正式定义,想弄懂"差异块怎么传"看它最快etc/:本文用到的所有系统服务脚本与防火墙描述文件的官方出处
按第二到六节走完,你的 Syncthing 就具备了生产可用的形态:三平台自动常驻、跨网络可直连、界面有锁、进程有沙箱。剩下要做的,只是往共享文件夹里丢第一个文件。
【免费下载链接】syncthingOpen Source Continuous File Synchronization项目地址: https://gitcode.com/GitHub_Trending/sy/syncthing
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考