手把手教你用Go 1.21.5在Debian云服务器上编译Tailscale DERP中继(附自签名证书教程)
手把手教你用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证书,但在内网或测试环境中,我们需要修改这一行为:
- 定位cert.go文件路径:
find /root/go/pkg/mod -name "cert.go" | grep derper
- 修改证书逻辑以支持自签名证书:
// 修改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
对于云服务器,还需要在云服务商的安全组中开放相应端口。不同云服务商的配置方式略有差异,但基本流程相似:
- 登录云服务商控制台
- 找到安全组/防火墙设置
- 添加入站规则,允许TCP 33445和UDP 3478
- 应用规则到当前服务器实例
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
如果遇到连接问题,可以尝试以下诊断步骤:
- 检查DERP服务日志:
journalctl -u derper -f
- 测试端口连通性:
telnet your.server.ip 33445
- 验证证书链:
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验证 :
- 在服务器上安装Tailscale客户端:
curl -fsSL https://tailscale.com/install.sh | sh
- 登录Tailscale网络:
tailscale up
- 修改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
更多推荐
所有评论(0)