朝まだき 頁の奥で 文字めざむ
DERP
This is a Tailscale DERP server.
It provides STUN, interactive connectivity establishment, and relaying of end-to-end encrypted traffic for Tailscale clients.
Documentation:
About DERP
Protocol & Go docs
How to run a DERP server"derpMap": {
"OmitDefaultRegions": false,
"Regions": {
"901": {
"RegionID": 901,
"RegionCode": "custom901",
"RegionName": "Hangzhou",
"Nodes": [
{
"Name": "901a",
"RegionID": 902,
"DERPPort": 10443,
"InsecureForTests": true,
"IPv4": "198.51.100.88"
}
]
}
}
}Tailscale could not establish an encrypted connection with '""': likely intercepted connection; certificate is self-signed by CN=..."Name": "902a",
"RegionID": 902,
"HostName": "derp.example.com",
"IPv4": "203.0.113.88",
"DERPPort": 443
起因
不久前搭建了Tailscale,解决了p2p连接的问题,但是不能稳定p2p连接,晚上的时候中继节点又非常卡,本来是研究下怎么自建DERP的,后来看到社区帖子里有人分享了通过 FOFA 搜索公开 Tailscale DERP 节点的办法,就照着试了一遍。
快速自检:FOFA 找候选、浏览器看服务提示页、把候选加到 tailnet 的 ACL,再用 Tailscale 客户端测试真实连接。
第一步:用 FOFA 搜候选
先打开FOFA
我使用的以下查询语句(可以根据需要调整 country)
FOFA 会返回页面内容同时包含 Tailscale 和 DERP server 的资产。我从结果中挑地址,用浏览器打开。如果页面显示:
这说明该地址返回了 Tailscale DERP 的提示页面,可以作为候选继续测试。
但浏览器能打开页面只算初筛,不代表 Tailscale 客户端已经能通过这个节点中继。后面我就遇到了网页可访问、客户端却连不上的情况。
第二步:加入 derpMap
实际成功配置里,我填了 IPv4 和 DERPPort,设置了 InsecureForTests: true,没有填写 HostName。保存后,客户端状态显示:
再执行:
得到:
这次关键证据不是网页提示,而是 `via DERP(custom901)` 并且收到 `pong`:说明这次设备间通信确实通过这个自定义 DERP 区域中继了。
参数说明
参数
作用
实际填写时的理解
derpMap
tailnet 可用的 DERP 区域配置
自定义 Region 放在这里
OmitDefaultRegions
是否省略 Tailscale 默认 DERP 区域
false保留默认区域;true只使用自定义区域。调试时我用false,让默认区域继续作为备用
Regions
Region 配置集合
key 是 ID 的字符串,例如 901
RegionID
区域编号
key、Region 内的 ID 和 Node 内的 ID 要一致;自定义 ID 使用 900–999
RegionCode
区域短代码
例如custom901,客户端状态中可以看到这个名称
RegionName
区域显示名称
例如 Hangzhou,主要用于显示,不负责连接
Nodes
区域下的 DERP 节点列表
实际节点配置放在这里
Name
节点标识名
示例里是 901a,建议易辨认并保持唯一
DERPPort
DERP over HTTPS/TLS 服务端口
填实际 DERP 服务端口。这个字段只指定端口,不会把明文 HTTP 转成 HTTPS
HostName
节点主机名
官方结构定义中是 DERP 节点字段。常规配置建议填写证书对应的域名;省略它是我这次特定配置中的实测结果,不应直接推断所有客户端和服务都适用
IPv4
指定客户端拨号用的 IPv4 地址
可以固定拨号 IP;它和 `HostName` 承担的用途不同
InsecureForTests
测试用途的 TLS 证书验证选项
true会跳过证书验证,自签名证书因此可能可以连上;官方定义是测试用途,不建议长期使用
OmitDefaultRegions 用false 还是 true
我测试时用的是 false,保留默认 DERP 区域。它不会强迫客户端选默认节点,只是让默认节点仍在可选范围内,出问题时还有备用路径。
设为 true 会省略默认区域,只剩 ACL 里提供的自定义区域。若自定义节点不可用,客户端就没有默认 DERP 可以回退。
实际按需求决定:希望保留默认 DERP 就用 false;确实要排除默认节点才用 true。
HostName、IP、自签名证书和那条健康告警
我的成功配置是 IPv4 指向一个 IP、HostName 留空,并启用了InsecureForTests。这只是我当时这台客户端和该节点的实测组合;Tailscale 官方结构定义仍把 HostName 作为 DERP 节点字段。长期配置更推荐填写证书匹配的域名,并使用有效证书。
我当时还看到过类似下面的健康检查信息:
同时,tailscale ping 却能返回 via DERP(custom902) 这两件事可以同时出现:本次连接通过了 DERP 中继,但证书身份校验仍有告警。
InsecureForTests: true 跳过的是证书校验,不等于把 TLS 加密关掉;但客户端也因此无法可靠确认对端的身份,存在中间人冒充风险。所以这适合临时验证,不适合不加说明地当作长期安全配置。
更稳妥的长期配置思路是:
这里的域名需要有匹配的有效 TLS 证书,示例 IP 需要换成真实地址;证书配置正确后,移除 InsecureForTests。
网页能打开,为什么节点还是可能不可用?
我有一次从浏览器打开一个http://<IP>:9443/ 地址,页面能显示 DERP 提示,但客户端仍然连不上。
原因是浏览器打开网页和 Tailscale 建立 DERP 中继验证的不是同一件事。Tailscale 客户端需要通过 DERP 协议建立双向连接;如果配置的是 DERP HTTPS/TLS 端口,光有明文 HTTP 页面并不够。DERPPort 也只表示客户端要连接哪个端口,不会自动把 HTTP 升级成 HTTPS。
因此我把检查分成了三层:
真正确认客户端能用,最终看第三层。
最后总结
这次最大的收获,是把“看起来像 DERP”“端口网页能访问”和“Tailscale 真正通过它中继”区分开了。
官方参考