自建Tailscale DERP服务

背景及准备工作

背景:懂得都懂。

  • 一台 1C1G 以上配置的服务器
  • 服务器能开放stun的端口 UDP/3478
  • 一个域名
  • (可选)SSL证书
  • 防火墙放行端口
    • iptables/nftables和服务器安全组都要放行以下端口:
    • UDP/3478
    • TCP/ - 请改为一个你需要的端口

安装Tailscale客户端(提供客户端鉴权)

如果你要搭建的是公共的Tailscale DERP服务,不需要鉴权,这一步可以跳过
curl -fsSL https://tailscale.com/install.sh | sh

安装Golang

请确保不存在旧版Golang

查看最新版本
前往Golang官网查看最新版本号
https://go.dev/doc/install

查看服务器架构
使用 uname 查询架构:

uname -m

安装

下载最新版Golang

    wget https://go.dev/dl/go<LATEST>.linux-<ARCH>.tar.gz

解压

sudo tar -C /usr/local -xzf $HOME/go*.tar.gz

添加环境变量

在你的 /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

安装Derper

mkdir -p /opt
mkdir -p /opt/derper
mkdir -p /usr/local/gopath/bin
# 如果你的服务器在境内,可以为Go配置代理加速
#go env -w GOPROXY=https://goproxy.cn,direct
go install tailscale.com/cmd/derper@main

启停脚本

创建启动脚本

新建 /opt/derper/runderper 文件
如果你需要SSL,把SSL证书上传到 /usr/local/cert 文件夹
证书命名格式为

<DOMAIN>.<SUFFIX>

其实就是你发布这个服务的域名名称

将证书文件后缀改为 crt ,密钥文件后缀改为 key

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

如果你不需要SSL,直接写入以下内容

#!/bin/sh
cd /usr/local/gopath/bin
nohup ./derper -hostname <DOMAIN> -c=derper.conf -a :<PORT> manual -verify-clients -stun > console.log 2>&1 &
echo $! > app.pid
如为公共服务,请去掉 -verify-clients 参数

创建停止脚本

新建 /opt/derper/stopderper 文件

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

赋予执行权限

chmod +x /opt/derper/*
#chmod +x /opt/derper/runderper
#chmod +x /opt/derper/stopderper

创建服务

新建 /etc/systemd/system/derper.service 文件

[Unit]
Description=Derper服务
After=network.target
 
[Service]
Type=forking
ExecStart=/opt/derper/runderper
ExecStop=/opt/derper/stopderper
 
[Install]
WantedBy=multi-user.target

设置开机自启并立即启动

systemctl enable --now derper.service

添加到Tailscale

在你的Tailscale管理界面找到 Access Controls (点我直达 )
在其中插入片段,示例如下

{
    "acls": [
    // ...
    ],
    "ssh": [
        // ...
    ],
    // ...
    "derpMap": {
        "Regions": {
            "900": {
                "RegionID":   900, // 900以上
                "RegionCode": "cni-bj", // 区域代码,会在 `tailscale netcheck` 显示
                "RegionName": "中国-北京", // 区域名称,会在 `tailscale netcheck` 显示
                "Nodes": [
                    {
                        "Name":     "1",
                        "RegionID": 900, // 对应上方ID
                        "HostName": "xxxxx.xxx", // 填写你的DERP服务域名
                        "DERPPort": 12345, // 你的DERP服务端口
                    },
                ],
            },
            // 更多DERP节点
        },
    },
    // ...
}

使用 tailscale netcheck 检查,发现多出自建DERP,成功