zixiba

zixiba

自建 Tailscale DERP 中繼伺服器 海外版

原文地址:大內網戰略 (6.5):自建 Tailscale DERP 中繼伺服器 海外版
大內網戰略 (6):自建 Tailscale DERP 中繼伺服器 保姆級教程
作者:涼拖撈佬 Pro

先決條件#

  • 有一台在海外的 VPS(我用的是在 RackNerd 購買的乞丐版 VPS)。
  • 已經購買了域名(建議在 namesilo 購買會比較便宜),並且 DNS 解析到了 cloudflare 上。
  • 域名解析到了 VPS 上。不一定要是二級域名(http://xxx.com),可以是三級域名(http://yyy.xxx.com)。
  • 有基礎的 linux 操作知識。
    注意:Cloudflare 域名解析不要開啟代理。如下圖:

image

防火牆設置#

首先需要永久放行端口:TCP 56473(可以自己隨意修改成自己想要的) 和 UDP 3478(不要修改),並且暫時關閉防火牆(acme 申請 SSL 證書完成後再開回來)。

Linux 常用的防火牆可能有:iptables、UFW 和 VPS 提供的網路安全組,按照自己的情況放行,這裡就沒有教程了。

申請 SSL 證書#

逐步輸入以下命令申請 SSL 證書,三種申請證書的方式任選其一,申請失敗則更換方式 。用你的域名替換掉命令中的 <你的域名> 字樣。

如果你的 VPS 上面跑了 nginx 或者 apache,你需要將命令裡面的 --standalone 改為 --nginx 或者 --apache ,或者暫時停止這兩個服務。

sudo -i

curl https://get.acme.sh | sh; apt install socat -y || yum install socat -y; ~/.acme.sh/acme.sh --set-default-ca --server letsencrypt

#三種方式任選其中一種,申請失敗則更換方式 
#申請證書方式1: 
~/.acme.sh/acme.sh --issue -d <你的域名> --standalone -k ec-256 --force --insecure 
#申請證書方式2: 
~/.acme.sh/acme.sh --register-account -m "${RANDOM}@chacuo.net" --server buypass --force --insecure && ~/.acme.sh/acme.sh --issue -d <你的域名> --standalone -k ec-256 --force --insecure --server buypass 
#申請證書方式3: 
~/.acme.sh/acme.sh --register-account -m "${RANDOM}@chacuo.net" --server zerossl --force --insecure && ~/.acme.sh/acme.sh --issue -d <你的域名> --standalone -k ec-256 --force --insecure --server zerossl 

導出證書:

sudo mkdir /usr/local/cert

~/.acme.sh/acme.sh --install-cert -d <你的域名> --ecc --key-file /usr/local/cert/<你的域名>.key --fullchain-file /usr/local/cert/<你的域名>.crt

安裝 Tailscale#

curl -fsSL https://tailscale.com/install.sh | sh

輸入 tailscale up,把彈出的网址複製到瀏覽器中進行授權。

安裝 Golang#

卸載舊版本#

如果你的伺服器上有其他軟體依賴舊版本的 go,將其升級為新版本可能會發生不可預料的後果,請務必仔細評估與衡量。

舊版本 golang 會極大概率導致 derp 安裝失敗。如果你運行 go version 顯示的是舊版本:

image
那就要卸載重安;如果顯示命令不存在或者是最新版本(怎麼看在後面),就可以忽略這步。

卸載:rm -rf /usr/local/go
最好重新啟動伺服器。

查看最新版本#

打開網址 https://go.dev/doc/install
下面截圖裡顯示最新版本是 1.21.1

image

下載最新版本#

wget https://go.dev/dl/go<最新版本號>.linux-amd64.tar.gz  
tar -C /usr/local -xzf go<最新版本號>.linux-amd64.tar.gz  

輸入vim /etc/profile 並回車,填入以下命令到末尾然後保存並退出:

export GOROOT=/usr/local/go  
export GOPATH=/usr/local/gopath  
export GOBIN=$GOPATH/bin  
export PATH=$PATH:$GOROOT/bin  
export PATH=$PATH:$GOPATH/bin  

輸入source /etc/profile ,然後輸入 go version 檢查有無安裝 go 語言成功。

安裝 derper 服務#

建立目錄:sudo mkdir -p /usr/local/gopath/bin

安裝:

go env -w GOPROXY=https://goproxy.cn,direct  
go install tailscale.com/cmd/derper@main  

vim /usr/local/gopath/bin/runderper 輸入並保存以下內容:(56473 端口修改的記得在這裡修改)

#!/bin/sh  
cd /usr/local/gopath/bin  
nohup ./derper -hostname <你的域名> -c=derper.conf -a :56473 -http-port -1 -certdir /usr/local/cert -certmode manual -verify-clients -stun > console.log 2>&1 &  
echo $! > app.pid  

vim /usr/local/gopath/bin/stopderper.sh 輸入並保存以下內容:

#!/bin/sh  
kill `cat app.pid`  
rm -rf app.pid  

賦權:

chmod +x /usr/local/gopath/bin/runderper  
chmod +x /usr/local/gopath/bin/stopderper.sh  

輸入 vim /etc/systemd/system/derper.service,輸入並保存以下內容:

Description=derper服務  
After=network.target  

[Service]  
Type=forking  
ExecStart=/usr/local/gopath/bin/runderper  
ExecStop=/usr/local/gopath/bin/stopderper.sh  

[Install]  
WantedBy=multi-user.target  

啟動服務#

設置開機啟動

systemctl start derper  
systemctl enable derper  

然後打開網址 https://<你的域名>:56473/,出現以下頁面就是部署成功。

image

添加中繼節點#

回到 Tailscale 網頁控制台, 打開 Access Controls,添加下面代碼在ssh前面:

"derpMap": {  
		// OmitDefaultRegions 用來忽略官方的中繼節點,一般自建後就看不上官方小水管了  
		"OmitDefaultRegions": true,  
		"Regions": {  
			// 這裡的 901 從 900 開始隨便取數字  
			"901": {  
				// RegionID 和上面的相等  
				"RegionID": 901,  
				// RegionCode 自己取個易於自己名字  
				"RegionCode": "RackNerd",  
				"Nodes": [  
					{  
						// Name 保持 1不動  
						"Name":     "1",  
						// 這個也和 RegionID 一樣  
						"RegionID": 901,  
						// 域名  
						"HostName": "<你的域名>",  
						// 端口號  
						"DERPPort": 56473,  
					},  
				],  
			},  
			// 多個伺服器添加在下面  
			"902": {  
				// RegionID 和上面的相等  
				"RegionID": 902,  
				// RegionCode 自己取個易於自己名字  
				"RegionCode": "xxxx",  
				"Nodes": [  
					{  
						// Name 好像可以改成2我也不是很懂  
						"Name":     "2",  
						// 這個也和 RegionID 一樣  
						"RegionID": 902,  
						// 域名  
						"HostName": "<你的域名>",  
						// 端口號  
						"DERPPort": 56473,  
					},  
				],  
			},  
            // 多個伺服器添加在上面  
		},  
	},  

不要忘記保存

查看連接節點#

在連接設備的 CMD 中輸入tailscale netcheck查看連接節
點和延遲。
image

載入中......
此文章數據所有權由區塊鏈加密技術和智能合約保障僅歸創作者所有。