rsync部署设置.md 7.7 KB

rsync daemon 服务部署手册

适用系统:Ubuntu / Debian、CentOS / RHEL / Rocky / Alma 默认端口:873/TCP,默认模块:[data] → /srv/rsync-share


一、安装 rsync

Ubuntu / Debian

sudo apt-get update
sudo apt-get install -y rsync

CentOS / RHEL / Rocky / Alma

sudo dnf install -y rsync-daemon    # CentOS 8+ / Rocky / Alma
# 老版本 CentOS 7:
# sudo yum install -y rsync

验证:

rsync --version

二、创建共享目录

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

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 两行即可。公网环境强烈不建议匿名。


四、设置密码

echo 'rsyncuser:YourStrongPassword123' | sudo tee /etc/rsyncd.secrets
sudo chmod 600 /etc/rsyncd.secrets     # 必须 600,否则 rsync 拒绝启动认证

密码文件格式为 用户名:密码,一行一个账号。


五、启用并启动服务

Ubuntu / Debian

Ubuntu 的 rsync 服务包装需要先打开开关:

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

sudo systemctl enable --now rsyncd

注意服务名差异:Ubuntu 是 rsync.service,CentOS 是 rsyncd.service。


六、开放防火墙端口

6.1 ufw(Ubuntu 默认)

sudo ufw allow 873/tcp
sudo ufw status | grep 873     # 确认规则已生效

只允许指定来源网段(更安全):

sudo ufw allow from 10.0.0.0/8 to any port 873 proto tcp

删除规则:

sudo ufw delete allow 873/tcp

6.2 firewalld(CentOS 7/8/9、Rocky、Alma 默认)

# 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

只允许指定来源(富规则):

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

删除规则:

sudo firewall-cmd --permanent --remove-service=rsyncd   # 或 --remove-port=873/tcp
sudo firewall-cmd --reload

6.3 iptables(无 ufw/firewalld 的老系统)

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

只允许指定来源:

sudo iptables -A INPUT -p tcp -s 10.0.0.0/8 --dport 873 -j ACCEPT

6.4 云服务器安全组(重要)

腾讯云、阿里云、AWS 等在主机防火墙之外还有一层安全组,两层都要放行 873/TCP,否则外网仍然不通。安全组只能在云控制台操作。

排查外网不通的顺序:服务在监听 → 主机防火墙已放行 → 安全组已放行。


七、验证部署

# 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/

八、客户端使用

# 列出模块
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@<IP>:8873/data/

十、常用排错

现象 排查
connection refused 服务没启动;端口不对;防火墙/安全组未放行
auth failed on module data 密码错;secrets 文件权限不是 600;用户名:密码 格式错误(注意没有多余空格)
@ERROR: chroot failed 模块 path 目录不存在或 uid/gid 用户无权限
外网不通但本机通 云安全组没放行(最常见)
改配置不生效 改端口必须 restart;其余配置 rsyncd 每次连接会重读

日志位置:

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,并定期检查。