
1. 为什么需要自建DERP中继节点Tailscale作为一款基于WireGuard的现代组网工具最大的优势就是能够自动建立点对点连接。但在实际使用中约30%的情况下会因为NAT类型限制、防火墙策略等因素导致直连失败。这时就需要DERPDetour 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 GO111MODULEon go env -w GOPROXYhttps://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和profileecho 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/derpermain编译好的二进制文件会出现在~/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 /CNderp.myself.com \ -addext subjectAltNameDNS:derp.myself.com这里有个坑要注意证书的CommonName(CN)必须和后续的hostname参数完全一致否则会导致客户端验证失败。4. 服务部署与系统集成4.1 创建systemd服务新建服务配置文件/etc/systemd/system/derp.service[Unit] DescriptionTailscale DERP Server Afternetwork.target [Service] Userroot Restartalways ExecStart/etc/derp/derper \ -hostname derp.myself.com \ -a :33445 \ -http-port 33446 \ -certmode manual \ -certdir /etc/derp \ -stun-port 3478 [Install] WantedBymulti-user.target关键参数说明-a指定DERP服务端口可自定义-http-port用于状态检查的HTTP端口-stun-portSTUN服务端口建议保持默认34784.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设置每天自动重启一次服务可以有效避免内存泄漏问题。