rsync+tls 实现远程数据同步加密传输

rsync+tls 实现远程数据同步加密传输

rsync是一个高效的数据同步工具,但是使用rsync本身只支持ssh和rsync这两种传输协议。我最近遇到了一种场景是从境外的服务器上同步到国内的NAS上。直接传输很容易被GFW阻断掉,但是rsync本身不支持tls加密。

最终通过 trojan + rsync 实现伪装tls流量远程同步文件。

安装trojan和rsync

安装trojan并配置tls证书网上有非常多的教程,推荐使用一键脚本。

https://github.com/Jrohy/trojan

然后配置trojan的服务端和客户端,参考网上文章,不是本文重点。

yum install rsync proxychains -y

配置服务端rsync守护进程

修改服务端的 /etc/rsyncd.conf 配置文件。

 uid = root
 gid = root
 use chroot = yes
 max connections = 4
 pid file = /var/run/rsyncd.pid
 exclude = lost+found/
 transfer logging = yes
 timeout = 900
 ignore nonreadable = yes
 dont compress   = *.gz *.tgz *.zip *.z *.Z *.rpm *.deb *.bz2 *.rar

 [slog]
        path = /slog/
        comment = slog data
        read only = no

添加上面的配置,这里我命名了[slog]的模块,同时对应的目录为/slog/。客户端在下载文件时,对应的文件路径根目录就是/slog/。

pkill rsync || rsync --daemon --address=127.0.0.1

然后运行rsync开启守护进程,因为流量需要经过tls加密,rsync的端口就不需要暴露在公网上,让trojan经过本机访问即可,安全性更高。

配置客户端proxychains

由于rsync本身不支持tls,要让rsync的流量强行经过trojan客户端的代理就需要proxychains。在/etc/proxychains4.conf的最后添加trojan的端口。

socks5 127.0.0.1 10811

rsync 同步服务端文件

同步文件之前可以先测试一下,代理是否正常。

└─# proxychains rsync rsync://127.0.0.1                                                                
[proxychains] config file found: /etc/proxychains4.conf
[proxychains] preloading /usr/lib/x86_64-linux-gnu/libproxychains.so.4
[proxychains] DLL init: proxychains-ng 4.16
[proxychains] Strict chain  ...  127.0.0.1:10811  ...  127.0.0.1:873  ...  OK
slog            slog data

可以看到代理是正常的,服务端返回了rsync配置的模块信息。

proxychains rsync -avzP --skip-compress=zip,rar --remove-source-files rsync://127.0.0.1/slog/ /slog

这里的参数解释如下:

  • -a (archive) —— 保留符号链接、权限、时间戳等。
  • -v (verbose) —— 显示详细的同步信息。
  • -z (compress) —— 在传输过程中压缩数据,有助于减少数据传输量。
  • -P —— 等同于 --partial --progress--partial 使 rsync 保存那些因为某些原因而没有完全传输的文件部分,使得未来的 rsync 运行可以继续未完成的传输。--progress 显示传输过程中的进度条。
  • –skip-compress=zip,rar —— 对于已经压缩过的文件,没必要再次压缩,避免浪费CPU资源。
  • –remove-source-files —— 从服务端同步文件成功后,将源文件从服务端删除。

需要解释一下,经过proxychains代理后rsync://127.0.0.1/slog/中的127.0.0.1就不再是客户端地址,而是服务端的地址。

传输效果

经过tls代理后的rsync流量,经过GFW不会被阻断,实测可以跑满服务端的带宽。

为什么这里直接用rsync协议而不用ssh协议传输?

tls本身已经加密过一次,没必要ssh再加密一次。而rsync本身是明文传输协议,直接配合tls效率更高。

同时这个思路也可以发散出去,对于这类需要经过GFW传输数据的,都可以使用proxychains配合代理实现tls加密传输。

赞赏

微信赞赏支付宝赞赏

Zgao

愿有一日,安全圈的师傅们都能用上Zgao写的工具。

发表评论