一.介绍
我之前介绍了Syncthing,作为一款开源的文件同步程序,它的功能还是非常强大的,我也很高兴能看到它被越来越多的人知道和使用,前几天有位朋友留言说让我介绍下Syncthing的中继服务器的搭建,在这之前的一段时间我在网上偶尔看到过有朋友介绍过一次。
首先来科普一下? 不同于Resilio Sync(BT Sync)使用BT协议进行数据传输,Syncthing使用了BEP对等自由块交换协议(Block Exchange Protocol),这两个倒是没啥优劣的问题,主要是BT Sync在老版本的时候支持DHT,而后来删掉了,这也是导致它的官方服务器在被干扰之后几乎完全无法使用的原因之一,所以当初有人说老版本(支持DHT)的依旧能够使用。而Syncthing不一样的是它没有使用DHT,但是也没有像BT Sync一样只有官方服务器(通告+中继服务器),由于开源,所以Syncthing的服务器都是可以自己部署的,这也就是说,即使官方的服务器出了问题,也能够随时有服务器去代替它。
那么为什么要有这两种服务器呢? 这主要是因为P2P的原理,通告(Announcement)/发现(Discovery)服务器用于发现和索引用户,就和你BT的Tracker(这个其实也是通告服务器)一样,你接入了就等于在里面挂了名,然后服务器会把其他人告诉你,这样你们才能够连上。这个是公网IP的情况,如果没有公网IP呢?这就要轮到中继(Relay)服务器出手了,要么是辅助实现打洞,要么是转为C/S模式。总之,中继服务器就是为了在特殊网络环境下(但是在国内很多家庭宽带就是这样的)的正常使用而存在的。
我们本次就不说通告服务器(Syncthing官方其实是叫做Global Discovery服务器的),因为目前官方的服务器还正常运作,不过感兴趣的或者想建立企业内部的本地Discovery服务器可以自己研究下
PS.之前写的Syncthing的搭建和使用——>传送门
二.安装
好了,让我们开始尝试下搭建
首先,你得先确认一点,你搭建的中继服务器是私人(Private)用途的还是公开(Public)的,因为公开的话就会自动加入Syncthing官方的Relay服务器池中,供其他人使用,这样会导致你的流量消耗变大,所以请想好,并且也会在官方的Relay服务器列表中显示
Relay服务器列表——>传送门
如果下面没显示出状态请在地址栏右侧点击允许加载不安全的脚本,因为会从各个服务器上拉取状态,这个是HTTP的,默认会被HTTPS页面禁用
首先来讲一下参数,然后根据你的需求在下面supervisor的配置里面修改
参考了官方文档进行翻译——>传送门
-debug 启用调试输出 -ext-address=<address> 可选的外部地址(将被上报),能够通过端口转发来监听高权限端口(0-1024)然后外部可以连接这个端口 -global-rate=<bytes/s> 全局限速,单位 bytes/s -keys=<dir> 用于存储 cert.pem 和 key.pem 的目录,默认是 "."(当前目录) -listen=<listen addr> 协议监听的地址,默认是 ":22067" -message-timeout=<duration> 等待消息到达的最大时间(默认 1m0s) -nat 使用UPnP/NAT-PMP来取得外部端口映射 -nat-lease=<duration> NAT租赁时间,单位分钟(默认 60) -nat-renewal=<duration> NAT刷新频率,单位分钟(默认 30) -nat-timeout=<duration> NAT发现超时,单位秒(默认 10) -network-timeout=<duration> 客户端和中继之间网络操作的超时,如果在这个时间段内客户端和中继之间没有数据被接收到,那么连接将被终止。此外,如果在这段时间内任何被中继的客户端没有数据发送,这个会话也会被终止(默认 2m0s) -per-session-rate=<bytes/s> 每个会话的限速,单位 bytes/s -ping-interval=<duration> ping的发送间隔(默认 1m0s) -pools=<pool addresses> 中继服务器池的地址,使用逗号分隔多个(默认 "http://relays.syncthing.net/endpoint")。留空(-pools "")来禁止公布这个服务器到池中,以便作为私有中继。 -protocol=<string> 监听协议,"tcp"来监听IPv4和IPv6,"tcp4"来监听IPv4,"tcp6"来监听IPv6(默认 "tcp") -provided-by=<string> 一个可选的描述字段来表示谁提供了这个中继(可以打打广告啥的) -status-srv=<listen addr> 提供状态服务的监听地址(默认 ":22070"),用于中继服务器池页面来展示服务器状态(传输了多少数据,有多少客户端在线等等),留空(-status-srv="")来禁用这个功能
比较重要的是-pools(是否作为公开服务器),以及限速设置啥的,这个看你需要设置,如果公开请务必确保流量足够,另外公开也可以用-provided-by打个网站的小广告
其他系统请自行替换下载链接 https://github.com/syncthing/relaysrv/releases
#获取程序并解压 wget https://github.com/syncthing/relaysrv/releases/download/v0.14.46/strelaysrv-linux-amd64-v0.14.46.tar.gz tar xzf strelaysrv-linux-amd64-v0.14.46.tar.gz #换个地方方便直接运行(顺便改个名) mv strelaysrv-linux-amd64-v0.14.46/strelaysrv /usr/bin/relaysrv #清理下 rm -rf strelaysrv-linux-amd64-v0.14.46 strelaysrv-linux-amd64-v0.14.46.tar.gz #为了安全创建一个单独的用户 useradd relaysrv -s /bin/false #创建存储配置用的目录并修改所有者 mkdir /etc/relaysrv chown relaysrv /etc/relaysrv #安装supervisor wget https://bootstrap.pypa.io/get-pip.py python get-pip.py rm -rf get-pip.py pip install supervisor #配置supervisor echo_supervisord_conf > /etc/supervisord.conf echo "supervisord" >> /etc/rc.local cat >>/etc/supervisord.conf<<'EOF' [program:relaysrv] command=relaysrv -keys /etc/relaysrv -provided-by="Hi, Senra https://www.senra.me/" autostart=true autorestart=true startsecs=10 stdout_logfile=/var/log/relaysrv.log stdout_logfile_maxbytes=1MB stdout_logfile_backups=10 stdout_capture_maxbytes=1MB redirect_stderr=true user = relaysrv EOF #启动supervisor supervisord #查看日志 supervisorctl tail -f relaysrv stdout
大概是这样滴
PS.用的人不少,我这篇文章写完放了几天流量跑了相当多……
至于如何在私有模式下使用,你可以看到输出的截图里面有一串类似如下的地址
relay://<host name|IP>[:port]/?id=<relay device ID>
当然这儿是0.0.0.0,你把这个改成你的域名或者IP然后就可以在你的Syncthing里面指定Relay服务器了,改完后地址类似如下
relay://private-relay-1.example.com:443/?id=ITZRNXE-YNROGBZ-HXTH5P7-VK5NYE5-QHRQGE2-7JQ6VNJ-KZUEDIU-5PPR5AM
当然,为了保证能够正常使用,请防火墙开放如下两个端口
数据端口: 22067/tcp 能被 -listen 覆盖指定,并且会被 -ext-address 上报
状态端口: 22070/tcp 能被 -status-srv 覆盖指定
iptables命令如下,其他的自己研究
iptables -I INPUT -p tcp --dport 22067 -j ACCEPT iptables -I INPUT -p tcp --dport 22070 -j ACCEPT
更多内容可以参考下GitHub上的ReadMe说明和上面提到的官方文档 GitHub——>传送门
文章评论
如何让relay device ID保持不变呢 ,不管部署到哪一台机器上
@叶子 做不到吧,这个应该是唯一的编号,就是为了让Relay Pool或者其他的客户端能够通过这个编号定位到Relay服务器。我觉得你大概是希望给自己部署多台Relay服务器来使用?有两个方法,一是你可以试试在Syncthing的客户端设置中能否指定多个Relay,这个应该是可以的。二是自己部署一个Relay Pool啥的,然后把所有的Relay服务器都注册到自己的Relay Pool中。
太感谢啦,谢谢您的及时回复!
我是单位和家里的电脑,win系统,都不是直连公网(你懂的),两台设备都能相互发现,有时同步速度还行3MB/s,不过问题是,经常很慢,有时放一天都不同步(界面能显示文件差异和需同步的大小),不知道建立发现或者中继服务器能否解决,还有这种单位和家里两个不同网络下,可否建立在其中一个电脑上?
@wdswu 你这种情况我建议使用zerotier把单位和家里做成一个局域网来使用
是建在VPS上吗?博主用哪家VPS?有好用的推荐一下
@drydiy 我是放在自己OVH服务器开的VPS上的,如果你需要搭建这个并公开使用需要你的VPS流量比较多点,不然很容易用完。至于VPS的话我用过的很多,不过一直懒得写那种推荐文,你需要推荐的话可以看看网站左侧友链里的Leonn的博客,他那边介绍的比较多
虽然看不懂,但是,大佬,换友链吗?
@365cent 可以啊
咨询一下?
@星痕 有什么问题吗?
Relay服务器 怎么使用?填写在哪里?最新版的里面没找到中继这一项
@acai 找高级设置里面,应该是有的,如果是公开的中继服务器的话不需要你指定
@Senra 可以确定的是1.2版本里面已经没有relays的链接了,只有个relays enable 的选项开关
电脑没有外网怎么安装报错了呢?网站web也出不来。
@link 没问题啊,因为这玩意需要连public pool来获取用于同步的中继服务器。如果你局域网用不连互联网的话需要配完整的一套
如果我在局域网,所有电脑不连外网,需要再弄个Discovery 服务器?
supervisor 的作用是什么?
@tiandiyiqi 这种情况下是需要,当然你也可以在Syncthing的高级设置里面直接指定中继服务器,这样就不需要了。Supervisor仅仅是用于保持程序在后台运行并实现管理和自动重启的。
小白可以用微力同步verysync,这个比较简单一点。速度还可以。
家里有公网IP,做中心,手机电脑等做客户端。DSM安装syncthing后运行似乎不太稳定,同步会中断,或者连接不上而且syncthing还出现自动关闭的情况(原谅我还没找到自动启动)。在这种手机等没有公网IP的情况下需要在DSM上建中继服务器吗?速度是不是应该达到家里的实际网速(不考虑上传)?另外请教如何对所有同步文件排除某个文件夹(比如群晖的@eaDir)
@CCM syncthing自动关闭需要考虑使用能够自动重启的程序来监控Syncthing,另外你这种情况可能不需要中继,因为一般情况下国内的情况可能是不能达到实际上传网速的(DSM安装Syncthing的情况下你同步消耗的是你的上传带宽),这种情况下你可能需要自己去文章内的中继服务器列表找个接近大陆并且带宽比较大的中继然后在Syncthing的高级设置里配置上去
请问发现服务器和中继服务器的区别是什么?有一台公网IP可以搭建服务,另外的两个同步电脑都是没有公网IP的。
博主的文章还是蛮喜欢的,几个工具都有用过或者很可能需要用
好东东,请教下Syncthing目前IOS有没有可用的客户端
现在把客户端设置成“仅发送” 服务端设置成“仅接受”,但客户端删除文件服务端也会删除,请问如何设置可以让客户端删除文件而服务端不删除文件呢?
大佬,我们老师让用syncthing写一篇毕业设计论文,有什么好的提议吗?
内网计算机通过代理服务可上外网,固定内网IP,如何在其syncthing里设置代理服务器呢?
@007 有设置,参考 https://docs.syncthing.net/users/proxying.html