平时用tailscale 远程连接存在偶尔打洞失败情况,由于 tailscale 在中国没有服务节点,打洞失败时会用海外中继,导致延迟很高,体验较差。可以自建 DERP 节点解决延迟问题,直接国内的服务器上 docker 部署 DERP 节点
docker-compose配置文件
version: '3.8'
services:
derper:
container_name: derper # 指定容器名称
image: fredliang/derper
restart: always # 容器意外退出时自动重启
ports:
- 13478:13478/udp # STUN/UDP 端口映射,用于 NAT 穿透辅助
- 13477:13477 # DERP 主服务端口映射 (TCP)
environment:
- DERP_DOMAIN=derp.test.com # 替换为你的域名(需解析到服务器IP)
# 证书模式说明:
# - letsencrypt: 自动申请证书
# - manual: 手动提供证书
- DERP_CERT_MODE=manual # 手动模式
# 服务监听端口(需与上方端口映射对应)
- DERP_ADDR=:13477 # 使用非标准端口避免冲突
# 客户端验证(增强安全性)
- DERP_VERIFY_CLIENTS=true # 只允许已认证的Tailscale节点连接
volumes:
# 挂载Tailscale的Unix socket文件(用于客户端验证)
- /var/run/tailscale/tailscaled.sock:/var/run/tailscale/tailscaled.sock
# 证书存储目录
- ./derper_certs:/app/certs # 证书文件需命名为:derp.test.com.crt 和 derp.test.com.key
再配置下ssl 证书,推荐开源的 SSL 证书管理工具certimate
tailscale 后台Access controls添加以下内容
{
"derpMap": {
// 是否忽略Tailscale默认的全球DERP服务器(设为true表示只使用自定义节点)
"OmitDefaultRegions": true,
// 自定义DERP区域配置
"Regions": {
// 区域ID(必须唯一,建议900+以避免与官方DERP冲突)
"900": {
"RegionID": 900, // 区域唯一标识符
"RegionCode": "myderp", // 区域简码(英文标识)
"RegionName": "HZ", // 区域显示名称
// 该区域下的DERP节点列表
"Nodes": [
{
"Name": "1", // 节点名称(同一区域内唯一)
"RegionID": 900, // 必须与父RegionID一致
"HostName": "derper.test.com", // 节点域名
// 关键端口配置
"DERPPort": 13477, // DERP服务端口(TCP)
"STUNPort": 13478, // STUN服务端口(UDP)
// 安全设置(生产环境必须为false)
"InsecureForTests": false // 是否禁用TLS验证(true=禁用,仅测试用)
}
// 可在此添加更多节点实现高可用
],
},
// 可在此添加更多区域(如北京、上海等)
},
},
}
客户端检查节点命令
tailscale netcheck