Tailscale 官方内置了很多 DERP 中继服务器,分步在全球各地,但不包含中国大陆,这就导致了流量通过 DERP 服务器进行中继时的延时较高。为了提升使用体验,我们可以参考 Tailscale 官方文档自建私有的 DERP 中继服务器。

01 在服务器中安装 Tailscale 客户端

根据官方教程,使用以下命令即可在 Linux 系统中安装 Tailscale 客户端:

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

安装成功后,使用命令tailscale up启动服务,第一次启动时需要根据提示访问指定网址以完成账户认证。

值得注意的是,如果使用的是阿里云的云服务器,或者其它使用100.64.0.0/10内网网段对内提供 DNS 等服务的机器,需要添加命令禁止 Tailscale 修改 iptables 规则,否则会因为两者使用的内网网段冲突,Tailscale 会添加规则把所有对外的 100.64.0.0/10 请求都 drop 掉,只允许走自己搭建的虚拟内网,导致一些服务出现故障。修改后的命令如下:

tailscale up --netfilter-mode=off --accept-dns=false

02 部署 DERP 中继服务

安装Golang:

# 更新软件源
apt update && apt upgrade

# 安装相关依赖
apt install -y wget git openssl curl

# 可打开https://go.dev/dl/查看最新版本
cd /root
wget https://go.dev/dl/go1.23.1.linux-amd64.tar.gz

# 解压
rm -rf /usr/local/go && tar -C /usr/local -xzf go1.23.1.linux-amd64.tar.gz

# 查看版本
export PATH=$PATH:/usr/local/go/bin
go version

# 添加环境变量
echo "export PATH=$PATH:/usr/local/go/bin" >> /etc/profile
source /etc/profile

# 让 Go 使用国内代理源(国外主机忽略)
go env -w GO111MODULE=on
go env -w GOPROXY=https://goproxy.cn,direct

部署 DERP 中继服务:

# 拉取并编译derper
go install tailscale.com/cmd/derper@main

# 进入到编译好的文件夹(不要直接复制命令,按实际情况填写)
cd /root/go/pkg/mod/tailscale.com@v1.75.0-xxxx/cmd/derper/

# 打开cert.go文件
vi cert.go

# 注释以下信息
func (m *manualCertManager) getCertificate(hi *tls.ClientHelloInfo) (*tls.Certificate, error) {
    // if hi.ServerName != m.hostname {
    //     return nil, fmt.Errorf("cert mismatch with hostname: %q", hi.ServerName)
    // }

# 编译并输出到/etc/derp/
go build -o /etc/derp/derper

# 查看是否存在derper文件
cd /root
ls /etc/derp

# 自签域名(derp.myself.com可随意编写,命令中四处需要一致)
openssl req -x509 -newkey rsa:4096 -sha256 -days 3650 -nodes -keyout /etc/derp/derp.myself.com.key -out /etc/derp/derp.myself.com.crt -subj "/CN=derp.myself.com" -addext "subjectAltName=DNS:derp.myself.com"

记得开放33445TCP 端口和3478UDP 端口~

之后设置开机自启,复制以下全部内容到命令行粘贴:

cat > /etc/systemd/system/derp.service <<EOF
[Unit]
Description=TS Derper
After=network.target
Wants=network.target
[Service]
User=root
Restart=always
ExecStart=/etc/derp/derper -hostname derp.myself.com -a :33445 -http-port 33446 -verify-clients -certmode manual -certdir /etc/derp
RestartPreventExitStatus=1
[Install]
WantedBy=multi-user.target
EOF

之后在终端依次执行systemctl enable derpsystemctl start derp以设置开机自启和启动服务。

那么现在,就可以进行测试啦——访问 https://ip:33445(例如:https://180.160.3.56:33445),如果出现如下页面,且地址栏的 SSL 证书标签显示正常可用,那就说明 Tailscale 的 DERP 中继服务部署成功啦!

DERP 中继服务部署成功

如果没有成功,请检查域名是否正确解析、是否为域名正确设置 SSL 证书以及端口347833445在安全组/防火墙中是否已经被放行等项目。

03 配置 Tailscale

进入 Tailscale 的 Access controls 页面来修改配置,将以下内容追加到原配置文件中并保存配置即可:

// Tailscale DERP
    "derpMap": {
        // OmitDefaultRegions 用来忽略官方的中继节点,一般自建后就看不上官方小水管了
        "OmitDefaultRegions": true,
        "Regions": {
            "901": {
                "RegionID":   901, // 901 三个地方保持一致,900开始,多个节点可以往后+1
                "RegionCode": "sh",
                "RegionName": "Shanghai",
                "Nodes": [
                    {
                        "Name":             "腾讯云-上海-1",
                        "RegionID":         901,
                        "IPv4":             "180.160.3.56", // 改成你的公网IP
                        "DERPPort":         33445,
                        "InsecureForTests": true,
                    },
                ],
            },
        },
    },

此后,我们可以在任意设备中通过终端命令来验证 DERP 中继服务的连接情况,例如,在 Linux 系统中可使用命令tailscale netcheck,可见,延迟真的非常非常低,只有7.4毫秒:

延迟仅有7.4毫秒

参考资料

[1] Tailscale DERP Server

[2] Tailscale DERP 中继节点搭建

[3] 使用Docker + Traefik + Derper 自建 Tailscale 中继服务器完整教程 (jungley.net)

[4] Tailscale 基础教程:部署私有 DERP 中继服务器 · 云原生实验室 (icloudnative.io)

[5] 搭建Tailscale中继节点|白嫖DERP中继节点|低调分享 - 爱墨迹 (imgki.com)

[6] 我的服务器系列:tailscale使用自定义derper服务器(docker部署) - 且炼时光 (always200.com)

最后修改:2024 年 09 月 28 日
如果觉得我的文章对你有用,请随意赞赏