因为一些众所周知的原因,早在几个月前Resilio Sync就跪了(也就是在我刚购买后的几个月🤣),之后也尝试了一些网上的方法,始终都不行。后来忙于工作也没有去折腾了,只是简单的用它Predefined hosts(预定义主机)
功能让我至少在局域网里可以备份照片。
周末忽然想到SSH不是可以远程端口转发么?将我的Resilio Sync服务器(树莓派2)端口映射到公网主机即可,然后在Resilio Sync客户端里填写公网的端口不就OK了么,很简单的思路。
设备环境
假设设备环境如下:
- 本地内网Resilio Sync服务器
- 公网服务器,假设IP: 223.23.23.23
配置公网服务器sshd
- 修改配置文件
/etc/ssh/sshd_config
, 添加或开启GatewayPorts
选项
1 | # /etc/ssh/sshd_config |
这个选项允许远程端口监听所有地址发来的请求。然后重启sshd服务。
1 | $ sudo service sshd restart |
远程端口转发
关于远程端口转发有很多文章,这里就不再赘述了,详细可以参考文章末尾几个链接。以下是对内网机器的配置,具体步骤如下:
- 保持ssh长连接
$ vim ~/.ssh/config
加入如下配置
1 | Host * |
- 开启ssh端口转发
在内网机器上执行如下命令:
1 | $ ssh -fCgN -R 0.0.0.0:8090:localhost:37879 user@223.23.23.23 |
8090
是远程主机上开放的端口,注意远程主机的防火墙以及VPC的防火墙不要阻止该端口。37879
是Resilio Sync侦听的端口,这个可以在Web UI上查找到。
关于其它几个参数的解释我就贴过来:
-C 压缩数据传输
-f 将 ssh 转到后台运行,即认证之后,ssh 自动以后台运行。不在输出信息
-N 不执行脚本或命令,即通知 sshd 不运行设定的 shell 通常与 -f 连用
稍微需要强调下的参数:
-g Allows remote hosts to connect to local forwarded ports. If used on a multiplexed connection, then this option must be specified on the master process.
-g
选项允许远程主机发起到本地主机的端口连接,这个必须要开启。
-R [bind_address:]port:host:hostport
…
By default, the listening socket on the server will be bound to the loopback interface only. This may be overridden by specifying a bind_address. An empty bind_address, or the address ‘*’, indicates that the remote socket should listen on all interfaces. Specifying a remote bind_address will only succeed if the server’s GatewayPorts option is enabled (see sshd_config(5)).
同样这里可以看到文档中指明远程主机的GatewayPorts选项必须开启,这个在上一点我们已经配置过了。
可以把这个SSH命令加入自启动脚本。在配置的过程中建议先排查防火墙问题,避免端口被阻止。可以先用Python官方文档的脚本做模拟请求测试,转发成功后再切换为Resilio Sync端口。
Resilio Sync客户端配置
最后一步就很简单了,直接在客户端共享文件夹的Preferences(首选项)
里添加Predefined hosts(预定义主机)
。
对于手机客户端的相机备份没有这个选项,这点比较蛋疼,暂时无法通过这个方法了。
实测效果
用户数再也不为0了,上传速度100多KB/S,下载速度1+MB/S,比较符合我的公网主机带宽,基本跑满了。至于这个流量是否走公网主机暂且不清楚,我认为这个预定义主机应该只是做为一个发现服务,但实际的速度显示出似乎和远程转发的公网主机有关🤣.