适用系统:Ubuntu / Debian、CentOS / RHEL / Rocky / Alma 默认端口:873/TCP,默认模块:
[data]→/srv/rsync-share
sudo apt-get update
sudo apt-get install -y rsync
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
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 的 rsync 服务包装需要先打开开关:
sudo sed -i 's/^RSYNC_ENABLE=false/RSYNC_ENABLE=true/' /etc/default/rsync
sudo systemctl daemon-reload
sudo systemctl enable --now rsync
sudo systemctl enable --now rsyncd
注意服务名差异:Ubuntu 是
rsync.service,CentOS 是rsyncd.service。
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
# 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
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
腾讯云、阿里云、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://[用户名@]主机[:端口]/模块名/路径
rsync://rsyncuser@<服务器IP>/data/——用户名必须带上,
缺省时 rsync 以本机系统用户名认证,服务端会报 auth failed on module data。dms-backup-config.json,
与 .env 同级目录,注意文件权限)。yum/apt install rsync 即可),其次发行目录 tools/rsync/ 内置版
(Windows 发行包已随包携带 cwRsync 3.4.1,开箱即用)。特殊路径可用
.env 的 DMS_RSYNC_EXECUTABLE 显式指定。.dms-writable-probe 探测文件,属正常行为)。/etc/rsyncd.conf 全局段:port = 8873sudo systemctl restart rsync(Ubuntu)或 sudo systemctl restart rsyncd(CentOS)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
hosts allow 限制来源网段,防火墙同样限制来源 IP,双保险。rsync -avz -e ssh user@host:/path/)或套 VPN/WireGuard。read only = yes。chmod 600,并定期检查。