# rsync daemon 服务部署手册 > 适用系统:Ubuntu / Debian、CentOS / RHEL / Rocky / Alma > 默认端口:873/TCP,默认模块:`[data]` → `/srv/rsync-share` --- ## 一、安装 rsync ### Ubuntu / Debian ```bash sudo apt-get update sudo apt-get install -y rsync ``` ### CentOS / RHEL / Rocky / Alma ```bash sudo dnf install -y rsync-daemon # CentOS 8+ / Rocky / Alma # 老版本 CentOS 7: # sudo yum install -y rsync ``` 验证: ```bash rsync --version ``` --- ## 二、创建共享目录 ```bash sudo mkdir -p /srv/rsync-share sudo chown ubuntu:ubuntu /srv/rsync-share # Ubuntu # sudo chown nobody:nobody /srv/rsync-share # CentOS 可用 nobody ``` --- ## 三、配置文件 /etc/rsyncd.conf ```bash sudo tee /etc/rsyncd.conf > /dev/null <<'EOF' # ===== 全局配置 ===== pid file = /run/rsyncd.pid lock file = /run/rsync.lock log file = /var/log/rsyncd.log port = 873 # 如需改端口,改这里并重启服务 # ===== 模块定义 ===== [data] path = /srv/rsync-share comment = shared data read only = no # no=可读写;yes=只读(下载专用) list = yes # 允许客户端列出模块 uid = ubuntu # 以哪个系统用户身份读写文件(CentOS 可改 nobody) gid = ubuntu auth users = rsyncuser # 虚拟用户(不需要是系统用户) secrets file = /etc/rsyncd.secrets hosts allow = 0.0.0.0/0 # 可限制来源,如 10.0.0.0/8 192.168.1.0/24 EOF ``` > 如需匿名访问(无密码),删掉 `auth users` 和 `secrets file` 两行即可。**公网环境强烈不建议匿名。** --- ## 四、设置密码 ```bash echo 'rsyncuser:YourStrongPassword123' | sudo tee /etc/rsyncd.secrets sudo chmod 600 /etc/rsyncd.secrets # 必须 600,否则 rsync 拒绝启动认证 ``` 密码文件格式为 `用户名:密码`,一行一个账号。 --- ## 五、启用并启动服务 ### Ubuntu / Debian Ubuntu 的 rsync 服务包装需要先打开开关: ```bash sudo sed -i 's/^RSYNC_ENABLE=false/RSYNC_ENABLE=true/' /etc/default/rsync sudo systemctl daemon-reload sudo systemctl enable --now rsync ``` ### CentOS / RHEL / Rocky / Alma ```bash sudo systemctl enable --now rsyncd ``` > 注意服务名差异:Ubuntu 是 `rsync.service`,CentOS 是 `rsyncd.service`。 --- ## 六、开放防火墙端口 ### 6.1 ufw(Ubuntu 默认) ```bash sudo ufw allow 873/tcp sudo ufw status | grep 873 # 确认规则已生效 ``` 只允许指定来源网段(更安全): ```bash sudo ufw allow from 10.0.0.0/8 to any port 873 proto tcp ``` 删除规则: ```bash sudo ufw delete allow 873/tcp ``` ### 6.2 firewalld(CentOS 7/8/9、Rocky、Alma 默认) ```bash # rsync 有预定义服务名,推荐直接放行服务 sudo firewall-cmd --permanent --add-service=rsyncd sudo firewall-cmd --reload sudo firewall-cmd --list-services # 确认包含 rsyncd # 或者按端口放行 sudo firewall-cmd --permanent --add-port=873/tcp sudo firewall-cmd --reload ``` 只允许指定来源(富规则): ```bash sudo firewall-cmd --permanent --add-rich-rule='rule family=ipv4 source address=10.0.0.0/8 port port=873 protocol=tcp accept' sudo firewall-cmd --reload ``` 删除规则: ```bash sudo firewall-cmd --permanent --remove-service=rsyncd # 或 --remove-port=873/tcp sudo firewall-cmd --reload ``` ### 6.3 iptables(无 ufw/firewalld 的老系统) ```bash sudo iptables -A INPUT -p tcp --dport 873 -j ACCEPT sudo iptables -L -n | grep 873 # 确认 # 持久化(重启后不丢失): # Ubuntu/Debian: sudo apt-get install -y iptables-persistent sudo netfilter-persistent save # CentOS: sudo yum install -y iptables-services sudo service iptables save # 写入 /etc/sysconfig/iptables ``` 只允许指定来源: ```bash sudo iptables -A INPUT -p tcp -s 10.0.0.0/8 --dport 873 -j ACCEPT ``` ### 6.4 云服务器安全组(重要) 腾讯云、阿里云、AWS 等在主机防火墙之外还有一层**安全组**,两层都要放行 873/TCP,否则外网仍然不通。安全组只能在云控制台操作。 排查外网不通的顺序:服务在监听 → 主机防火墙已放行 → 安全组已放行。 --- ## 七、验证部署 ```bash # 1. 服务状态 systemctl status rsync --no-pager # Ubuntu systemctl status rsyncd --no-pager # CentOS # 2. 端口监听 ss -tlnp | grep 873 # 3. 本机列出模块(需要密码的话加用户) rsync rsync://127.0.0.1/ rsync rsync://rsyncuser@127.0.0.1/ # 4. 实测上传下载 echo "test $(date)" > /tmp/up.txt rsync -a /tmp/up.txt rsync://rsyncuser@127.0.0.1/data/ ls -l /srv/rsync-share/ ``` --- ## 八、客户端使用 ```bash # 列出模块 rsync rsync://rsyncuser@<服务器IP>/ # 下载(服务器 → 本地) rsync -a rsync://rsyncuser@<服务器IP>/data/ ./本地目录/ # 上传(本地 → 服务器) rsync -a ./本地目录/ rsync://rsyncuser@<服务器IP>/data/ # 免交互(脚本中使用,密码从环境变量读取) export RSYNC_PASSWORD='YourStrongPassword123' rsync -a rsync://rsyncuser@<服务器IP>/data/ ./本地目录/ # 密码也可以放文件(客户端侧,权限必须 600) echo 'YourStrongPassword123' > ~/.rsync-pass && chmod 600 ~/.rsync-pass rsync -a --password-file=$HOME/.rsync-pass rsync://rsyncuser@<服务器IP>/data/ ./本地目录/ ``` URL 格式:`rsync://[用户名@]主机[:端口]/模块名/路径` ### DMS 备份客户端(系统管理 → 备份管理) - **服务端地址**填 `rsync://rsyncuser@<服务器IP>/data/`——**用户名必须带上**, 缺省时 rsync 以本机系统用户名认证,服务端会报 `auth failed on module data`。 - 密码在界面「备份管理 → 备份配置」里保存(明文存于 `dms-backup-config.json`, 与 .env 同级目录,注意文件权限)。 - rsync 可执行文件自动探测,无需安装:优先 PATH 上的 rsync(Linux 各发行版 `yum/apt install rsync` 即可),其次发行目录 `tools/rsync/` 内置版 (**Windows 发行包已随包携带 cwRsync 3.4.1,开箱即用**)。特殊路径可用 `.env` 的 `DMS_RSYNC_EXECUTABLE` 显式指定。 - 配置保存后点「测试备份目标连通性」验证读写(会向模块根推送一个 `.dms-writable-probe` 探测文件,属正常行为)。 --- ## 九、修改端口 1. `/etc/rsyncd.conf` 全局段:`port = 8873` 2. `sudo systemctl restart rsync`(Ubuntu)或 `sudo systemctl restart rsyncd`(CentOS) 3. 防火墙放行新端口(按第六节对应方式),删除旧端口规则 4. 云安全组同步修改 5. 客户端使用:`rsync://rsyncuser@:8873/data/` --- ## 十、常用排错 | 现象 | 排查 | |---|---| | connection refused | 服务没启动;端口不对;防火墙/安全组未放行 | | auth failed on module data | 密码错;secrets 文件权限不是 600;`用户名:密码` 格式错误(注意没有多余空格) | | @ERROR: chroot failed | 模块 path 目录不存在或 uid/gid 用户无权限 | | 外网不通但本机通 | 云安全组没放行(最常见) | | 改配置不生效 | 改端口必须 restart;其余配置 rsyncd 每次连接会重读 | 日志位置: ```bash cat /var/log/rsyncd.log # 配置中指定的日志 journalctl -u rsync --no-pager # Ubuntu journalctl -u rsyncd --no-pager # CentOS ``` --- ## 十一、安全建议 1. **不要匿名暴露在公网**——匿名读写模块 + 公网可达 = 任意人可写入你的目录。 2. `hosts allow` 限制来源网段,防火墙同样限制来源 IP,双保险。 3. rsync 协议本身**不加密**,公网传输敏感数据建议走 SSH 模式(`rsync -avz -e ssh user@host:/path/`)或套 VPN/WireGuard。 4. 只读分发场景设 `read only = yes`。 5. secrets 文件必须 `chmod 600`,并定期检查。