利用SSH远程端口转发解决Resilio Sync无法连接问题

因为一些众所周知的原因,早在几个月前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
2
# /etc/ssh/sshd_config
GatewayPorts yes

这个选项允许远程端口监听所有地址发来的请求。然后重启sshd服务。

1
$ sudo service sshd restart

远程端口转发

关于远程端口转发有很多文章,这里就不再赘述了,详细可以参考文章末尾几个链接。以下是对内网机器的配置,具体步骤如下:

  1. 保持ssh长连接

$ vim ~/.ssh/config

加入如下配置

1
2
Host *
ServerAliveInterval 60
  1. 开启ssh端口转发

在内网机器上执行如下命令:

1
$ ssh -fCgN -R 0.0.0.0:8090:localhost:37879 user@223.23.23.23

8090是远程主机上开放的端口,注意远程主机的防火墙以及VPC的防火墙不要阻止该端口。
37879是Resilio Sync侦听的端口,这个可以在Web UI上查找到。
Resilio Sync Server

关于其它几个参数的解释我就贴过来

-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(预定义主机)

Resilio Sync Client

对于手机客户端的相机备份没有这个选项,这点比较蛋疼,暂时无法通过这个方法了。

实测效果

用户数再也不为0了,上传速度100多KB/S,下载速度1+MB/S,比较符合我的公网主机带宽,基本跑满了。至于这个流量是否走公网主机暂且不清楚,我认为这个预定义主机应该只是做为一个发现服务,但实际的速度显示出似乎和远程转发的公网主机有关🤣.

参考链接

  1. SSH隧道与端口转发及内网穿透
  2. SSH 远程端口转发
  3. Linux使用ssh超时断开连接的真正原因