Rsync白名单控制需同时配置hosts allow和hosts deny=*且deny必须置于allow之后,否则默认放行;参数须置于模块段内,配合防火墙等多层防护才可靠。

rsync 通过 hosts allow 和 hosts deny 实现 IP 白名单控制,关键在于顺序匹配 + 显式拒绝兜底,否则配置可能无效。这不是简单写个允许列表就行,而是要确保非法 IP 真的被拦住。
hosts allow 配置多个特定IP或网段
在 /etc/rsyncd.conf 的模块段(如 [backup])或全局段中添加:
hosts allow = 192.168.1.10, 10.0.0.5, 172.16.0.0/16 hosts deny = *
- 多个 IP 或网段用英文逗号
,分隔(不能有空格) - 支持单 IP(
192.168.1.10)、CIDR 网段(10.0.0.0/24)、主机名(不推荐,依赖 DNS 可靠性) -
hosts deny = *是必须项:它堵住所有未显式允许的连接,否则默认放行
⚠️ 注意:
hosts allow和hosts deny是按顺序逐条匹配的,先匹配到就生效。hosts deny = *必须放在hosts allow之后,且不能省略。
验证白名单是否真正生效
-
检查配置语法
rsync --daemon --config=/etc/rsyncd.conf --dry-run
若无报错,说明语法正确。
GitHub Hosts CN下载GitHub Hosts 更新工具(仅限中国用户),安全更新系统hosts文件,保留原有非GitHub条目,仅替换GitHub相关地址。支持备份恢复和风险提示。用于解决GitHub访问问题。
-
重启服务并确认监听状态
systemctl restart rsyncd # 或 rsync --daemon ss -tlnp | grep :873
-
从非白名单IP测试连接(应失败)
rsync rsync://user@172.16.1.41/backup # 应返回类似:@ERROR: client address is not allowed
-
查看日志确认拦截行为
日志路径由log file = /var/log/rsyncd.log指定,典型拒绝记录:2026/07/20 20:15:22 [12345] connect from 192.168.2.100 (192.168.2.100) 2026/07/20 20:15:22 [12345] client address is not allowed
常见失效原因与修复
- 配置写在错误位置(比如把
hosts allow写在全局段但模块里没继承,或写在模块外却期望只作用于某模块)→ 确保该参数放在目标模块[xxx]段内,或明确设为全局(影响所有模块) - 忘记
hosts deny = *→ 即使写了allow,没deny *也会默认放行 - IP 地址写错格式(如
192.168.1.*不合法,应写192.168.1.0/24) - 服务未重载配置 → 修改后必须
systemctl restart rsyncd或killall rsync && rsync --daemon - 客户端使用 SSH 模式(
rsync -e ssh ...)→ 此时白名单完全不生效,因为走的是 SSH 协议栈,IP 控制需在 SSH 层(如sshd_config的AllowUsers+Match Address)或防火墙层实现
补充建议:多层防护更可靠
单纯依赖 rsync 的 hosts allow 属于应用层控制,建议叠加:
-
防火墙限制(推荐):只允许可信 IP 访问 873 端口
firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="192.168.1.10" port port="873" protocol="tcp" accept' firewall-cmd --permanent --remove-service=rsync # 关闭默认开放 firewall-cmd --reload
-
系统级 hosts.deny(辅助):对支持 tcp_wrappers 的服务起作用(部分旧版 rsync 编译时启用)
/etc/hosts.deny中加:rsyncd: ALL/etc/hosts.allow中加:rsyncd: 192.168.1.10, 10.0.0.5
不复杂但容易忽略。

















