自建tailscale derp中转服务器

文章转载

浅探 Tailscale DERP 中转服务 | Kiprey's Blog
本篇主要是记录一下配置 derp 的过程，基本上所有的内容都是来源于上面的文章，有需要的可以直接查阅上面的文章，写的非常好，过程剖析的很到位，吾辈楷模！

配置要求

公网 ip

允许 tcp/udp 进站

配置 Drep 服务器

安装 golang

Copy
# 需要最新版的golang
$ wget https://go.dev/dl/go1.21.6.linux-amd64.tar.gz
$ sudo rm -rf /usr/local/go && sudo tar -C /usr/local -xzf go1.21.6.linux-amd64.tar.gz
$ export PATH=$PATH:/usr/local/go/bin

# 验证安装版本
$ go version
# 配置代理以便于国内vps下载,国外vps不需要配置
$ go env -w GOPROXY=https://goproxy.cn,direct

# 安装tailscale-dreper
$ go install tailscale.com/cmd/derper@latest

配置 Derp 服务并用 systemd 管理

Copy
# 配置环境变量
$ DERP_HOST="dawnz-derp" #这个名字随意，但需要记住后面自签名证书和drepMap需要用
$ DERP_PORT=8888
$ STUN_PORT=8889

# 自签名证书
$ mkdir ~/.certdir && cd ~/.certdir
$ openssl genpkey -algorithm RSA -out ${DERP_HOST}.key
$ openssl req -new -key ${DERP_HOST}.key -out ${DERP_HOST}.csr
$ openssl x509 -req \
-days 36500 \
-in ${DERP_HOST}.csr \
-signkey ${DERP_HOST}.key \
-out ${DERP_HOST}.crt \
-extfile <(printf "subjectAltName=DNS:${DERP_HOST}")

# 用systemd service启动drep服务
## 1. 如果drep是公用的可以直接启动drep服务即可，但是这样如果别人知道你的ip和port，那么其他人也可以连接，使用你中转服务器的流量。
## 2. 如果配置drep为私有服务器，则需要把中转服务器也作为一个节点，安装tailscaled登录认证，并在启用drep服务时使用 --verify-clients

# 安装tailscaled 并登录验证
$ curl -fsSL https://tailscale.com/install.sh | sh
$ sudo tailscale up

# 创建tailscale-derp.service
$ sudo systemctl edit -f tailscale-derp.service
# 粘贴如下内容
-----------
[Unit]
Description=Tailscale derp service
After=network.target

[Service]
ExecStart=/home/${USER}/go/bin/derper \
-c /home/${USER}/.derper.key \
-a :${DERP_PORT} -http-port -1 \
-stun-port ${STUN_PORT} \
-hostname ${DERP_HOST} \
--certmode manual \
-certdir /home/${USER}/.certdir \
--verify-clients
Restart=always
User=${USER}

[Install]
WantedBy=multi-user.target"
------------

# 启动服务
$ sudo systemctl start tailscale-derp.service
# 查看状态
$ sudo systemctl status tailscale-derp.service
# 开机自启动
$ sudo systemctl enable tailscale-derp.service

配置 iptables 允许端口流量入站并配置安全组

Copy
# iptables 配置8888/tcp，8889/udp允许入站
$ sudo iptables -A INPUT -p tcp --dport 8888 -j ACCEPT
$ sudo iptables -A INPUT -p udp --dport 8888 -j ACCEPT

# 有些云服务商需要配置安全组，在网页控制台安全组也要配置这两个入站。

配置 ACL

Tailscale登录管理控制台，选择Access Controls

添加单个中转服务器
注意：HostName 配置和上面的 DERP_HOST 配置的要相同

Copy
...
{
...
"acls": [...],
...
"ssh": [...],
...
"derpMap": {
"Regions": {
"900": {
"RegionID": 900,
"RegionCode": "Dawnz1",
"Nodes": [
{
"Name": "dawnz-derp1",
"RegionID": 900,
"HostName": "dawnz-derp",
"IPv4": "xx.xx.xx.xx",
"DERPPort": 8888,
"STUNPort": 8889,
"InsecureForTests": true,
},
],
},
},
},
...
}

添加多个中转服务器

Copy
...
{
...
"acls": [...],
...
"ssh": [...],
...
"derpMap": {
"OmitDefaultRegions": false,
"Regions": {
"900": {
"RegionID": 900,
"RegionCode": "Dawnz1",
"Nodes": [
{
"Name": "dawnz-derp1",
"RegionID": 900,
"HostName": "dawnz-derp",
"IPv4": "xx.xx.xx.xx",
"DERPPort": 8888,
"STUNPort": 8889,
"InsecureForTests": true,
},
],
},
"901": {
"RegionID": 901,
"RegionCode": "Dawnz2",
"Nodes": [
{
"Name": "Dawnz-derp2",
"RegionID": 901,
"HostName": "danwz-derp2",
"IPv4": "xx.xx.xx.xx",
"DERPPort": 8888,
"STUNPort": 8889,
"InsecureForTests": true,
},
],
},
},
},
...
}

检查中转服务器的状态

任意一台节点上利用$ tailscale netcheck 命令即可查看 derp 上线情况，有看到延迟即配置完成。

因为公用服务器延迟很大，我不想用公用服务器，可以配置"OmitDefaultRegions": true, 看上节的多个 derp 配置即可

Enjoy!

tailscale 的组网能力是真的可以呀，各方面都非常的完全和健壮，免费基本够个人使用了，非常的 Nice！
唯一的问题是我用电信 5g 的手机打洞回家 600m 的联通宽带，测速的上限一直是 50m 的带宽，不知道是不是 udp 限制了，不过也足够使用了。