Tailscale 官方的 DERP 中继服务器全部在境外,距离最近的香港节点在国内的网络环境中也不一定能稳定连接。所以,还是很有必要建立自己的 DERP 服务器的。好在,操作起来并不难。
准备工作
- 需要有自己的云服务器,有 docker 运行环境。
- 需要有自己的域名。
- 需要申请 SSL 证书。
安装
假设你的域名为 example.com
,对应的证书为 example.com.crt
,私钥为 example.com.key
,DERP 对外提供服务的端口为 8443。
一行 docker 命令即可创建 DERP 服务器:
docker run -d \
--name derp \
--restart=always \
-p 0.0.0.0:3478:3478/udp \
-p 0.0.0.0:8443:8443 \
-v /path/to/example.com.crt:/app/certs/example.com.crt \
-v /path/to/example.com.key:/app/certs/example.com.key \
-e DERP_DOMAIN=example.com \
-e DERP_ADDR=:8443 \
-e DERP_CERT_MODE=manual \
fredliang/derper:latest
启动 3478 端口不要修改,8443 端口可以按照自己的喜好来改,DERP_ADDR 变量后面的端口好需要与之前的保持一致,但是这里的冒号不能丢。
接下来来到 Tailscale 管理页面 – Access controls 标签页中,将编辑区域的内容清空,并填入以下内容:
{
"derpMap": {
"Regions": {
"900": {
"RegionID": 900,
"RegionCode": "bj",
"RegionName": "Beijing",
"Nodes": [
{
"Name": "example.com",
"RegionID": 900,
"HostName": "example.com",
"DERPPort": 8443
}
]
}
}
}
}
RegionCode
与 RegionName
可以自定义,建议使用纯字母。DERPPort
需要与启动 docker 时设置的端口一致。点击保存之后即可。
在本地终端或者命令提示符中运行 tailscale netcheck
命令检查一下,看你设置的节点是否出现在下方的列表之中。
Report:
* UDP: true
* IPv4: yes, *.*.*.*:*
* IPv6: yes, [*:*:*:*:*:*:*:*]:*
* MappingVariesByDestIP: true
* HairPinning: false
* PortMapping:
* CaptivePortal: false
* Nearest DERP: Beijing
* DERP latency:
- bj: 36ms (Beijing)
- hkg: 235.7ms (Hong Kong)
- sea: 240.9ms (Seattle)
- sfo: 247ms (San Francisco)
- syd: 253.2ms (Sydney)
- sin: 259.5ms (Singapore)
- tok: 260.3ms (Tokyo)
- dfw: 271.5ms (Dallas)
- blr: 277ms (Bangalore)
- mia: 295.4ms (Miami)
- dbi: 314.6ms (Dubai)
- nyc: 315.2ms (New York City)
- tor: 326ms (Toronto)
- lax: 326.9ms (Los Angeles)
- den: 333.1ms (Denver)
- lhr: 347.6ms (London)
- hnl: 350.9ms (Honolulu)
- ord: 351.2ms (Chicago)
- sao: 407.1ms (São Paulo)
- fra: 487.8ms (Frankfurt)
- mad: 493.2ms (Madrid)
- par: 525ms (Paris)
- ams: 537.4ms (Amsterdam)
- waw: 555.3ms (Warsaw)
- jnb: 680.2ms (Johannesburg)
当使用 tailscale ping
命令去 ping 一个客户端的时候,就可以看到真正使用上了我们自己的节点。
pong from * (*.*.*.*) via DERP(bj) in 60ms
pong from * (*.*.*.*) via *.*.*.*:* in 58ms
防止被白嫖
如果你的云服务器的带宽、流量不是很大很多的话,做好客户端验证防止别人使用你的 DERP 服务器还是有用的。
首先在服务器上按照 Tailscale 官方安装手册安装客户端,在成功接入自己的局域网之后,本地会创建一个套接字接口 /var/run/tailscale/tailscaled.sock
,之后需要做的就是调整一下 docker 的命令:
docker run -d \
--name derp \
--restart=always \
-p 0.0.0.0:3478:3478/udp \
-p 0.0.0.0:8443:8443 \
-v /path/to/example.com.crt:/app/certs/example.com.crt \
-v /path/to/example.com.key:/app/certs/example.com.key \
-v /var/run/tailscale/tailscaled.sock:/var/run/tailscale/tailscaled.sock \
-e DERP_DOMAIN=example.com \
-e DERP_ADDR=:8443 \
-e DERP_CERT_MODE=manual \
-e DERP_VERIFY_CLIENTS=true \
fredliang/derper:latest
调整之处为两个,一个是将套接字接口挂载进容器中,另一个是添加环境变量 DERP_VERIFY_CLIENTS
,这样 DERP 就会验证连接的客户端是否与本机的客户端为同一个账号下,从而避免其他客户端白嫖服务器。