【实战指南】Tailscale DERP中继节点自建:从零到一,无需公网IP与域名
1. 为什么需要自建DERP中继节点
Tailscale作为一款基于WireGuard的现代组网工具,最大的优势就是能够自动建立点对点连接。但在实际使用中,约30%的情况下会因为NAT类型限制、防火墙策略等因素导致直连失败。这时就需要DERP(Detour Encrypted Routing for Packets)中继服务器来兜底转发流量。
我去年在给团队搭建跨地区开发环境时就遇到过这个问题:上海和北京的同事经常出现连接不稳定,视频会议卡成PPT。后来排查发现是因为某些办公网络的Symmetric NAT(对称型NAT)导致打洞失败。自建DERP节点后,不仅解决了连接问题,还将跨国传输延迟从380ms降到了210ms。
传统方案需要公网IP和域名才能搭建中继服务器,这对个人开发者和小团队来说门槛较高。而Tailscale的DERP服务有个独特优势:支持使用自签名证书和任意域名(包括虚构域名),这意味着你完全可以在没有真实域名的情况下,用一台最基础的云服务器完成部署。
2. 环境准备与依赖安装
2.1 服务器选择建议
实测下来,腾讯云或阿里云的1核1G轻量应用服务器就足够支撑20人左右的团队使用。我比较推荐Ubuntu 22.04系统,对新手更友好。需要注意的是:
- 国内服务器建议选BGP线路,国际业务则优先香港/新加坡节点
- 内存不要低于512MB,编译Go程序时容易OOM
- 系统盘剩余空间需≥5GB
登录服务器后先做基础配置:
# 更新软件源 apt update && apt upgrade -y # 安装基础工具 apt install -y wget git openssl curl nano2.2 Go语言环境配置
Tailscale的derper服务需要用Go编译,这里有个小技巧:如果服务器在国内,建议先配置镜像加速:
# 设置Go模块代理 go env -w GO111MODULE=on go env -w GOPROXY=https://goproxy.cn,direct接着安装特定版本的Go(以1.21.5为例):
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配置环境变量时,建议同时写入bashrc和profile:
echo "export PATH=$PATH:/usr/local/go/bin" >> ~/.bashrc echo "export PATH=$PATH:/usr/local/go/bin" >> /etc/profile source ~/.bashrc验证安装是否成功:
go version # 应该输出类似:go version go1.21.5 linux/amd643. 编译与配置derper服务
3.1 获取derper源码
直接通过go install获取最新代码:
go install tailscale.com/cmd/derper@main编译好的二进制文件会出现在~/go/bin/目录。但我推荐手动编译到系统目录:
mkdir -p /etc/derp cd $(go list -f '{{.Dir}}' tailscale.com/cmd/derper) go build -o /etc/derp/derper3.2 自签名证书生成
DERP服务需要TLS证书,但没有真实域名也能玩:
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"这里有个坑要注意:证书的CommonName(CN)必须和后续的hostname参数完全一致,否则会导致客户端验证失败。
4. 服务部署与系统集成
4.1 创建systemd服务
新建服务配置文件/etc/systemd/system/derp.service:
[Unit] Description=Tailscale DERP Server After=network.target [Service] User=root Restart=always ExecStart=/etc/derp/derper \ -hostname derp.myself.com \ -a :33445 \ -http-port 33446 \ -certmode manual \ -certdir /etc/derp \ -stun-port 3478 [Install] WantedBy=multi-user.target关键参数说明:
-a指定DERP服务端口(可自定义)-http-port用于状态检查的HTTP端口-stun-portSTUN服务端口,建议保持默认3478
4.2 防火墙配置
云服务器通常有双重防火墙:
- 控制台安全组:放行TCP 33445和UDP 3478
- 系统防火墙(以ufw为例):
ufw allow 33445/tcp ufw allow 3478/udp ufw reload启动服务并设置开机自启:
systemctl daemon-reload systemctl enable --now derp检查服务状态:
systemctl status derp # 正常应该显示active (running)5. Tailscale网络集成
5.1 ACL配置
登录Tailscale管理后台,修改ACL策略文件:
"derpMap": { "OmitDefaultRegions": true, "Regions": { "901": { "RegionID": 901, "RegionCode": "myderp", "RegionName": "My Private DERP", "Nodes": [ { "Name": "901a", "RegionID": 901, "DERPPort": 33445, "IPv4": "你的服务器IP", "InsecureForTests": true } ] } } }重要安全提示:InsecureForTests参数仅限测试使用,正式环境应该配置合法证书并设为false。
5.2 客户端验证
在已加入Tailscale网络的设备上执行:
tailscale netcheck正常输出应该包含你的自定义DERP区域:
DERP map: myderp: 你的服务器IP:33445 (via TCP)如果显示连接失败,可以尝试:
tailscale ping 另一个客户端IP tailscale status6. 安全加固与防滥用
6.1 启用Tailscale验证
为防止他人滥用你的中继服务器,需要在服务器上安装Tailscale客户端:
curl -fsSL https://tailscale.com/install.sh | sh tailscale up然后修改derper服务配置,增加验证参数:
ExecStart=/etc/derp/derper \ -hostname derp.myself.com \ -a :33445 \ -http-port 33446 \ -certmode manual \ -certdir /etc/derp \ -stun-port 3478 \ -verify-clients6.2 监控与维护
建议定期检查日志:
journalctl -u derp -f常见问题处理:
- 证书过期:重新生成并重启服务
- 端口冲突:修改服务配置文件中的端口号
- 内存泄漏:定期重启服务或限制内存用量
我在三台服务器上部署了这个方案,稳定运行超过半年。最关键的体会是:一定要做好监控,DERP服务虽然轻量,但在高并发时还是可能出现资源瓶颈。建议用crontab设置每天自动重启一次服务,可以有效避免内存泄漏问题。
