自建免备案防偷 Tailscale 中继(DERP)教程
缘由
使用docker部署tailscale私有中继服务器,使用并检测。
derper-docker部署及使用较麻烦,本文分享踩坑记录及经验,建议阅读。
一 设计及参考
设计
- 使用DockerHub上面唯一主流的derper镜像进行部署,保证可靠性
- 使用nginx或者caddy四层代理转发443端口请求到derper容器
- 在tailscale上面配置使用derper服务器
- 测试derper的连通
参考
- 推荐阅读:
官方说明( https://tailscale.com/kb/1118/custom-derp-servers/ )
TAILSCALE 的一些使用心得( https://leitalk.com/12245 )
Tailscale 基础教程:部署私有 DERP 中继服务器( https://icloudnative.io/posts/custom-derp-servers )
二 部署derper容器(已注册域名)
参考:https://hub.docker.com/r/fredliang/derper
下面是我个人的配置
-
注意:
- ssl证书
- ssl证书可外部挂载或由容器自动申请并维护证书更新(基于LetsEncrypt)
- 因为derper使用的ssl证书有格式和命名要求,挂载使用很不优雅,故放弃该方案,转而使用第三方工具生成证书后使用软符号连接方式使用。
- 3478端口不能修改,因为走udp所以也不建议转发。
- 如果使用DERP_VERIFY_CLIENTS则需要挂载tailscaled.sock,使容器能访问到外部机器derper进程。
- ssl证书
mkdir -p /data/derper/certs
docker rm -f derper
docker run -d \
-p 3443:443 \
-p 3478:3478/udp \
--name derper \
--restart=always \
-v /data/derper/certs:/app/certs \
-v /var/run/tailscale/tailscaled.sock:/var/run/tailscale/tailscaled.sock \
-e DERP_ADDR=":443" \
-e DERP_VERIFY_CLIENTS=true \
-e DERP_DOMAIN="derper.linshenkx.cn" \
fredliang/derper
docker logs -f derper
三 部署derper容器(ip)
参考 https://github.com/yangchuansheng/ip_derper
另外,反正直接走ip了,直接端口也换掉,这里用33380
因为不走域名,也不需要nginx来根据域名分流了,直接把端口暴露出来就好
docker rm -f derper
docker run -d \
-p 3478:3478/udp \
-p 33380:33380 \
--name derper \
--restart=always \
-v /var/run/tailscale/tailscaled.sock:/var/run/tailscale/tailscaled.sock \
-e DERP_ADDR=":33380" \
-e DERP_VERIFY_CLIENTS=true \
ghcr.io/yangchuansheng/ip_derper
docker logs -f derper
四 tailscale配置
Access Contros配置内容参考如下:
主要是添加了derpMap,其他都保持默认。
如果有多个derper服务器,建议配置为多个region而非node。
因为延迟的比较是以region为单位的,会方便测试。
一开始不确定derper是否运行正常的时候,建议先把OmitDefaultRegions设置为true,关闭默认的region。
另外,修改Access Contros后,需要重启tailscale服务才能生效!
// Example/default ACLs for unrestricted connections.
{
// Declare static groups of users beyond those in the identity service.
"groups": {
"group:example": [ "[email protected]", "[email protected]" ],
},
// Declare convenient hostname aliases to use in place of IP addresses.
"hosts": {
"example-host-1": "100.100.100.100",
},
// Access control lists.
"acls": [
// Match absolutely everything. Comment out this section if you want
// to define specific ACL restrictions.
{ "action": "accept", "users": ["*"], "ports": ["*:*"] },
]
,
"derpMap": {
"OmitDefaultRegions": false
,
"Regions": {
"900": {
"RegionID": 900,
"RegionCode": "lian",
"RegionName": "LIAN",
"Nodes": [{
"Name": "tx",
"RegionID": 900,
"HostName": "derper.linshenkx.cn",
"DERPPort": 443
}
]
}
}
}
}
如果是ip方式,则使用如下:
// Example/default ACLs for unrestricted connections.
{
// Access control lists.
"acls": [
{"action": "accept", "src": ["*"], "dst": ["*:*"]},
// Match absolutely everything. Comment out this section if you want
// to define specific ACL restrictions.
],
"derpMap": {
"OmitDefaultRegions": false,
"Regions": {
"900": {
"RegionID": 900,
"RegionCode": "lian",
"RegionName": "LIAN",
"Nodes": [
{
"Name": "tx",
"RegionID": 900,
"HostName": "你的ip",
"IPv4": "你的ip",
"DERPPort": 33380,
# 这里要去掉检测
"InsecureForTests": true,
},
],
},
},
},
}
五 测试使用derper
相关命令
显示集群状态
tailscale status
显示网络状态
tailscale netcheck
tailscale ping 节点
如下图,自定义的derper比默认的延迟要低不上。
(不过只有在极端情况下流量才会走derper,通常derper只要连得上就行,所以延迟影响不大)
tailscale netcheck
tailscale netcheck
需要注意的是,这里显示一切正常,不代表derper就是在正常工作了。
关键还是要看ping。
tailscale ping
tailscale ping
如图,代表了几种情况:
- 先通过DERP(sfo)连接,然后打洞成功,进化为ip:端口直连
- 识别到是本机
- 尝试通过DERP(lian)连接,但失败(因为对方tailscale服务异常)
- 先通过DERP(lian)连接,然后打洞成功,进化为ip:端口直连
derper日志类似如下
docker logs -f derper
docker logs -f derper