
开篇词
在企业级内网环境中,我们经常面临一个痛点:服务器完全隔离于互联网,但又需要在这几台机器之间实时同步文件(如备份日志、同步静态资源或分发配置)。
传统的 rsync 定时任务不够实时,NFS 挂载在网络波动时容易卡死。今天,我们来介绍一款开源神器 —— Syncthing。它无需中心服务器,支持 P2P 传输,且完全开源免费。
本文将演示如何在 完全离线 的 Linux 环境下,部署并配置两台服务器的双向同步。
准备工作
- 服务器 A (Master): IP
192.168.1.100(示例) - 服务器 B (Slave): IP
192.168.1.101(示例) - 系统环境: CentOS 7 / Ubuntu 20.04 (通用)
- 工具: 一台能上网的电脑(用于下载安装包),U盘或 SCP 工具。

第一步:获取离线安装包
由于服务器无法上网,我们需要先在有网的电脑上下载 Syncthing 的二进制文件。

- 访问 GitHub 发布页:
https://github.com/syncthing/syncthing/releases或者官网https://syncthing.net/downloads/ - 下载对应架构的 Linux 版本(通常是
syncthing-linux-amd64-v2.xx.x.tar.gz)。 - 通过 SCP 或 U 盘将压缩包上传至两台服务器的
/tmp目录。
第二步:安装与部署
(以下操作在两台服务器上均需执行)
我们将 Syncthing 安装到 /usr/local/bin 以便全局调用。
# 1. 解压安装包
cd /tmp
tar -zxvf syncthing-linux-amd64-*.tar.gz
# 2. 进入解压后的目录
cd syncthing-linux-amd64-*
# 3. 复制二进制文件到系统路径
sudo cp syncthing /usr/local/bin/
# 4. 验证安装
syncthing --version
如果看到版本号输出,说明二进制文件已就位。
第三步:配置 Systemd 后台服务
为了让 Syncthing 开机自启并在后台运行,我们需要创建一个 Systemd 服务文件。
建议创建一个专用用户运行(如 syncthing),也可以直接用 root(生产环境请注意权限)。这里演示使用 root 用户。
新建文件 /etc/systemd/system/syncthing.service:
[Unit]
Description=Syncthing - Open Source Continuous File Synchronization
Documentation=https://docs.syncthing.net/
After=network.target
[Service]
# 指定运行用户,如果是非 root 用户请修改此处
User=root
# 关键:指定配置文件和数据目录,防止乱放
ExecStart=/usr/local/bin/syncthing -no-browser -home=/etc/syncthing
Restart=on-failure
SuccessExitStatus=3 4
[Install]
WantedBy=multi-user.target
启动服务:
# 创建配置目录
mkdir -p /etc/syncthing
# 重新加载服务配置
systemctl daemon-reload
# 启动并设置开机自启
systemctl enable syncthing
systemctl start syncthing
# 查看状态
systemctl status syncthing
第四步:修改配置以允许远程访问
默认情况下,Syncthing 的 Web 管理界面(GUI)只允许 127.0.0.1 访问。在无桌面的服务器上,我们需要修改配置允许通过 IP 访问。
-
修改 config.xml
文件路径位于我们在 Service 中指定的/etc/syncthing/config.xml。vi /etc/syncthing/config.xml找到
<gui>标签部分,将<address>127.0.0.1:8384</address>修改为0.0.0.0:8384。<gui enabled="true" tls="false" debugging="false"> <!-- 修改此处为 0.0.0.0:8384 --> <address>0.0.0.0:8384</address> <apikey>...</apikey> <theme>default</theme> </gui> -
重启服务
systemctl restart syncthing -
开放防火墙(重要)
Syncthing 需要开放两个端口:- 8384 (TCP): Web 管理面板
- 22000 (TCP/UDP): 数据传输协议
# CentOS 7+ firewall-cmd --zone=public --add-port=8384/tcp --permanent firewall-cmd --zone=public --add-port=22000/tcp --permanent firewall-cmd --zone=public --add-port=22000/udp --permanent firewall-cmd --reload
第五步:Web 界面连接与配对
现在,在你的浏览器中输入 http://192.168.1.100:8384 和 http://192.168.1.101:8384,你应该能看到 Syncthing 的管理界面。

1. 设置密码(安全第一)
首次进入会有红色警告,点击设置,为 GUI 设置一个账号密码。

2. 添加远程设备
由于是离线环境,全局发现(Global Discovery) 功能是失效的,我们需要手动指定 IP。
- 在 服务器 A 的界面上,点击右下角“操作” -> “显示 ID”,复制那一长串 ID。

- 在 服务器 B 的界面上,点击“添加远程设备”。

- 设备 ID: 粘贴 A 的 ID。
- 高级 -> 地址列表: 默认是
dynamic,必须修改为静态 IP。- 格式:
tcp://192.168.1.100:22000
- 格式:
- 点击保存。
反向操作一遍:在 A 上添加 B 的 ID,并在地址列表中填入 tcp://192.168.1.101:22000。
3. 共享文件夹
设备连接成功后(状态显示为“已连接”),就可以同步文件夹了。
- 在 A 上点击“添加文件夹”。
- 文件夹路径: 输入你想同步的目录,例如
/data/backup。 - 共享: 勾选“服务器 B”。
- 保存后,B 的界面会弹出一个提示“A 想要共享文件夹”,点击“添加”,设置好 B 本地的路径即可。




⚠️ 常见问题与避坑指南 (Troubleshooting)
在离线环境中,你可能会遇到以下问题,请提前规避:
1. 为什么一直显示“断开连接”?
- 检查防火墙: 确保两台服务器的
22000端口都已放行。可以使用telnet 对方IP 22000测试连通性。 - 关闭无关功能: 在“操作” -> “设置” -> “连接”中,取消勾选以下内容,可以减少报错日志并节省资源:
- ❌ 全局发现 (Global Discovery)
- ❌ 中继 (Relaying)
- ❌ NAT 穿透
2. 权限不足 (Permission Denied)
如果同步状态显示“停止”或报错权限问题,通常是因为 Syncthing 运行用户(如 root)对目标文件夹没有读写权限。
- 解决方案:
chown -R 用户名:用户组 /你的/同步目录
3. 文件冲突怎么办?
Syncthing 默认采用“版本控制”策略。如果在两端同时修改了同一个文件,它会生成一个冲突文件(包含 sync-conflict 字样)。你可以在文件夹设置中配置“文件版本控制”为“简易版本控制”或“回收站”,以防误删。
4.部分linux服务器提示无法监控文件的问题原因
- inotify 限制:
fs.inotify.max_user_watches:定义单个用户可以监视的文件或目录数量。默认值(通常为 8192 或 16384)可能不足以应对大型文件夹或多个同步目录。fs.inotify.max_user_instances:定义用户可以创建的inotify实例数量。默认值较小(如 128),可能限制 Syncthing 的监控能力。
- Syncthing 需求:
- Syncthing 为每个同步文件夹创建一个
inotify监视器,监控文件夹内的所有文件和子目录。如果文件夹包含大量文件或子目录,可能会超出max_user_watches限制。 - 错误中的“Default Folder”和“rsync”文件夹表明这两个目录触发了限制。
- Syncthing 为每个同步文件夹创建一个
解决方法
1. 检查当前 inotify 限制
运行以下命令查看当前的 inotify 限制:
cat /proc/sys/fs/inotify/max_user_watches
cat /proc/sys/fs/inotify/max_user_instances
max_user_watches:默认值通常为 8192 或 16384。max_user_instances:默认值通常为 128。
如果这些值较低(例如 max_user_watches 小于文件夹中的文件数),需要增加限制。
2. 临时增加 inotify 限制
通过以下命令临时调整 inotify 限制(重启后失效):
sudo sysctl -w fs.inotify.max_user_watches=524288
sudo sysctl -w fs.inotify.max_user_instances=512
max_user_watches=524288:增加到 524288,足以应对大多数大型文件夹。max_user_instances=512:增加实例数,适合多文件夹同步。
调整后,检查 Syncthing 是否恢复正常:
- 打开 Syncthing Web 界面(
http://127.0.0.1:8384),查看“Default Folder”和“rsync”文件夹是否仍在报错。 - 或检查日志(
~/.config/syncthing/logs或 Web 界面“操作” > “日志”)。
3. 永久增加 inotify 限制
为了确保重启后限制仍然生效,修改系统配置文件:
- 编辑
/etc/sysctl.conf(或/etc/sysctl.d/99-sysctl.conf):sudo nano /etc/sysctl.conf - 在文件末尾添加以下行:
fs.inotify.max_user_watches=524288 fs.inotify.max_user_instances=512 - 保存并应用更改:
sudo sysctl -p - 重启 Syncthing:
systemctl --user restart syncthing或手动重启 Syncthing 进程。
结语
通过以上步骤,你已经成功构建了一个完全私有、不依赖公网、点对点加密的文件同步系统。无论是做数据库异地备份,还是应用代码分发,Syncthing 都是内网运维的得力助手。
喜欢本文?欢迎点赞、在看、转发!👇
Q.E.D.


