在内网docker搭建tailscale后,由于需要链接官方公共的derp中继服务器,但是不包含大陆地区,会导致服务不稳定和延迟高。于是决定用手里的几台vps搭建只供自己使用的derp服务器。derp服务器部署有两种方式,一种使用域名,另外一种使用ip。本文使用的是IP方式。
Docker compose配置
编辑dokcer-compose.yml文件,内容如下
services:
derper:
image: ghcr.io/yangchuansheng/ip_derper
container_name: derper
restart: always
ports:
- "3478:3478/udp"
- "33380:33380"
environment:
- DERP_ADDR=:33380
- DERP_VERIFY_CLIENTS=false #域名验证,这里是ip形式
volumes:
- /var/run/tailscale/tailscaled.sock:/var/run/tailscale/tailscaled.sock
docker运行后,浏览器输入https://ip:33380
,如果出现以下页面,搭建成功。
修改Access Controls
登陆tailscale,找到Access Controls,在“acls”:[ ]下面增加以下内容
"derpMap": {
"OmitDefaultRegions": true,
// OmitDefaultRegions 忽略官方的中继节点
"Regions": {
// 这里的数字可选900-999
"900": {
"RegionID": 900,
"RegionCode": "hkg",
"RegionName": "vir-hk",
"Nodes": [
{
"Name": "1",
"RegionID": 900,
"IPv4": "49.207.280.248",
"IPv6": "2400:e300:faf::1f62",
"DERPPort": 33380,
"InsecureForTests": true,
},
],
},
"901": {
"RegionID": 901,
"RegionCode": "sin",
"RegionName": "bt-sg",
"Nodes": [
{
"Name": "2",
"RegionID": 901,
"IPv6": "2a89:bec0:16e:2ad::",
"DERPPort": 33380,
"InsecureForTests": true,
},
],
},
},
},
RegionCode一般为三字机场代码,比如hkg,sin,tyo,lax等。
RegionName一般为地区名称,比如dmit-hk,bwg-hk,v.ps-sg等,自己随意。
假如一个地区有多台服务器,则可以参考以下配置
"900": {
"RegionID": 900,
"RegionCode": "hkg",
"RegionName": "vir-hk",
"Nodes": [
{
"Name": "1",
"RegionID": 900,
"IPv4": "49.207.280.248",
"IPv6": "2400:e300:faf::1f62",
"DERPPort": 33380,
"InsecureForTests": true,
},
{
"Name": "1a",
"RegionID": 900,
"IPv4": "1.1.1.1",
"IPv6": "2400:e300:faf::1f62:ff",
"DERPPort": 33380,
"InsecureForTests": true,
},
{
"Name": "1b",
"RegionID": 900,
"IPv4": "2.2.2.2",
"IPv6": "2400:e300:faf::1f62:dab",
"DERPPort": 33380,
"InsecureForTests": true,
},
],
},
验证
进入容器内部,使用tailscale debug derp-map查看derp的服务器地图,下面显示的是自己搭建的derp服务器,官方的因为忽略了,没有显示。如果希望显示官方的可以把OmitDefaultRegions设为false。
/ # tailscale debug derp-map
{
"Regions": {
"900": {
"RegionID": 900,
"RegionCode": "hkg",
"RegionName": "vir-hk",
"Nodes": [
{
"Name": "1",
"RegionID": 900,
"HostName": "",
"IPv4": "49.207.280.248",
"IPv6": "2400:e300:faf::1f62",
"DERPPort": 33380,
"InsecureForTests": true
}
]
},
"901": {
"RegionID": 901,
"RegionCode": "sin",
"RegionName": "bt-sg",
"Nodes": [
{
"Name": "2",
"RegionID": 901,
"HostName": "",
"IPv6": "2a89:bec0:16e:2ad::",
"DERPPort": 33380,
"InsecureForTests": true
}
]
}
}
}
使用tailscale status可以查看在线的设备,并且ios的客户端的状态是活跃的,使用的derp中继服务器是RegionCode为hk的节点。一般会选择延迟最低的节点。
/ # tailscale status
100.113.77.75 tailscale lechanuh@ linux -
100.114.86.28 iphone-11 lechanuh@ iOS active; relay "hkg", tx 2268 rx 1236
使用tailscale netcheck可以查看derp服务器的延迟情况。如果地区代码hkg中配置多个服务器,也只会选择展示一个延迟低的。
/ # tailscale netcheck
Report:
* UDP: true
* IPv4: yes, 172.21.0.1:56665
* IPv6: no, but OS has support
* MappingVariesByDestIP: true
* PortMapping:
* Nearest DERP: vir-hk
* DERP latency:
- hkg: 67ms (vir-hk)
- sin: 88.6ms (bt-sg)
后记
上文的sg节点使用的是纯ipv6地址,如果希望通过tailscale netcheck检测到延迟,在docker-compose.yml文件中必须指定网络模式为主机模式network_mode: host,还有一种方式指定网络模式为桥接network_mode: bridge,但是必须配置docker 守护程序使用ipv6nat的形式共享宿主机的ipv6。文章参考