一.介紹
我以前介紹了Syncthing,做爲一款開源的文件同步程序,它的功能仍是很是強大的,我也很高興能看到它被愈來愈多的人知道和使用,前幾天有位朋友留言說讓我介紹下Syncthing的中繼服務器的搭建,在這以前的一段時間我在網上偶爾看到過有朋友介紹過一次。python
首先來科普一下? 不一樣於Resilio Sync(BT Sync)使用BT協議進行數據傳輸,Syncthing使用了BEP對等自由塊交換協議(Block Exchange Protocol),這兩個卻是沒啥優劣的問題,主要是BT Sync在老版本的時候支持DHT,然後來刪掉了,這也是致使它的官方服務器在被幹擾以後幾乎徹底沒法使用的緣由之一,因此當初有人說老版本(支持DHT)的依舊可以使用。而Syncthing不同的是它沒有使用DHT,可是也沒有像BT Sync同樣只有官方服務器(通告+中繼服務器),因爲開源,因此Syncthing的服務器都是能夠本身部署的,這也就是說,即便官方的服務器出了問題,也可以隨時有服務器去代替它。linux
那麼爲何要有這兩種服務器呢? 這主要是由於P2P的原理,通告(Announcement)/發現(Discovery)服務器用於發現和索引用戶,就和你BT的Tracker(這個其實也是通告服務器)同樣,你接入了就等於在裏面掛了名,而後服務器會把其餘人告訴你,這樣大家纔可以連上。這個是公網IP的狀況,若是沒有公網IP呢?這就要輪到中繼(Relay)服務器出手了,要麼是輔助實現打洞,要麼是轉爲C/S模式。總之,中繼服務器就是爲了在特殊網絡環境下(可是在國內不少家庭寬帶就是這樣的)的正常使用而存在的。git
咱們本次就不說通告服務器(Syncthing官方實際上是叫作Global Discovery服務器的),由於目前官方的服務器還正常運做,不過感興趣的或者想創建企業內部的本地Discovery服務器能夠本身研究下github
PS.以前寫的Syncthing的搭建和使用——>傳送門sublime-text
二.安裝
好了,讓咱們開始嘗試下搭建安全
首先,你得先確認一點,你搭建的中繼服務器是私人(Private)用途的仍是公開(Public)的,由於公開的話就會自動加入Syncthing官方的Relay服務器池中,供其餘人使用,這樣會致使你的流量消耗變大,因此請想好,而且也會在官方的Relay服務器列表中顯示服務器
Relay服務器列表——>傳送門網絡
若是下面沒顯示出狀態請在地址欄右側點擊容許加載不安全的腳本,由於會從各個服務器上拉取狀態,這個是HTTP的,默認會被HTTPS頁面禁用
首先來說一下參數,而後根據你的需求在下面supervisor的配置裏面修改
參考了官方文檔進行翻譯——>傳送門
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
-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
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
|
#獲取程序並解壓
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 http://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.用的人很多,我這篇文章寫完放了幾天流量跑了至關多……
至於如何在私有模式下使用,你能夠看到輸出的截圖裏面有一串相似以下的地址
1
|
relay://<host name|IP>[:port]/?id=<relay device ID>
|
固然這兒是0.0.0.0,你把這個改爲你的域名或者IP而後就能夠在你的Syncthing裏面指定Relay服務器了,改完後地址相似以下
1
|
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命令以下,其餘的本身研究
1
2
|
iptables -I INPUT -p tcp --dport 22067 -j ACCEPT
iptables -I INPUT -p tcp --dport 22070 -j ACCEPT
|
更多內容能夠參考下GitHub上的ReadMe說明和上面提到的官方文檔 GitHub——>傳送門