https://tailscale.com/kb/1118/custom-derp-servers/
derp server has derp service(基于 http(s) 的流量转发 tcp/443) + STUN service(udp/3478)
众所周知,搭建一个 derp server 需要配置 https 证书等繁琐的流程,因此希望能通过 tcp 流量转发实现加速。
Route:
在 tailscale web admin UI 中可以配置 ACL ,其中包括 derpMap
默认的 derpMap: https://login.tailscale.com/derpmap/default
(并不会一直请求,而是被 embed 在 golang binary 中)
添加一个新的 region ,其 Nodes
参数包含我们想要添加的转发代理节点
{
"derpMap": {
"OmitDefaultRegions": true,
"Regions": {
"900": {
"RegionID": 900,
"RegionCode": "hkg2",
"RegionName": "Tencent HK->Hongkong",
"Nodes": [
{
"Name": "derp Tencent hk",
"RegionID": 900,
"HostName": "derp20b.tailscale.com",
"DERPPort": xxxx,
"STUNPort": -1,
"IPv4": "xx.xx.xx.xx",
},
{
"Name": "stun",
"RegionID": 900,
"HostName": "derp20b.tailscale.com",
"STUNOnly": true,
},
],
},
},
}
显而易见,如果我们用 UDP 转发来代理 STUN 服务,STUN 获取到的 external ip address 是 UDP 代理的 IP ,而不是 local agent ip ,其会直接导致服务连接失败。
好在 DERPNode
中的配置选项还算丰富,可以 somehow 绕过这个麻烦
https://pkg.go.dev/tailscale.com/tailcfg#DERPNode
HostName
必须是 default derpMap 中几个服务器之一(本人选择香港 derp20b ),否则 tls 报错 internal tls cert error ( journalctl -u tailscaled )
但是为此的代价是必须手动指定 IPv4
field ,设置为 vx.link tcp proxy’s IP addr ,如果 vx.link 更换了新的代理服务器,我们可能需要手动修改这个 field
DERPPort
为 vx.link tcp proxy’s port
STUNPort
为 -1:To disable STUN on this node, use -1.
之后,再添加一个 STUNOnly
为 true 的节点,HostName
最好是和上边一样
Routes(one way):
China Mobile FTTH → vx.link Tencent HK →derp20b.tailscale.com → vx.link Tencent HK → China Unicom 4g
mtr -z derp20b.tailscale.com
勉强能在高峰期获得一个能用的延迟。
流量转发与 STUN 服务的强耦合,导致 tcp udp 流量走的是两条不同的 network path ,即 tailscale netcheck
通过 STUN 服务检测到的 UDP 直连 RTT 并不等同于经过 tcp 转发后 path 的 rtt ,导致我们的最优 path 选择出错。
所以无奈之举是 OmitDefaultRegions
为 true ,disable 所有默认节点,只保留我们在 acl 中添加的转发节点。
注:文章内容从 notion 笔记中 CTRL-V ,文法及格式过于随意。
真不是广告,流量都是自费充值。
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.