真诚友善团结专业,共建你我引以为荣之社区。《常见问题解答》
阅读时间 6 分钟
80 / 82
2024 年 11月

参考文档如下,感谢作者的付出
无需域名,自建 Tailscale Derp 节点
tailscale使用自定义derper服务器
ip_derper
Tailscale 基础教程:部署私有 DERP 中继服务器

前几天折腾headscale后是一地鸡毛,听佬友说只需要部署自建derp,然后用官方的tailscale就行,我寻思着没毛病,真是完美的方案

上次验证失败是卡在了域名SSL证书验证问题,我配置的nginx无法解决这个问题,所以这次就放弃域名验证了,使用纯IP就行,且tailscale的控制台支持添加自定义derp服务器,支持自定义端口。

部署

感谢大佬打包了纯IP部署的derp docker镜像,可以直接拉取,就是速度十分感人,等着吧

docker pull ghcr.io/yangchuansheng/ip_derper:latest

认证会使用到容器内部的两个端口:443、3478,映射的时候需要将这个两个端口暴露出去(80用不上,因为必须走TLS),同时记得去云服务器的防火墙放行你要暴露的端口

此处3478是derp默认使用的STUN 端口,而且也是tailscale ping状态的端口,而443是验证TLS的端口。端口都可以自定义,tailscale控制台支持修改。

注意,3478需要映射udp(tcp可以不映射,我懒得删了):

docker run --restart always --name derper -d -p 59443:443 -p 3478:3478 -p 3478:3478/udp ghcr.io/yangchuansheng/ip_derper

云服务器的防火墙记得打开3478(udp)、59443(tcp)

然后访问https://IP:59443,看到derp界面就说明服务正常启动

配置

接下来去tailscale控制台配置derp服务地址:

下面是我的配置,记得填入你自己的IP,直接在ssh段落后面添加就行:

"randomizeClientPort": true, "derpMap": { "OmitDefaultRegions": false, "Regions": { "901": { "RegionID": 901, "RegionCode": "tx", "RegionName": "tencent Shanghai", "Nodes": [ { "Name": "901", "RegionID": 901, "HostName": "【IP】", "DERPPort": 59443, "IPv4": "【IP】", "InsecureForTests": true, "STUNPort": 3478, }, ], }, "1": null, "2": null, // "3": null,//Singapore "4": null, // "5": null,//Sydney "6": null, // "7": null,//Tokyo "8": null, "9": null, "10": null, "11": null, "12": null, "13": null, "14": null, "15": null, "16": null, "17": null, "18": null, "19": null, //"20": null,//Hong Kong "21": null, "22": null, "23": null, "24": null, "25": null, }, },

点击save即可

测试

更换derp节点需要客户端重启tailscale才能生效,不然使用的时候还是会用之前的derp节点。群晖就直接在套件中心停用再启用tailscale就行。

我们来测试一下节点情况,在Windows的tailscale路径下cmd执行即可(群晖ssh也行)

首先关闭ipv6,避免直接公网直连,然后找到一台用流量的手机,连入tailscale:

  • 查询集群状态
tailscale status
100.64.0.2 Nas-windows11 windows - 100.64.0.4 phone android active; 100.64.0.5 macbookair macOS offline 100.64.0.3 pc windows active; 100.64.0.1 Nas linux active;
  • 查询网络状态
tailscale netcheck
Report: * UDP: true * IPv4: yes, ip:23298 * IPv6: no, but OS has support * MappingVariesByDestIP: false * PortMapping: UPnP, NAT-PMP, PCP * CaptivePortal: true * Nearest DERP: tencent Shanghai * DERP latency: - tx: 54.4ms (tencent Shanghai) - tok: 200.6ms (Tokyo) - syd: 234.7ms (Sydney) - sin: 244.3ms (Singapore) - hkg: 249.2ms (Hong Kong)
  • ping一下使用流量上网的手机
tailscale ping phone
pong from 14u (100.64.0.4) via DERP(tx) in 173ms pong from 14u (100.64.0.4) via DERP(tx) in 125ms pong from 14u (100.64.0.4) via DERP(tx) in 242ms pong from 14u (100.64.0.4) via 39.144.134.6:64239 in 16ms

ipv4 STUN打洞成功,延迟只有16ms!

总结

使用tailscale + 自建Derp 有以下效果:

如果设备都在同一个局域网,设备直连;
如果访问设备网络环境有公网ipv6地址,设备直连;
如果访问设备只有ipv4但NAT类型支持,那么通过自建Derp打洞实现STUN穿透访问;
如果设备网络环境极其恶劣,亦可使用中继服务器转发进行小带宽的访问。

这应该是目前使用体验最优秀,最方便,成本最低的虚拟组网方案,使用国内服务器自建的derp,听说连NAT4都能打洞成功。而且最重要的是,一切网络转换行为都不需要你操心,只需要设备登录连接tailscale即可,简直就是神。

总算是能稍微安心了。

阅读时间 6 分钟

去年双十一云厂商优惠的主机没什么业务,手撸的derp ,需要go的环境,用aliyun一年的免费ssl hey,有配置好的docker应该更简单 taiscale北京到上海的Derp节点时延是40ms

感谢热佬~ :smiling_face_with_three_hearts:

我还是觉得 Tailscale 设计的太复杂了。ACL 策略等机制。这种程度的复杂对于我这种个人用户来说属于过多的心智负担了。 :rofl:

我还是喜欢 Zerotier 那种傻瓜式操作。 :smiling_face_with_three_hearts:

我用n2n,docker直接部署 非常方便

回复:“这两个我用起来没有区别吧,你说的复杂体现在哪里呢”

感觉以下几个功能很乱,也可能是我个人的问题



以及这个魔法 DNS 不能自定义

回复 “zerotier经常掉线,可能是我自建的有问题”

我用的 GitHub - Jonnyan404/zerotier-planet: 一分钟自建zerotier-planet 目前还没遇到问题。
自己搭建的根服务器连接质量,延迟都很棒。
而且我感觉 Zerotier 这种简单的设置网段,自动分配 IP,也可以手动修改 IP。手动配置 DNS,手动设置路由表这种简单操作要易用的多。
相比 TS 的 ACL 规则,退出节点等复杂概念我感觉要好用的多
image

我感觉 TS 应该是对标 Cloudflare Zero Trust 这种 Cloudflare Tunnel 的 企业级 产品。对于我这种轻量级的个人需求来说功能太多太复杂了。增加心智负担。我更喜欢简单一点的 Zerotier。

其实还能让你省下一个客户端,前提是你的翻墙节点服务器上也开了tailscale:

有没有这样一种场景,你手机端开了tailscale 但是你的vpn断开了,比如 clash 比如v2rayNG比如小火箭, 虽然你能从tailscale走一些流量但是不完美;

其实你只需要开着你的翻墙节点,然后把绕过局域网的规则取消掉,再次打开你组网的其他机器的内网页面,是不是奇迹再次发生了

那可能是我用的功能比你还少的多,我甚至只需要自定义分配IP,其他的都不关心 :joy:
tailscale的自动根据网络环境切换直连或穿透,还是挺省心的,起码我自己用zerotier时没有这么丝滑
不过应该是我弄的Zerotier组件不太先进,反正docker一口气开了三个容器,挺麻烦的

比较古早的项目了,之前都试过,有空可以升级成更流行的

tailscale不开源不敢用啊,这年头天天有暴雷的。。

然后推荐一手Headscale,反正我没用过官方的Tailscale,用Headscale感觉整个流量都算是在自己这,可能放心一点吧。(因为没用过,所以也没有比较,只是一直用Headscale感觉不错)

哦另外我的headscale在国外(headscale也启用了内置的derp,是headscale的derp,不是tailscale官方的derp),方便用域名管理,自建的derper在国内(虽然说配置上也是用域名,但其实是有些限制,大家也应该都懂),平时不能直连的时候快一些,要是实在挂了就从国外绕一下,然后连上去慢慢修hhhh

就是说控制端tailscale不开源才不敢用,还好有headscale,用了半年下来还是挺舒服的

在国内不是不是应该 Tailscale + 自建 Headscale(控制端) + 自建 Derp(网络基础设施) 。控制端也自建好,好处:设备信息不暴露,设备发现更加快。自建 Derp好处:流量不会被审查,自用服务器在中继的时候独占带宽,国内与 Derp 服务器可以快速建立连接。

目前国内最好的方式是不是就是
tailscale+自建derp 呀
目前就拉通了 tailscale的组网 mstsc卡的不行= =

你是说RDP吧,可以用cmd看看ping设备的情况,是不是打洞成功了

中继是这样的,你这个ping应该不是我说的tailscale ping,后者是可以看到设备间的链接情况的,具体是直连还是穿透还是中继。

在tailscale路径下cmd即可

我目前使用的话是直接启动就行了,没有走什么Derp节点,所以这里有点不太好理解。我这种应该是走的官方中转?

derp是可以使用http的,详见 tailscale/cmd/derper/derper.go at main · tailscale/tailscale (github.com)


,通过反代就可以让你的derp服务器80端口不必非得给derp了,上面的内容是在 浅探 Tailscale DERP 中转服务 | Kiprey’s Blog这个博客里提到的,下面给个参考

我用的镜像是 sparanoid/docker-derp:容器中的 Tailscale DERP 服务器 — sparanoid/docker-derp: Tailscale DERP server in container (github.com)
,看下dockerfile就知道很干净的一个东西

服务器那边端口都开好了吧,你试试直接用telnet ping一下你的服务器IP 和用的几个端口,看看有没有问题

是的,cmd里tailscale ping设备就能看到用的是那种方式,官方的一般延迟比较高,我这次是基本不可用的

嗯嗯,我目的就是为了能让80 443端口腾出来不被tailscale占用,没这个需求不用考虑这个

如果你netcheck的时候自建derp没有延迟信息显示,那就是3478 udp没开通
如果你ping的时候不走延迟低的中继,重启一下客户端应用

19 天后

类别 2024 年 8月 28 日更新

From #optimize to 开发调优

2 个月后

请问下有遇到这种情况吗,虽然是域名自建的derp不是纯ip自建,但应该能最后能正常访问 https://域名:12345 的derp界面,算是自建成功了?然后在官方的 Access Controls也添加了配置,使用tailscale netcheck能正常查询到自建的节点,如图。但是tailscale status检查的时候就显示如图Health check的问题,不知道这样算成功还是失败。
系统是aliyun重装的debian12系统,端口ssl证书都是按各种教程配置了的,理论上没有其他干扰项。

端口和web端访问都没问题,但实际还是中转不了,最后用腾讯云解决了。不知道这个问题别人有没有,我在其他2台腾讯云建的derp都没问题,阿里云重装系统各种方法都试了用不了,所以目测是运营商屏蔽的问题。

那可能是的了,不过derp的端口是可以自定义的呀,它怎么屏蔽 :joy:

端口也尝试改过也不行,只是控制变量法目测的结论,用阿里和腾讯的分别控制系统及端口防火墙各种条件都相同时,确实一个行一个不行,那问题基本就出在平台和网络运营商里,而且在v2ex里也找到一些类似的,但是都没有得到答案。不过最后成功了就行,算是小踩坑了。

22 天后

客户端和中继服务器derp都是开源的,他们公司直接在github上面维护代码的
控制平面可以自建开源的Headscale

样例docker-compose.yml:

services: derper: container_name: derper image: fredliang/derper:latest restart: unless-stopped ports: - 54322:54322/udp - 54321:54321 environment: DERP_DOMAIN: "你的域名" DERP_CERT_MODE: "manual" DERP_CERT_DIR: "/certs" DERP_ADDR: ":54321" DERP_STUN: "true" DERP_STUN_PORT: "54322" DERP_HTTP_PORT: "-1" DERP_VERIFY_CLIENTS: "true" volumes: - "./certs:/certs" - "/var/run/tailscale/tailscaled.sock:/var/run/tailscale/tailscaled.sock"
  1. 在上面填上你要用的域名
  2. 在./certs目录下放你的域名对应的TLS证书(可以用certbot自动申请续期)
  3. 在开derper的那个服务器上也跑一个Tailscale Linux客户端。DERP_VERIFY_CLIENTS需要本地有一个Tailscale客户端用于进行身份验证。
  4. 把这个derp服务器加到Tailscale的列表中即可

照理国内TLS开在高位端口(50000以上)一般应该不会管,如果是443或者低位某些知名端口(比如12345?)那就应该不行了,可能是这个原因

感谢大佬,周末也部署了下,有几个问题探讨下。
1.广州腾讯云,部署derper,用了一天,是好的。在用就连不上了,不晓得什么原因。日本vir没有问题
2.nat4没有办法打洞成功
3.openwrt上ts和passwall冲突
4.能否起一个二合一的docker,在一个vps上把derper与ts合并到一起,这样就可以防止被扫derper咯

其实如果是自建headscale的话,github上有个PR已经支持用derper的verify-client-url来验证客户端,这样就不用在derper旁边专门开个Tailscale客户端了,启动的时候设置个URL参数就行。
PR还没合,估计得等几周。