我的服务器系列:tailscale使用自定义derper服务器(docker部署)
使用docker部署tailscale私有中继服务器,并使用nginx四层代理与原有服务共用443端口,最后配置使用并检测。
derper-docker部署及使用较麻烦,本文分享踩坑记录及经验,建议阅读。
一 设计及参考
设计
- 使用DockerHub上面唯一主流的derper镜像进行部署,保证可靠性
- 使用nginx四层代理转发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证书有格式和命名要求,挂载使用很不优雅,故放弃该方案
而自动申请需要使用443端口,因为我443端口已经使用了,所以需要用nginx stream反向代理的形式做443端口4层转发。
后文会进行详细说明。 - 3478端口不能修改,因为走udp所以也不建议转发。
- 如果使用DERP_VERIFY_CLIENTS则需要挂载tailscaled.sock,使容器能访问到外部机器derper进程。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17mkdir -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三 nginx代理配置
虽然有些人说derper运行一段时间就会崩溃(Derper TLS handshake error: remote error: tls: internal error ),
但我没有遇到过,按照官方issue和TAILSCALE 的一些使用心得里的说法,可能和墙/备案有关。
顺带一提,如腾讯云这样的国内云服务器提供商,会审查 TLS handshake 里的 SNI 信息, 如果发现 SNI 域名未备案,会阻断 TLS 握手。 所以,我曾经也尝试过用一个境外服务器的域名,然后指向到境内服务器 IP 的形式尝试绕过备案, 然而短暂的用了几分钟后,就遇到了 tls handshake reset 的问题。 目前看来,只要你想用境内服务器,那么备案就是绕不过的问题。
Ps. 如果你有备案域名,那么可以用 nginx stream 反向代理的形式做 443 端口 4 层转发。 nginx stream 可以在四层探测 SNI 信息,然后分发到不同的后端,这样你 derper 的 443 和其他域名的 443 就可以共存在同一个服务器上了。
这里主要知识点是:
- TLS handshake 里的 SNI 信息
- nginx四层负载均衡
具体配置参考我的另外一篇文章:TODO
四 tailscale配置
Access Contros配置内容参考如下:
主要是添加了derpMap,其他都保持默认。
如果有多个derper服务器,建议配置为多个region而非node。
因为延迟的比较是以region为单位的,会方便测试。
一开始不确定derper是否运行正常的时候,建议先把OmitDefaultRegions设置为true,关闭默认的region。
另外,修改Access Contros后,需要重启tailscale服务才能生效!
1 |
|
五 测试使用derper
相关命令
1 |
|
如下图,自定义的derper比默认的延迟要低不上。
(不过只有在极端情况下流量才会走derper,通常derper只要连得上就行,所以延迟影响不大)
需要注意的是,这里显示一切正常,不代表derper就是在正常工作了。
只是说能访问到 https://derper.linshenkx.cn 而已。
关键还是要看ping。
如图,代表了几种情况:
- tx.linshenkx.cn
先通过DERP(sfo)连接,然后打洞成功,进化为ip:端口直连 - uc.linshenkx.cn
识别到是本机 - lian.linshenkx.cn
尝试通过DERP(lian)连接,但失败(因为对方tailscale服务异常) - nas.linshenkx.cn
先通过DERP(lian)连接,然后打洞成功,进化为ip:端口直连
derper日志类似如下