因為tailscale在國內沒有官方的中繼伺服器(原因你懂的),所以雖然基本上還是可以使用(用國外的中繼),但是延遲顯示卻非常高,而且從心底來講,公用中繼伺服器讓人不爽(內褲大家一起穿?)。想要低延遲、想要專用的中繼伺服器怎麼辦?只能自己動手搭了,如果家庭寬頻有公網IP位址,或是有現成的雲端主機,那麼你就可以有屬於你自己的DERP伺服器了。
1.安裝最新版本的go
因為DERP是go開發的,所以需要先安裝go的環境。
先依照自己的系統下載對應的下載包,go的官網連結為:https://go.dev/dl/
官網有不同的系統安裝包,因為我的輕量級伺服器是debian 11:
所以下載紅框中的go1.21.2.linux-amd64.tar.gz這個包,並上傳到了root目錄中,進入root目錄,然後運行以下命令(需要以root 身份登入或透過sudo 運行該命令):
rm -rf /usr/local/go && tar -C /usr/local -xzf go1.21.2.linux-amd64.tar.gz
使用rm -rf /usr/local/go
是為了刪除先前版本的go,如果以前沒有安裝過go,可以不用rm指令。然後tar指令將go1.21.2.linux-amd64.tar.gz這個壓縮包解壓縮到了/usr/local/go目錄下,如下:
在PATH 環境變數中加入go的路徑
/usr/local/go/bin
,以便能運行go命令:
export PATH=$PATH:/usr/local/go/bin
注意:該方式只是在當前環境臨時添加環境變量,如果要開機自動添加,則需要編輯~/.bashrc
文件並將上述環境變數新增至文件最後一行並儲存退出。
開啟命令提示字元並鍵入以下命令,確認是否已安裝Go:
go version
確認指令正確列印了Go 的安裝版本:
2、安裝DERP server
執行以下命令將最新的DERP 伺服器安裝到$HOME/go/bin:
go install tailscale.com/cmd/derper@main
但遇到報錯:
直接訪問上圖中的url,得到以下結果:
172.217.160.113應該是google cdn的ip位址,這表示無法存取(原因你懂的),這時候需要暫時加上一個goproxy:
export GOPROXY=https://goproxy.io
或者:
export GOPROXY=https://goproxy.cn
再次運行命令,成功:
在運行二進位檔案之前,您需要一個指向伺服器的網域名稱。有了網域和二進位文件,就可以在你的網域上運行DERP 伺服器了。
這時候,如果你有一個沒有佔用的443埠和80埠的雲端伺服器,就可以直接執行以下指令啟動derper:
sudo /root/go/bin/derper -c=/root/derper.conf -hostname=ab.cd.ef -a=:443 -stun
-hostname:有效的公網域名,derper 會自動申請這個域名let's encrypt 證書
-a:指定derper 監聽的tcp 端口,預設為443(如果要使用443端口,網域需要備案),可以指定其他非443端口(網域不需要備案)
-stun:stun 協定的udp 端口,health check 的時候會用到,預設3478
這將啟動DERP 伺服器,其連接埠為443(或您指定的監聽連接埠),然後,就可以按照步驟3的操作將DERP 伺服器新增至你的tailsacle網路。
關於443端口的問題:如果要使用443端口,則域名一定要備案,不然雲供應商會根據TLS handshake裡的SNI信息取得你的域名之後和備案數據庫比對,如果不在其庫中就會reset你的TLS握手,所以我推薦不要使用443埠。我在家裡也部署了一個DERP,沒有80和443端口一樣正常工作,只是這種方式就不能使用let's encrypt自動更新證書(必須要443端口),而且必須手動指定證書資料夾(其實這個也不是很所謂,阿里雲和騰訊雲都提供免費的1年證書,1年折騰一次,分分鐘的事情,也還可以接受)。
有了443端口並且域名備了案只是大前提,如果雲主機已經用nginx(也有可能是Apache,這個更麻煩)部署了站點佔用了443端口,則需要nginx上使用steam進行4層反向代理( TLS工作在傳輸層),這樣DERP的443才能和其他站點共存,如果nginx安裝的時候沒有載入steam相關的模組,又需要重新編譯。 。反正就是折騰,我比較懶,想想還是算了,如果是個全新的雲端伺服器倒是可以一開始就規劃好,但是現在雲端主機上也跑了一堆應用,就懶得弄了,如果有這個需要(主要是使用let's encrypt自動更新證書時間,這樣不需要每年去手動更新有效期只有1年的免費證書)大家可以自行研究下,我在本文中就以非443端口來部署了。
這種方式也適合有公網IP位址的家庭寬頻,當然最好同時有公網IPv4和IPv6,這樣適用性更廣(對單v4、單v6以及雙堆疊用戶端都能派上用場)。如果同時有v4和v6公網IP且想充分發揮作用,則需要在網域供應商同時新增A記錄和AAAA記錄指向DERP使用的網域。
請事先準備好DERP使用的域名解析以及該域名對應的證書(如果購買了阿里雲或騰訊雲的域名,可以方便的白嫖1年期免費證書)。
所以在不使用443埠和80埠的情況下指令格式如下:
sudo /root/go/bin/derper -c=/root/derper.conf -hostname=ab.cd.ef -a=:45678 -http-port -1 -stun -certmode=manual -certdir=xxx
-a=:45678 修改監聽埠為45678(這個大家依照自己環境進行修改)
-http-port -1 不使用http 80埠
-certmode manual 表示手動指定證書
-certdir yourcertpath 指定你憑證的存放目錄的路徑,並且其中的憑證命名一定不能錯,假如你的網域是example.com,則憑證名稱必須是example.com.crt,私鑰名稱必須是example.com. key
-verify-clients 如果你要確保這個DERP伺服器只有你一個人能訪問,並且在安裝DERP伺服器的雲端主機上也安裝了tailscale客戶端並正常登入了你的帳號,則加上這個參數就行了。如果除了自己還要給其他朋友使用,則不能加入這個參數,不過,如果是雲端主機,有固定公網IP,還是要小心一點。
命令運行成功以後,可以使用https://ab.cd.ef:45678進行訪問,成功的話顯示如下:
如果要設定DERP開機啟動,詳見另一篇文章:debian系列設定指令或腳本開機啟動的3種常見方式
注意:為了與Tailscale 用戶端更新保持相容,最好需要定期更新DERP 伺服器,方法是重新執行前面的安裝命令: go install tailscale.com/cmd/derper@main
。
3.添加DERP伺服器到你的tailscale網絡
每個區域都有一個唯一的區域ID。區域ID 值900-999 保留給使用者指定的自訂區域使用,Tailscale 本身不會使用。
例如,以下配置將啟用網域名稱為 example.com 的自訂DERP 伺服器:
{ // ... other parts of ACL/Policy JSON "derpMap": { "Regions": { "900": { "RegionID": 900, "RegionCode": "myderp", "Nodes": [ { "Name ": "1", "RegionID": 900, "HostName": "example.com", "DERPPort": 45678, } ] } } } }
在上面的程式碼中,其實主要就是下圖中的紅框部分內容,複製到官網tailscale admin的Access Controls裡,注意是在最後一個”}」之前:
修改的時候注意格式,主要是行最後的”,”。
在上面的配置中,真正必須要修改的只有”HostName”和”DERPPort”(如果只有這一個RegionID的話),前者是你的域名,後者是前面derp伺服器指定的監聽端口,還有一個默認的stun udp 3478,這2個連接埠都需要在你的雲端主機的防火牆上打開。
在安裝了tailscale的終端機上(linux或win)上執行指令查看所使用的derp情況:
tailscale netcheck
顯示如下:
這裡顯示的就是上面程式碼中你自己定義的」RegionCode」名稱,我這裡因為有2個DERP伺服器,一個是騰訊雲端上的輕量級伺服器,一個是家寬中的macmini。不過這裡的檢測其實只是檢測udp 3478端口,這個顯示可用也未必真可用,最後還是要DERP監聽的https端口可用才行(文章前面提到的用瀏覽器能正常打開https://網域:自訂端口
)。
也可以在tailscale的官網Machine Details中查看,如下,可以看到使用的Region ID(上面程式碼中定義的):
如果有多個DERP伺服器,可以用多個Region的方式進行添加,進行備份,例如我添加了2個區域,ID是900和901:
則在Machine Details裡顯示如下:
另外介紹幾個常用的tailsacle終端機指令:
tailscale status #查看tailscale終端之間的連接狀態:在線或離線,直接連接direct或是透過relay以及透過哪個relay
tailscale ping #可以直接看到是否是透過DERP以及透過哪個DERP伺服器連接
這裡其實還可以拓展一下,如何監測DERP伺服器的健康性的問題?最簡單的方法就是監控https://DERP網域:指定連接埠
的鏈接,具體可以參看我的另一篇文章:docker系列搭建基於uptime和bark的應用即時健康監測及警報系統
另:我在家的DERP是用macos搭建的,配置過程和debian大同小異,並且是在軟路由之後做的映射,所以搭建DERP也可以在內網通過出口設備上的公網IP映射來做(映射udp 3748和指定的TCP監聽埠進來即可,並且映射的內外網埠要一致),不一定要直接搭建在有公網IP的雲端主機上,動態網域最好支援API的更新方式,畢竟騰訊雲和阿里雲的免費1年證書還是很香的。