手把手教你用Go 1.21.5在Debian云服务器上编译Tailscale DERP中继(附自签名证书教程)

在分布式网络架构中,中继节点的部署往往是确保网络连通性的关键环节。Tailscale作为现代零信任网络的代表,其DERP(Detour Encrypted Routing for Packets)中继服务在NAT穿透失败时扮演着重要角色。本文将带您从源码开始,在Debian系统的云服务器上完成Tailscale DERP服务的完整编译与部署流程,特别针对Go 1.21.5版本环境进行优化,并涵盖自签名证书的生成与配置细节。

1. 环境准备与Go语言环境配置

在开始编译Tailscale DERP之前,我们需要确保基础环境配置正确。Debian系统以其稳定性和轻量级著称,非常适合作为中继服务器的操作系统。以下是详细的准备工作:

系统基础依赖安装

apt update && apt upgrade -y
apt install -y wget git openssl curl build-essential

对于Go语言环境的配置,Tailscale对Go版本有特定要求。我们选择Go 1.21.5版本进行安装,这是经过测试与Tailscale兼容性良好的版本:

wget https://go.dev/dl/go1.21.5.linux-amd64.tar.gz
rm -rf /usr/local/go && tar -C /usr/local -xzf go1.21.5.linux-amd64.tar.gz

配置Go环境变量是确保后续编译顺利的关键步骤。我们需要将Go二进制路径添加到系统PATH中:

echo "export PATH=$PATH:/usr/local/go/bin" >> /etc/profile
source /etc/profile

验证Go安装是否成功:

go version

预期输出应显示 go version go1.21.5 linux/amd64

提示:对于国内服务器,建议设置Go模块代理以加速依赖下载:

go env -w GO111MODULE=on
go env -w GOPROXY=https://goproxy.cn,direct

2. 获取与修改Tailscale DERP源码

Tailscale DERP服务的核心逻辑位于其开源代码库中。我们需要获取最新源码并进行必要的修改,特别是证书处理部分:

go install tailscale.com/cmd/derper@main

获取源码后,关键的证书处理逻辑位于 cert.go 文件中。默认情况下,Tailscale DERP会尝试自动获取Let's Encrypt证书,但在内网或测试环境中,我们需要修改这一行为:

  1. 定位cert.go文件路径:
find /root/go/pkg/mod -name "cert.go" | grep derper
  1. 修改证书逻辑以支持自签名证书:
// 修改cert.go中的证书获取逻辑
func getCert(hostname string) (*tls.Certificate, error) {
    // 替换为自签名证书加载逻辑
    cert, err := tls.LoadX509KeyPair("/etc/derp/cert.pem", "/etc/derp/key.pem")
    if err != nil {
        return nil, err
    }
    return &cert, nil
}

3. 编译与部署DERP服务

完成源码修改后,我们可以开始编译DERP服务。编译过程需要特别注意工作目录和输出路径:

cd $(go list -f '{{.Dir}}' tailscale.com/cmd/derper)
go build -o /usr/local/bin/derper

创建专用的系统服务来管理DERP进程,确保服务的高可用性和自动重启:

cat > /etc/systemd/system/derper.service <<EOF
[Unit]
Description=Tailscale DERP Server
After=network.target

[Service]
User=root
WorkingDirectory=/usr/local/bin
ExecStart=/usr/local/bin/derper \\
    -hostname derp.example.com \\
    -a :33445 \\
    -http-port 33446 \\
    -certmode manual \\
    -certdir /etc/derp
Restart=always
RestartSec=5

[Install]
WantedBy=multi-user.target
EOF

启用并启动服务:

systemctl daemon-reload
systemctl enable derper
systemctl start derper

4. 自签名证书生成与配置

在测试或内部环境中,使用自签名证书是常见做法。以下是生成自签名证书的详细步骤:

mkdir -p /etc/derp
openssl req -x509 -newkey rsa:4096 -sha256 -days 3650 -nodes \
    -keyout /etc/derp/key.pem \
    -out /etc/derp/cert.pem \
    -subj "/CN=derp.example.com" \
    -addext "subjectAltName=DNS:derp.example.com"

证书生成后,需要设置适当的权限:

chmod 600 /etc/derp/{key.pem,cert.pem}
chown -R root:root /etc/derp

验证证书是否被正确加载:

openssl x509 -in /etc/derp/cert.pem -noout -text | grep -A1 "Subject Alternative Name"

5. 网络配置与防火墙设置

确保服务器网络配置正确是DERP服务可用的前提。需要特别注意以下端口:

端口 协议 用途 是否必需
33445 TCP DERP服务端口
33446 TCP 管理界面端口 可选
3478 UDP STUN服务端口 推荐

配置防火墙规则(以UFW为例):

ufw allow 33445/tcp
ufw allow 3478/udp
ufw reload

对于云服务器,还需要在云服务商的安全组中开放相应端口。不同云服务商的配置方式略有差异,但基本流程相似:

  1. 登录云服务商控制台
  2. 找到安全组/防火墙设置
  3. 添加入站规则,允许TCP 33445和UDP 3478
  4. 应用规则到当前服务器实例

6. Tailscale ACL配置与集成

为了使Tailscale网络能够识别和使用我们部署的DERP服务器,需要在Tailscale ACL配置中添加相应信息:

"derpMap": {
    "OmitDefaultRegions": true,
    "Regions": {
        "901": {
            "RegionID": 901,
            "RegionCode": "myderp",
            "RegionName": "My Private DERP",
            "Nodes": [
                {
                    "Name": "901a",
                    "RegionID": 901,
                    "DERPPort": 33445,
                    "IPv4": "your.server.ip",
                    "InsecureForTests": true
                }
            ]
        }
    }
}

验证DERP服务器是否正常工作:

tailscale netcheck
tailscale status

如果遇到连接问题,可以尝试以下诊断步骤:

  1. 检查DERP服务日志:
journalctl -u derper -f
  1. 测试端口连通性:
telnet your.server.ip 33445
  1. 验证证书链:
openssl s_client -connect your.server.ip:33445 -showcerts

7. 高级配置与性能优化

对于生产环境部署,还需要考虑以下优化措施:

资源限制与监控

# 在systemd服务文件中添加资源限制
[Service]
MemoryLimit=512M
CPUQuota=80%

日志轮转配置

cat > /etc/logrotate.d/derper <<EOF
/var/log/derper.log {
    daily
    rotate 7
    missingok
    notifempty
    compress
    delaycompress
    sharedscripts
    postrotate
        systemctl restart derper
    endscript
}
EOF

性能调优参数

ExecStart=/usr/local/bin/derper \
    -hostname derp.example.com \
    -a :33445 \
    -http-port 33446 \
    -certmode manual \
    -certdir /etc/derp \
    -stun-port 3478 \
    -stun-ip your.server.ip \
    -verify-clients

在实际部署中,根据网络环境和负载情况,可能需要调整以下参数:

  • -stun-port : 指定STUN服务端口
  • -stun-ip : 显式声明服务器公网IP
  • -verify-clients : 开启客户端验证,防止滥用
  • -bw-duration : 带宽测试持续时间
  • -mesh-psk-file : 设置预共享密钥文件路径

8. 安全加固与防滥用措施

为防止未经授权的使用,我们可以实施以下安全措施:

启用Tailscale验证

  1. 在服务器上安装Tailscale客户端:
curl -fsSL https://tailscale.com/install.sh | sh
  1. 登录Tailscale网络:
tailscale up
  1. 修改DERP服务配置,添加验证参数:
ExecStart=/usr/local/bin/derper \
    -verify-clients \
    -mesh-psk-file=/etc/derp/mesh.psk

生成Mesh预共享密钥

openssl rand -base64 32 > /etc/derp/mesh.psk
chmod 600 /etc/derp/mesh.psk

配置ACL限制 : 在Tailscale ACL中添加针对DERP服务器的访问控制:

"acls": [
    {
        "action": "accept",
        "src": ["autogroup:members"],
        "dst": ["derp-server:33445"]
    }
]

定期轮换证书 : 设置cron任务自动更新证书:

0 3 1 * * /usr/bin/openssl req -x509 -newkey rsa:4096 -sha256 -days 30 -nodes -keyout /etc/derp/key.pem -out /etc/derp/cert.pem -subj "/CN=derp.example.com" -addext "subjectAltName=DNS:derp.example.com" && systemctl restart derper

更多推荐