Kiprey / Kiprey.github.io

This is Kiprey‘s Blog.
https://kiprey.github.io/
4 stars 4 forks source link

浅探 Tailscale DERP 中转服务 | Kiprey's Blog #114

Open Kiprey opened 1 year ago

Kiprey commented 1 year ago

https://kiprey.github.io/2023/11/tailscale-derp/

qrzbing commented 1 year ago

看上去 Tailscale DERP 一定要支持建立 HTTP 连接(DERP_PORT),想要仅 TCP 连接是不是不可能的呢?

Kiprey commented 1 year ago

@qrzbing 看上去 Tailscale DERP 一定要支持建立 HTTP 连接(DERP_PORT),想要仅 TCP 连接是不是不可能的呢?

是的,准确来说是一定要支持建立 HTTPS 连接,因此端口不能阻断 TLS 流量。

一些内网穿透服务商需要用户实名认证后才能放行 HTTP/HTTPS 流量。

RuohaoYan commented 1 year ago

自建节点总是不适用,如果关闭官方节点就会报错: 2023/11/16 10:15:07 http: TLS handshake error from 220.171.158.105:63832: acme/autocert: server name component count invalid

Kiprey commented 1 year ago

@YRH0 自建节点总是不适用,如果关闭官方节点就会报错: 2023/11/16 10:15:07 http: TLS handshake error from 220.171.158.105:63832: acme/autocert: server name component count invalid

这个问题看上去是跟你 DERP 配置的证书有关,我搜到了类似情况看看能不能对你有所帮助。

就这篇 blog 的内容而言,上面的操作步骤都是我手动执行测试过的(2023.11),或许你可以参考一下。

RuohaoYan commented 1 year ago

@YRH0 自建节点总是不适用,如果关闭官方节点就会报错: 2023/11/16 10:15:07 http: TLS handshake error from 220.171.158.105:63832: acme/autocert: server name component count invalid

这个问题看上去是跟你 DERP 配置的证书有关,我搜到了类似情况看看能不能对你有所帮助。

就这篇 blog 的内容而言,上面的操作步骤都是我手动执行测试过的(2023.11),或许你可以参考一下。

是的 blog内容没有问题 根据blog内容完成了DERP节点的建立 就是总是不使用自建的节点 于是我试图关闭官方节点 然后就出现了上述错误 似乎还是无法解决

Kiprey commented 1 year ago

@YRH0

@YRH0 自建节点总是不适用,如果关闭官方节点就会报错: 2023/11/16 10:15:07 http: TLS handshake error from 220.171.158.105:63832: acme/autocert: server name component count invalid

这个问题看上去是跟你 DERP 配置的证书有关,我搜到了类似情况看看能不能对你有所帮助。

就这篇 blog 的内容而言,上面的操作步骤都是我手动执行测试过的(2023.11),或许你可以参考一下。

是的 blog内容没有问题 根据blog内容完成了DERP节点的建立 就是总是不使用自建的节点 于是我试图关闭官方节点 然后就出现了上述错误 似乎还是无法解决


关闭官方节点。

这个我之前测试过,是可以关成功的,这张图是我刚刚截下来的: image

tailscale 经常不使用自建节点。

这个我也遇到过hh,我感觉像是刚配置没多久时会出现这个问题,我后面等待了一段时间后就会自动用 DERP 了。 可能是因为自建 DERP 的网络延迟存在波动,初期 tailscale 在收集网络延迟时没有足够信息来判断延迟,所以经常给我 relay 到 hkg 了.... 不过现在好多了。

提升自建节点特权级。

有个官方文档没有记录的 ACL 参数(是我在阅读代码时看到的),你可以试试看,key 是 RegionID, value 是权重。 具体使用说明在代码注释里,不过自我感觉用处一般。

image
Cognitohazard commented 11 months ago

端口80应该不是死需求,我的derp服务器的80端口是给web server用的, 运行derper的时候可以用“-http-port -1”关掉http port,acl里也可以设置"CanPort80": false.

Kiprey commented 11 months ago

@Cognitohazard 端口80应该不是死需求,我的derp服务器的80端口是给web server用的, 运行derper的时候可以用“-http-port -1”关掉http port,acl里也可以设置"CanPort80": false.

是的,所以在最后搭建总结里就没再提到过 80 端口的事情了。

qrzbing commented 11 months ago

@Cognitohazard 端口80应该不是死需求,我的derp服务器的80端口是给web server用的, 运行derper的时候可以用“-http-port -1”关掉http port,acl里也可以设置"CanPort80": false.

其实重点不是80端口,而是 DERP_PORT:8888 走的还是 http 协议,想用带公网 IP 的家宽建一个 DERP 节点似乎是不可能的,要是被运营商扫到了就麻烦了。

Kiprey commented 11 months ago

@qrzbing

@Cognitohazard 端口80应该不是死需求,我的derp服务器的80端口是给web server用的, 运行derper的时候可以用“-http-port -1”关掉http port,acl里也可以设置"CanPort80": false.

其实重点不是80端口,而是 DERP_PORT:8888 走的还是 http 协议,想用带公网 IP 的家宽建一个 DERP 节点似乎是不可能的,要是被运营商扫到了就麻烦了。

是这样的,DERP 强制走 TLS ,这个是比较大的限制。

哪怕是用内网穿透,内网穿透服务商都得要求使用者在经过实名认证后才能穿透 TLS 数据。

rtgiskard commented 10 months ago

好奇怪呀,tls 端口也是通的,证书貌似也没问题,tailscale netcheck 也能发现它并确认为最近节点,但就是不从它路由🥴

Kiprey commented 10 months ago

@rtgiskard 好奇怪呀,tls 端口也是通的,证书貌似也没问题,tailscale netcheck 也能发现它并确认为最近节点,但就是不从它路由🥴

从我的经验来看,有可能需要等待一段时间(大概几个小时)。Tailscale 貌似会收集 derp 的历史连接信息用来判断。我最开始搭建好 derp 后也是先走了一段时间的 hkg,后面才用自建中转。

Kiprey commented 10 months ago

@lemon-o tailscale netcheck Report:

  • UDP: false
  • IPv4: (no addr found)
  • IPv6: no, but OS has support
  • MappingVariesByDestIP:
  • HairPinning:
  • PortMapping:
  • Nearest DERP: Myself Derper
  • DERP latency:
    • Myself: 136ms (Myself Derper)

为什么UDP和IPV4都没有呢?

我没看过这块的源代码,不过我猜测应该是你所在网络把 UDP 给禁用了(例如个别学校的校园网)。

禁用 UDP 信道会导致 tailscale 无法发送 UDP 包来获取当前与 DERP 连接的 IP 地址,因此 IPv4 为空。

Kiprey commented 10 months ago

@lemon-o 不是校园网哦 在Linux系统上是可以获取到udp和ipv4的 只有在Windows系统上不行 源码如下:暂时注释掉了derp部分 因为我的服务器延迟有点高 哈哈哈在 2024年1月4日,14:38,Kiprey @.***> 写道:

@lemon-o tailscale netcheck Report:

  • UDP: false
  • IPv4: (no addr found)
  • IPv6: no, but OS has support
  • MappingVariesByDestIP:
  • HairPinning:
  • PortMapping:
  • Nearest DERP: Myself Derper
  • DERP latency:
  • Myself: 136ms (Myself Derper) 为什么UDP和IPV4都没有呢?

我没看过这块的源代码,不过我猜测应该是你所在网络把 UDP 给禁用了(例如个别学校的校园网)。 禁用 UDP 信道会导致 tailscale 无法发送 UDP 包来获取当前与 DERP 连接的 IP 地址,因此 IPv4 为空。

—Reply to this email directly, view it on GitHub, or unsubscribe.You are receiving this because you were mentioned.Message ID: @.***>

从描述来看,我怀疑是网络阻断了高端口号的 UDP 流量。

我之前使用 zerotier 时遇到过类似情况,低端口号 UDP 流量放行,高端口号的 UDP 流量阻断。

Linux 中获取到的 UDP 应该只是本地网络的,即 Linux 可以通过 UDP 与本地网络进行交互,但没法确定发送到广域网的 UDP 包会不会被阻断。

不过总的来说,还是需要做更多的实验来推断结果。

Kiprey commented 10 months ago

@lemon-o 我根据Linux 中获取到的 ip地址进行检索 结果表明该IP地址为广域网 不知为何win系统下总是获取不到IP地址 换了多台电脑测试 结果依然如此 附件里可查看测试结果

可能是因为你用的邮件回复,我看不到你的附件和源码。或许你可以试试先在 DERP 服务器上运行一个 UDP 监听服务,然后本地 nc 过去看看能不能正常收发 UDP 消息。

或许可以参照我之前的测试流程 - 使用 Frpc 进行内网穿透构建 ZeroTier Moon 记录 - Frpc 测试

Xuxiaotuan commented 10 months ago

大佬,使用你的教程在自建 derp 测试的时候说证书失败了 ~/go/bin/derpprobe -derp-map file:///home/ubuntu/software/docker-headscale/container-config/derp-map.json -once 2024/01/15 11:01:27 Waiting for all probes (may take up to 1m) 2024/01/15 11:01:28 adding DERP TLS probe for test-derp () 2024/01/15 11:01:28 adding DERP UDP probe for test-derp (derp/useless-region-code/test-derp/udp6) 2024/01/15 11:01:28 adding DERP UDP probe for test-derp (derp/useless-region-code/test-derp/udp) 2024/01/15 11:01:28 adding DERP mesh probe for test-derp->test-derp () 2024/01/15 11:01:29 probe derp/useless-region-code/test-derp/tls: connecting to "kiprey-derp:8888": tls: failed to verify certificate: x509: certificate signed by unknown authority 2024/01/15 11:01:35 probe derp/useless-region-code/test-derp/test-derp/mesh: derp.Recv: EOF 2024/01/15 11:01:42 good: derp/useless-region-code/test-derp/udp6: 1.843284ms 2024/01/15 11:01:42 good: derp/useless-region-code/test-derp/udp: 369.908µs 2024/01/15 11:01:42 good: derpmap-probe: 23.302745ms 2024/01/15 11:01:42 bad: derp/useless-region-code/test-derp/test-derp/mesh: derp.Recv: EOF 2024/01/15 11:01:42 bad: derp/useless-region-code/test-derp/tls: connecting to "kiprey-derp:8888": tls: failed to verify certificate: x509: certificate signed by unknown authority

Kiprey commented 10 months ago

@Xuxiaotuan 大佬,使用你的教程在自建 derp 测试的时候说证书失败了

~/go/bin/derpprobe -derp-map file:///home/ubuntu/software/docker-headscale/container-config/derp-map.json -once

如果是 derpprobe 出现证书错误,那么是正常的,因为它的证书验证逻辑和实际客户端的证书验证逻辑不一致。

实际部署的时候只要打开 DERP-map 配置里的 InsecureForTests 为 true 就好。
这个配置打开后则客户端不会验证 TLS 证书的有效性(但是还是要有一个证书,这也是为什么要搞一个自签名证书)。

Xuxiaotuan commented 10 months ago

@Xuxiaotuan 大佬,使用你的教程在自建 derp 测试的时候说证书失败了

~/go/bin/derpprobe -derp-map file:///home/ubuntu/software/docker-headscale/container-config/derp-map.json -once

如果是 derpprobe 出现证书错误,那么是正常的,因为它的证书验证逻辑和实际客户端的证书验证逻辑不一致。

实际部署的时候只要打开 DERP-map 配置里的 InsecureForTests 为 true 就好。 这个配置打开后则客户端不会验证 TLS 证书的有效性(但是还是要有一个证书,这也是为什么要搞一个自签名证书)。

嗯嗯 我加上去这个参数了的。现在错误就不显示证书错误了。但我现在另一台机器netcheck它,显示

# Health check:
#     - not connected to home DERP region 900
(base)

查看sudo systemctl status tailscale-derp是

Jan 17 14:30:36 xxt-tx derper[4421]: 2024/01/17 14:30:36 http: TLS handshake error from 64.62.197.54:12599: cert mismatch with hostname: ""
Jan 17 15:26:01 xxt-tx derper[4421]: 2024/01/17 15:26:01 derp: [::1]:39652: client xxx rejected: client nodekey:xxx not in set of peers
Jan 17 15:28:28 xxt-tx derper[4421]: 2024/01/17 15:28:28 derp: 127.0.0.1:54842: client xxx rejected: client nodekey:xxx not in set of peers

derpprobe的结果是

2024/01/17 15:36:55 Waiting for all probes (may take up to 1m)
2024/01/17 15:36:56 adding DERP TLS probe for test-derp ()
2024/01/17 15:36:56 adding DERP UDP probe for test-derp (derp/useless-region-code/test-derp/udp6)
2024/01/17 15:36:56 adding DERP UDP probe for test-derp (derp/useless-region-code/test-derp/udp)
2024/01/17 15:36:56 adding DERP mesh probe for test-derp->test-derp ()
2024/01/17 15:36:57 probe derp/useless-region-code/test-derp/tls: connecting to "kiprey-derp:8888": dial tcp: lookup kiprey-derp on 127.0.0.53:53: server misbehaving
2024/01/17 15:37:03 probe derp/useless-region-code/test-derp/test-derp/mesh: derp.Recv: EOF
2024/01/17 15:37:09 probe derp/useless-region-code/test-derp/udp6: timeout reading from ::1: read udp [::]:38605: i/o timeout
2024/01/17 15:37:23 probe derp/useless-region-code/test-derp/udp: timeout reading from 127.0.0.1: read udp [::]:46096: i/o timeout
2024/01/17 15:37:23 good: derpmap-probe: 3.594945ms
2024/01/17 15:37:23 bad: derp/useless-region-code/test-derp/test-derp/mesh: derp.Recv: EOF
2024/01/17 15:37:23 bad: derp/useless-region-code/test-derp/tls: connecting to "kiprey-derp:8888": dial tcp: lookup kiprey-derp on 127.0.0.53:53: server misbehaving
2024/01/17 15:37:23 bad: derp/useless-region-code/test-derp/udp6: timeout reading from ::1: read udp [::]:38605: i/o timeout
2024/01/17 15:37:23 bad: derp/useless-region-code/test-derp/udp: timeout reading from 127.0.0.1: read udp [::]:46096: i/o timeout
Kiprey commented 10 months ago

@Xuxiaotuan

# Health check:
#     - not connected to home DERP region 900
(base)

查看sudo systemctl status tailscale-derp是

Jan 17 14:30:36 xxt-tx derper[4421]: 2024/01/17 14:30:36 http: TLS handshake error from 64.62.197.54:12599: cert mismatch with hostname: ""
Jan 17 15:26:01 xxt-tx derper[4421]: 2024/01/17 15:26:01 derp: [::1]:39652: client xxx rejected: client nodekey:xxx not in set of peers
Jan 17 15:28:28 xxt-tx derper[4421]: 2024/01/17 15:28:28 derp: 127.0.0.1:54842: client xxx rejected: client nodekey:xxx not in set of peers
  1. 检查配置 DERP-Map 时用的 HostName 与 DERP Server 上的自签名证书是否存在不一致。

    因为 DERP 服务会对 Client 的连接进行校验,确保 Client 发送来的 ServerName 与本地证书的 HostName 一致。

  2. 检查 DERP SERVER 是否存在开了 --verify-client 参数但其本身并非 tailscale 节点的情况。

    可以指定参数 verify-clients 来限制使用当前 DERP 服务的只能是自己的 tailscale 节点,防止白嫖。不过启用该服务需要当前 DERP 服务器本身就是一个 tailscale 节点,或者存在 socket 文件 /var/run/tailscale/tailscaled.sock

以上引用部分来自于本文原文,如果有需要的话可以直接文字搜索到对应那一段,描述会更详细一点。

Xuxiaotuan commented 10 months ago

@Xuxiaotuan

# Health check:
#     - not connected to home DERP region 900
(base)

查看sudo systemctl status tailscale-derp是

Jan 17 14:30:36 xxt-tx derper[4421]: 2024/01/17 14:30:36 http: TLS handshake error from 64.62.197.54:12599: cert mismatch with hostname: ""
Jan 17 15:26:01 xxt-tx derper[4421]: 2024/01/17 15:26:01 derp: [::1]:39652: client xxx rejected: client nodekey:xxx not in set of peers
Jan 17 15:28:28 xxt-tx derper[4421]: 2024/01/17 15:28:28 derp: 127.0.0.1:54842: client xxx rejected: client nodekey:xxx not in set of peers
  1. 检查配置 DERP-Map 时用的 HostName 与 DERP Server 上的自签名证书是否存在不一致。

因为 DERP 服务会对 Client 的连接进行校验,确保 Client 发送来的 ServerName 与本地证书的 HostName 一致。

  1. 检查 DERP SERVER 是否存在开了 --verify-client 参数但其本身并非 tailscale 节点的情况。

可以指定参数 verify-clients 来限制使用当前 DERP 服务的只能是自己的 tailscale 节点,防止白嫖。不过启用该服务需要当前 DERP 服务器本身就是一个 tailscale 节点,或者存在 socket 文件 /var/run/tailscale/tailscaled.sock

以上引用部分来自于本文原文,如果有需要的话可以直接文字搜索到对应那一段,描述会更详细一点。

  1. 证书是一致的
  2. 目前看确实是开了--verify-client 导致, 是要先开tailscale 还是后开, 现在就是看拿的key不一样
  3. a.b.c.d 这个是填腾讯云的ip还是 就是单纯的a.b.c.d?
Kiprey commented 10 months ago

@Xuxiaotuan

  1. 证书是一致的
  2. 目前看确实是开了--verify-client 导致, 是要先开tailscale 还是后开, 现在就是看拿的key不一样
  3. a.b.c.d 这个是填腾讯云的ip还是 就是单纯的a.b.c.d?
  1. 证书一样的话,参照本文 测试连通性 一节,脱离 tailscale 手动测试与 DERP 的连通性(连通性测试包括证书的使用)。
  2. 先开 tailscale。 DERP-Server 会向本地 tailscale 节点验证传入的 tailscale-key 是否是已知的,从报错信息上来看 DERP 没有将这个 client 识别为已知节点。
  3. DERP_PUB_IP="a.b.c.d“ 这个填写能连接到 DERP SERVER 的 具体公网 IP
Xuxiaotuan commented 10 months ago

@Xuxiaotuan

  1. 证书是一致的
  2. 目前看确实是开了--verify-client 导致, 是要先开tailscale 还是后开, 现在就是看拿的key不一样
  3. a.b.c.d 这个是填腾讯云的ip还是 就是单纯的a.b.c.d?
  1. 证书一样的话,参照本文 测试连通性 一节,脱离 tailscale 手动测试与 DERP 的连通性(连通性测试包括证书的使用)。
  2. 先开 tailscale。 DERP-Server 会向本地 tailscale 节点验证传入的 tailscale-key 是否是已知的,从报错信息上来看 DERP 没有将这个 client 识别为已知节点。
  3. DERP_PUB_IP="a.b.c.d“ 这个填写能连接到 DERP SERVER 的 具体公网 IP
  1. 去掉--verify-client校验 连接是通的
  2. 本地是开了tailscale的 然后还是会出现识别不了的问题 (用的就是官网的 ubuntu裸机部署tailscale https://tailscale.com/download/linux
  3. okok 这个已经修改了
Kiprey commented 10 months ago

@Xuxiaotuan

  1. 去掉--verify-client校验 连接是通的
  2. 本地是开了tailscale的 然后还是会出现识别不了的问题 (用的就是官网的 ubuntu裸机部署tailscale https://tailscale.com/download/linux
  3. okok 这个已经修改了

如果去掉 verify-client 后问题都不存在了,那问题应该只能出在这个地方了。

DERP SERVER 部署了 tailscale 后别忘记将其加入自己的 tailnet 里,不然 DERP SERVER 不会知道各个 client 的 pubkey 的。

Kiprey commented 10 months ago

@Xuxiaotuan

  1. 证书一样的话,参照本文 测试连通性 一节,脱离 tailscale 手动测试与 DERP 的连通性(连通性测试包括证书的使用)。
  1. 去掉--verify-client校验 连接是通的

测试连通性一节不会受到 verify-client 选项所约束,那个只是约束 tailscale client 能否被 DERP SERVER 接受,至于 https 网页用个 curl 都能连。

Xuxiaotuan commented 10 months ago

@Xuxiaotuan

  1. 去掉--verify-client校验 连接是通的
  2. 本地是开了tailscale的 然后还是会出现识别不了的问题 (用的就是官网的 ubuntu裸机部署tailscale https://tailscale.com/download/linux)
  3. okok 这个已经修改了

如果去掉 verify-client 后问题都不存在了,那问题应该只能出在这个地方了。

DERP SERVER 部署了 tailscale 后别忘记将其加入自己的 tailnet 里,不然 DERP SERVER 不会知道各个 client 的 pubkey 的。

这里面可能有一个出入,我用的是docker部署headscale 比如我部署的云服务机器 是100.64.0.6 本地机器是5 双方是能互通的 已经在headscale的nodes list里面了

Kiprey commented 10 months ago

@Xuxiaotuan

这里面可能有一个出入,我用的是docker部署headscale 比如我部署的云服务机器 是100.64.0.6 本地机器是5 双方是能互通的 已经在headscale的nodes list里面了

这样的话,

  1. 证书问题如果不想再继续折腾,一劳永逸的办法是把 DERP SEVER 那部分校验代码去掉就行,会省很多麻烦。本文那些比较琐碎的操作主要是不想改代码所以多折腾了几下。
  2. headscale 的话,也应该是要配置本地 tailscale 连接到 headscale 中。不过既然双方都已经在 headscale 的 node list 里了,确认一下报错信息中的 nodekey:xxx 是不是已经在子网中了。这个在 tailscale 是可以直接登陆管理面板上查看,headscale 我没用过可能需要找一找管理面板上有没有这个东西。不过我想着既然 DERP SERVER 和 client 能够通过 tailscale 互联 的话,那应该也不会是这个问题才对,有点怪,只能多检查检查了。
Xuxiaotuan commented 10 months ago

@Xuxiaotuan

这里面可能有一个出入,我用的是docker部署headscale 比如我部署的云服务机器 是100.64.0.6 本地机器是5 双方是能互通的 已经在headscale的nodes list里面了

这样的话,

  1. 证书问题如果不想再继续折腾,一劳永逸的办法是把 DERP SEVER 那部分校验代码去掉就行,会省很多麻烦。本文那些比较琐碎的操作主要是不想改代码所以多折腾了几下。
  2. headscale 的话,也应该是要配置本地 tailscale 连接到 headscale 中。不过既然双方都已经在 headscale 的 node list 里了,确认一下报错信息中的 nodekey:xxx 是不是已经在子网中了。这个在 tailscale 是可以直接登陆管理面板上查看,headscale 我没用过可能需要找一找管理面板上有没有这个东西。不过我想着既然 DERP SERVER 和 client 能够通过 tailscale 互联 的话,那应该也不会是这个问题才对,有点怪,只能多检查检查了。

嗯嗯。有了大概思路了 我多去试试 谢谢大佬

Xuxiaotuan commented 10 months ago

@Xuxiaotuan

这里面可能有一个出入,我用的是docker部署headscale 比如我部署的云服务机器 是100.64.0.6 本地机器是5 双方是能互通的 已经在headscale的nodes list里面了

这样的话,

  1. 证书问题如果不想再继续折腾,一劳永逸的办法是把 DERP SEVER 那部分校验代码去掉就行,会省很多麻烦。本文那些比较琐碎的操作主要是不想改代码所以多折腾了几下。
  2. headscale 的话,也应该是要配置本地 tailscale 连接到 headscale 中。不过既然双方都已经在 headscale 的 node list 里了,确认一下报错信息中的 nodekey:xxx 是不是已经在子网中了。这个在 tailscale 是可以直接登陆管理面板上查看,headscale 我没用过可能需要找一找管理面板上有没有这个东西。不过我想着既然 DERP SERVER 和 client 能够通过 tailscale 互联 的话,那应该也不会是这个问题才对,有点怪,只能多检查检查了。

从headscale切换回官网的就瞬间连通了

blogx commented 9 months ago

请教,tcp和udp端口外网都是通的。 最后运行服务,连不上是怎么回事啊?

Calcifer97 commented 9 months ago

搭建好了。但是日志经常出现这个怎么解决: 2月 05 15:19:18 qh-deepin tailscaled[3162512]: netcheck: netcheck.runProbe: named node "900a" has no address

Cognitohazard commented 8 months ago

可能有点跑题,但是这里有没有人知道海外自建DERP连一个放在海外的NAS(不用exit node)有没有被墙的风险?

RuohaoYan commented 8 months ago

请问有时能检测到MyDrep,有时检测不到是什么原因

hellodword commented 6 months ago

感谢这篇文章,贴几点我的理解或者确认过的,不对的地方欢迎指正:

  1. 除了 "RegionCode": "MyDerp", 可以再加个 "RegionName": "MyDerp", ,这样 netcheck 时不会有个空白的括号

  2. 自建的 DERP Server 是否安全或是 TLS connection 是否安全,都不会严重影响大部分用例中 tailscale 用户端到端加密的安全性,我在源码中也没有发现 MITM 风险,官方也有回应,见 https://github.com/tailscale/tailscale/issues/12107

  3. 如果 InsecureForTests 未来被移除,在设备上安装自签名证书应该就可以,其实现在也建议这么做,见 https://github.com/tailscale/tailscale/issues/3701#issuecomment-1010124973

  4. --verify-clients 的前提是 DERP server 也是节点之一,但是如果你和我一样并不信任自建 DERP 服务器的安全(被黑、被审查等)所以很担心它加入节点,我觉得可以通过 ACL 以及各设备上的原生防火墙来约束该节点,或者从这段代码下手,通过 verify-client-url 和一点点代码应该就能实现 不把 DERP server 添加为节点的同时限制别人使用

困扰某国用户自建 DERP 的好像主要还是因为 tailscale DERP 使用 HTTP,不过好消息是官方有计划迁移到非 HTTP,这解决不了 DERP 被墙但肯定是能缓解国内自建 DERP 域名备案等问题了: https://github.com/tailscale/tailscale/issues/7745#issuecomment-1566140833


关于上面提到的第 4 点,我写了点简单的代码: https://github.com/hellodword/tailscale-derp-client-verifier

CSU-LLF commented 4 months ago

@Xuxiaotuan

这里面可能有一个出入,我用的是docker部署headscale 比如我部署的云服务机器 是100.64.0.6 本地机器是5 双方是能互通的 已经在headscale的nodes list里面了

这样的话,

  1. 证书问题如果不想再继续折腾,一劳永逸的办法是把 DERP SEVER 那部分校验代码去掉就行,会省很多麻烦。本文那些比较琐碎的操作主要是不想改代码所以多折腾了几下。
  2. headscale 的话,也应该是要配置本地 tailscale 连接到 headscale 中。不过既然双方都已经在 headscale 的 node list 里了,确认一下报错信息中的 nodekey:xxx 是不是已经在子网中了。这个在 tailscale 是可以直接登陆管理面板上查看,headscale 我没用过可能需要找一找管理面板上有没有这个东西。不过我想着既然 DERP SERVER 和 client 能够通过 tailscale 互联 的话,那应该也不会是这个问题才对,有点怪,只能多检查检查了。

从headscale切换回官网的就瞬间连通了

能具体谈一下解决方案吗?如果用的是官网的acl

fhb302 commented 4 months ago

我按照帖子中的方法进行了设置,但是还是存在问题,服务器可以被derp发现,端口全部放开(包括采用后台和iptables),但是无法建立连接,使用 tailscale status 发现错误:

Health check:

  • not connected to home DERP region 900

并且采用 systemctl status tailscale-derp 命令查询发现如下错误:

derp: [ip]:19703: client <此处为很长的数字> rejected: failed to query local tailscaled status: Failed to connect to local Tailscale daemon for /localapi/v0/status; not running? Error: dial unix /var/run/tailscale/tailscaled.sock: connect: no such file or directory

请问有相同的情况的么?

Kiprey commented 4 months ago

把 derp 服务参数的 --verify-client 参数去掉试试

------------------ 原始邮件 ------------------ 发件人: bingoner @.> 发送时间: 2024年7月9日 00:18 收件人: Kiprey/Kiprey.github.io @.> 抄送: Kiprey @.>, Author @.> 主题: Re: [Kiprey/Kiprey.github.io] 浅探 Tailscale DERP 中转服务 | Kiprey's Blog (Issue #114)

我按照帖子中的方法进行了设置,但是还是存在问题,服务器可以被derp发现,端口全部放开(包括采用后台和iptables),但是无法建立连接,使用 tailscale status 发现错误:

Health check:

并且采用 systemctl status tailscale-derp 命令查询发现如下错误:

derp: [ip]:19703: client <此处为很长的数字> rejected: failed to query local tailscaled status: Failed to connect to local Tailscale daemon for /localapi/v0/status; not running? Error: dial unix /var/run/tailscale/tailscaled.sock: connect: no such file or directory

请问有相同的情况的么?

— Reply to this email directly, view it on GitHub, or unsubscribe. You are receiving this because you authored the thread.Message ID: @.***>

fhb302 commented 4 months ago

@Kiprey 把 derp 服务参数的 --verify-client 参数去掉试试

------------------ 原始邮件 ------------------ 发件人: bingoner @.> 发送时间: 2024年7月9日 00:18 收件人: Kiprey/Kiprey.github.io @.> 抄送: Kiprey @.>, Author @.> 主题: Re: [Kiprey/Kiprey.github.io] 浅探 Tailscale DERP 中转服务 | Kiprey's Blog (Issue #114)

我按照帖子中的方法进行了设置,但是还是存在问题,服务器可以被derp发现,端口全部放开(包括采用后台和iptables),但是无法建立连接,使用 tailscale status 发现错误:

Health check:

  • not connected to home DERP region 900

并且采用 systemctl status tailscale-derp 命令查询发现如下错误:

derp: [ip]:19703: client <此处为很长的数字> rejected: failed to query local tailscaled status: Failed to connect to local Tailscale daemon for /localapi/v0/status; not running? Error: dial unix /var/run/tailscale/tailscaled.sock: connect: no such file or directory

请问有相同的情况的么?

— Reply to this email directly, view it on GitHub, or unsubscribe. You are receiving this because you authored the thread.Message ID: @.***>

神医!药到病除!还是自己没有认真读前置条件,前面作者您写了:

可以指定参数 verify-clients 来限制使用当前 DERP 服务的只能是自己的 tailscale 节点,防止白嫖。不过启用该服务需要当前 DERP 服务器本身就是一个 tailscale 节点,或者存在 socket 文件 /var/run/tailscale/tailscaled.sock。

xiangyue1993 commented 4 months ago

搭建好了。但是日志经常出现这个怎么解决: 2月 05 15:19:18 qh-deepin tailscaled[3162512]: netcheck: netcheck.runProbe: named node "900a" has no address

同样的问题,不知道咋回事

seasonfif commented 2 months ago

请教 按教程derper搭建在自己nas上面 tailscale也安装在此 公网ip绑定了域名,ACL中配置后 nas执行tailscale netcheck --verbose无法获得ip 报错信息如下 14:17:07 netcheck: portMap done 14:17:07 netcheck: UDP is blocked, trying ICMP 14:17:07 netcheck: netcheck: UDP is blocked, trying HTTPS 14:17:08 netcheck: [v1] measuring ICMP latency of myown (901): context deadline exceeded 14:17:08 netcheck: [v1] netcheck: measuring HTTPS latency of myown (901): context deadline exceeded