在现代IT运维中,数据同步与备份是保障业务连续性的关键环节。rsync作为一款高效、可靠的文件同步工具,被广泛应用于各种场景,在复杂的网络拓扑中,例如服务器位于不同网段或受到防火墙限制时,直接进行rsync通信可能会变得困难,配置一个rsync代理(或称为中转节点)便成为一种优雅的解决方案,本文将详细介绍如何在CentOS系统上,通过SSH隧道的方式配置rsync代理,实现跨网络的安全、高效数据同步。

环境准备与概念解析
在开始配置之前,我们需要明确“rsync代理”的具体含义,这里的“代理”并非指传统意义上的HTTP代理,而是利用一台可同时访问客户端和目标服务器的中间服务器(代理服务器),通过SSH隧道建立一个透明的数据传输通道。
假设我们有三台服务器:
- 客户端: 数据同步的发起方,无法直接访问目标服务器。
- 代理服务器: 能够被客户端访问,同时也能访问目标服务器,作为数据中转的跳板。
- 目标服务器: 数据同步的最终目的地。
我们的目标是:在客户端上执行一条rsync命令,让数据自动经由代理服务器,最终同步到目标服务器上。
在配置前,请确保以下条件已满足:
- 三台服务器均已安装CentOS操作系统。
- 客户端可以SSH登录到代理服务器。
- 代理服务器可以SSH登录到目标服务器。
- 所有服务器均已安装
rsync工具,若未安装,可使用yum install rsync -y命令进行安装。
核心配置步骤
整个配置过程的核心在于SSH的无密码互信和ProxyCommand的使用。
配置SSH无密码登录
为了实现自动化同步,必须配置SSH基于密钥的无密码登录。
-
客户端 -> 代理服务器 的无密码登录 在客户端服务器上,生成SSH密钥对(如果尚未生成):
ssh-keygen -t rsa
一路回车使用默认设置即可,然后将公钥复制到代理服务器:
ssh-copy-id user_proxy@PROXY_IP
将
user_proxy替换为代理服务器的实际用户名,PROXY_IP替换为代理服务器的IP地址,完成后,尝试ssh user_proxy@PROXY_IP应能无需密码直接登录。
-
代理服务器 -> 目标服务器 的无密码登录 同样地,在代理服务器上,生成密钥对并将公钥复制到目标服务器:
# 在代理服务器上执行 ssh-keygen -t rsa ssh-copy-id user_target@TARGET_IP
将
user_target和TARGET_IP替换为目标服务器的实际用户名和IP,验证ssh user_target@TARGET_IP可否无密码登录。
至此,客户端可以登录代理,代理可以登录目标,数据链路的认证基础已经打好。
执行代理同步命令
现在我们可以在客户端上,通过一条整合的命令来执行经由代理的rsync同步,这里的关键是rsync的-e参数,它允许我们指定远程Shell程序,并传递额外的SSH选项。
命令的基本结构如下:
rsync [选项] -e "ssh -o ProxyCommand='ssh -W %h:%p user_proxy@PROXY_IP'" /源路径 user_target@TARGET_IP:/目标路径
让我们分解这个复杂的命令:
rsync [选项]: 常用的选项是-avz,它们的含义如下表所示:
| 选项 | 含义 |
|---|---|
| -a | 归档模式,相当于-rlptgoD,保留文件所有属性 |
| -v | 显示详细输出过程 |
| -z | 在传输过程中对文件进行压缩 |
-e "ssh ...": 指定使用SSH作为传输协议,并附带配置。-o ProxyCommand='ssh -W %h:%p user_proxy@PROXY_IP': 这是实现代理的核心。ProxyCommand: SSH的一个配置指令,用于在连接最终目标前,先执行一个命令来建立连接。ssh -W %h:%p ...: 这个命令会通过ssh连接到代理服务器user_proxy@PROXY_IP,并使用-W参数建立一个标准输入输出的管道,直接转发到最终目标(%h会被替换为目标主机名TARGET_IP,%p会被替换为目标SSH端口,默认为22)。- 这相当于告诉SSH:“要连接
TARGET_IP,请先通过user_proxy@PROXY_IP建立一个通道。”
/源路径: 客户端上需要同步的文件或目录。user_target@TARGET_IP:/目标路径: 最终数据存放的位置。
示例:
假设我们要将客户端的 /data/web 目录同步到目标服务器的 /backup/web 目录。
rsync -avz -e "ssh -o ProxyCommand='ssh -W %h:%p jumpuser@192.168.1.10'" /data/web backupuser@10.0.0.5:/backup/web
执行此命令后,rsync会通过jumpuser@192.168.1.10这台代理服务器,将数据安全地同步到backupuser@10.0.0.5。
使用SSH配置文件简化命令
每次都输入这么长的命令非常繁琐且容易出错,我们可以通过配置客户端的SSH配置文件(~/.ssh/config)来简化这个过程。

编辑客户端用户的 ~/.ssh/config 文件(如果不存在则创建):
vi ~/.ssh/config
Host target_server
HostName 10.0.0.5
User backupuser
Port 22
ProxyCommand ssh -W %h:%p jumpuser@192.168.1.10
配置说明:
Host target_server: 定义一个主机别名,名为target_server。HostName: 目标服务器的真实IP。User: 登录目标服务器的用户名。Port: 目标服务器的SSH端口。ProxyCommand: 定义如何通过代理连接到该主机。
保存文件后,rsync命令可以被极大地简化为:
rsync -avz /data/web target_server:/backup/web
SSH客户端会自动读取配置文件,在后台处理所有代理连接细节,使得操作如同直连一样简洁。
相关问答FAQs
问题1:如果代理服务器和目标服务器的SSH端口都不是默认的22,应该如何配置? 解答: 这种情况非常常见,只需在配置中明确指定端口即可。
- 在命令行方式中: 需要修改
ProxyCommand中的-p端口参数,以及连接目标服务器的端口,代理端口是2222,目标端口是3333:rsync -avz -e "ssh -p 3333 -o ProxyCommand='ssh -p 2222 -W %h:%p jumpuser@192.168.1.10'" /data/web backupuser@10.0.0.5:/backup/web
注意这里的
-p 3333是给最终目标连接用的,而ProxyCommand内部的-p 2222是给连接代理用的。 - 在
~/.ssh/config文件方式中: 这是最清晰的配置方式:Host target_server HostName 10.0.0.5 User backupuser Port 3333 ProxyCommand ssh -p 2222 -W %h:%p jumpuser@192.168.1.10这样,
rsync命令依然保持简洁,所有端口信息都封装在了配置文件中。
问题2:除了SSH隧道方式,还有其他方法可以实现rsync代理吗?
解答: 是的,另一种方法是利用rsync守护进程模式,可以在代理服务器上运行一个rsync守护进程,该进程配置了指向目标服务器的模块,客户端直接连接代理服务器的rsync端口(通常是873),代理服务器再根据配置,从目标服务器拉取数据或向其推送数据。
- 优点: 对客户端来说更简单,就像连接一个普通的
rsync服务器,无需关心SSH和ProxyCommand,如果代理服务器对公网开放873端口,可以实现更灵活的匿名或密码认证同步。 - 缺点: 配置相对复杂,需要在代理服务器上编写
rsyncd.conf文件,并为每个目标定义模块,开放rsync守护进程端口需要考虑额外的安全措施,如防火墙规则、IP白名单和模块密码,其安全性通常不如基于SSH密钥的隧道方式,在安全性要求较高的内部网络环境中,SSH隧道代理是更受推荐的首选方案。