实名推荐虚拟组网套件——Tailscale

网络安全
查看原帖

在模态框中查看主贴与评论的删除、修改和新增情况。

906051999
906051999 楼主
#1

关键词

  • Tailscale
  • Subnet routes
  • Exit node

引言

使用Tailscale配置好虚拟组网生态后,我个人沉浸式使用了半年时间,非常好用,非常优雅的满足了我的各种使用需求,忍不住要向大伙儿分享

先说句题外话,之前分享自建Tailscale节点教程的时候,很多佬友在评论区留言说觉得Tailscale用起来太复杂了,还是Zerotier更简单上手。

从我个人的使用体验来说,Zerotier的优势在于节点认证十分简单,设备只需要一串代码就能入网,而基于官方认证系统的Tailscale就需要良好的网络环境,仅从认证这一环节来看,Tailscale确实没有优势(Headscale自建认证系统虽然能解决这个问题,但是对我来说又太麻烦了)

那我为什么最后还是选择使用Tailscale作为我的个人家庭虚拟组网套件呢?

正文

设备情况

首先介绍我的个人设备网络情况,两个局域网不在一个城市:

局域网A下部署一个主路由,该网关下有我的NAS、Ubuntu和软路由;

在另一个局域网B中部署一个副路由,该网关下有我的PC、iPad、手机。

我的需求就是能够随时随地、便捷地访问和配置A网下的所有设备。

graph TD
    subgraph "局域网A"
        A_GW[主路由] --> NAS[NAS]
        A_GW --> Ubuntu[Ubuntu 主机]
        A_GW --> SoftRouter[软路由]
    end

    subgraph "局域网B"
        B_GW[副路由] --> PC[PC]
        B_GW --> iPad[iPad]
        B_GW --> Phone[手机]
    end

    A_GW <-->|虚拟组网| B_GW

    style A_GW fill:#cde4ff,stroke:#333
    style B_GW fill:#ffe4cd,stroke:#333 

Subnet routes(子网路由器)

这时就要使用到Tailscale的Subnet routes(子网路由器)功能,这也是最吸引我的功能。

虚拟组网会给子网设备分配虚拟的IP地址,这个地址可以自定义。

但是这就有一个不方便的地方,比如说我在局域网环境下访问NAS上的站点服务(如emby、群晖主页)时,已经保存有cookie和历史记录,很多站点服务的端口、账号、密码,我都完全依赖chrome的联想和自动补全,如果在虚拟局域网环境下NAS的IP改变了,就意味着我需要重新输一遍,这对我来说太麻烦了。

而 Subnet routes(子网路由器)可以实现将局域网的某个子网设备作为路由器将一个网段共享,什么意思呢,就是我在虚拟组网环境下,依然可以直接通过访问局域网IP来直接访问设备,不需要做任何调整

这是一种极大便利,因为我会在手机、平板、电脑上访问局域网下的多个设备,这涉及到十几个应用或窗口,如果都需要一一调整IP,我会裂开的。

而且这个功能的优势在于,你只需要将局域网中一台设备设置为Subnet routes(子网路由器),就可以在虚拟网络环境下访问整个局域网中同网关下的任意设备,甚至可以远程使用打印机(连WIFI的那种),对于局域网设备多的用户来说,减少了太多配置成本。

特别是当你的设备回到局域网环境中时,一切配置都不需要调整的感觉,你想象那种爽感吗?

Exit node(出口节点)

接下来这个功能,我用的不多,但是对于某些场景,实用性是相当高的。

Exit node(出口节点)就是可以将任意一个虚拟组网设备a配置为流量出口节点,如果你在另一个虚拟组网设备b中将设备a选中为出口节点,那么此时你的设备b的所有流量都会通过a中转。

是不是很像VPN?

已经有了clash,这个功能有什么意义呢?

举例子:

  1. 在手机上同时只能启动一个VPN,如果你使用了Tailscale,你就不能同时使用clash。但如果此时你刚好有一个组网设备实现了科学上网,那么将它作为Exit node(出口节点),在手机上选择它,你就能同时实现虚拟组网+科学上网。

  2. 又或者有一些设备突然需要科学上网,但是不方便配置clash,或者懒得折腾,直接使用Exit node(出口节点)功能,就能瞬间解决这个难题。

  3. 再或者在一些业务场景中,某些APP或网站不允许异地登录或者频繁更换IP,你也可以将一个固定家宽设备作为Exit node(出口节点),其他登录设备都将其选择它作为流量出口。

这个功能虽然对我来说使用频率并不高,但是用起来几乎没有任何成本,偶尔用上了就会感到爽的不行。

STUN内网穿透强行实现P2P

接下来这个玩法,我怀疑全网估计都没人说过,虽然原理并不复杂。

Tailscale之所以需要自建derp,一个是增加NAT打洞概率,一个是为了设备NAT打洞失败情况下,也能回退到中继保持联通

但是现实的网络环境并不总受自己掌控,特别是在外租房,那网络环境更是一个比一个逆天,一个比一个复杂,所以NAT打洞几乎是不可能的。

如果我只能使用中继节点的3Mbps“大”水管看emby,那真不如看在线资源

所以之前我在主路由部署了lucky,使用STUN内网穿透随便给一个端口打了一个洞

没想到无心插柳柳成荫,这个穿透出来的地址就相当于我的局域网的公网IP,此时在Tailscale虚拟组网环境中ping我的局域网设备,都自动从STUN穿透地址实现了直连。

总结

实际上我在使用Tailscale时,并没有进行很复杂的配置,也没有仔细研究它的功能,我就是在使用过程中慢慢解锁了上面这些能力,然后才发现它帮我省了多少时间和精力,我非常乐意向你推荐这个宝藏虚拟组网套件。

这篇文章并不是教程,如果有佬友需要更具体的配置,可以留言说一下,我觉得使用起来还是很符合逻辑的。

优点小结

优点1:设备支持
我的个人设备几乎涵盖了所有主流操作系统:Windows、Ubuntu、OpenWrt、群晖、Mac OS、iPad OS、Android,而Tailscale支持以上所有设备,且你很方便的就能实现安装(应用商城、命令行、安装包)。

优点2:支持局域网IP
不管在什么网络环境下,都使用一个固定局域网IP访问设备,使用体验极好。

优点3:自选流量出口
将子网设备作为出口节点,实现流量转发功能。

题外话

说到STUN内网穿透,之前我也分享了一个内网穿透的使用手册,但是现在cloudflare调整了Free计划,好像已经用不了了。

而且之前的域名跳转也很不优雅,我最近想做一个STUN内网穿透2.0教程,并且开发了一个支持动态更新域名的轻量导航站,不知道有没有佬友觉得有意思的,对于导航站的建议可以随时提。

:heart:139:+1:19:clap:1:open_mouth:1
TOPIC OWNER
168楼层
167回复
88用户
906051999 momeo Chaosm Cat73 Xinalin marsgh

评论第 2 页,共 4 页

906051999
906051999 楼主 ↶ @ccqc
#52

你在命令行看看连接情况

tailscale status

然后再ping一下你要链接的设备

tailscale ping device
:heart:1
TOPIC OWNER
Lilo
#53

tailscale ping <设备名称或地址>

如果看到回应 pong from xxx via 某个 DERP 就是中转,如果看到 via 某个地址+端口 就是打洞直连了

:heart:5
HopeKnow
HopeKnow
#54

我一直不太会用 :tieba_008:

:heart:1
JoeCHEN99
JoeCHEN99
#55

可以试试easytier,感觉配置和使用方面更简单

:heart:3
Debrief3669
Debrief3669 ↶ @PKYF
#57

Access controls

有个这个的选项,
你不知道这个ACL,你怎么建的中转。。。你建了中转之后,需要在这里面配置的呀

:heart:1
1个回复
PKYF

不会配置感觉怎么设置都不会走我的路,明明我的路延迟最低。就是不走

:heart:1
↓ 跳到帖子
johnwick
johnwick
#58

感谢大佬 我有两个问题
新加坡vps 国内设备用它当exit node 很卡
还有就是如何智能分流 只让它转发被屏蔽的网站呢

:heart:1
2个回复
906051999
906051999 楼主

超纲了,我还真没这方向研究

TOPIC OWNER
Debrief3669
Debrief3669

他的exit node应该做不到智能分流,应该是全局VPN

:heart:2
↓ 跳到帖子
zeren
zeren
#59

现在有netbird,你也可以试下,可以自部署

:heart:1
#60

不会配置感觉怎么设置都不会走我的路,明明我的路延迟最低。就是不走

:heart:1
1个回复
Debrief3669
Debrief3669

这个可能的单独出个教程了。。。一般是这样配置的,然后有个重点,配置后,需要重启一下你的tailscale。。。重启后他才会识别到你ACL配置的derp。他不是配置后点保存就立即生效的。

...
"derpMap": {
		"OmitDefaultRegions": false,
		"Regions": {"900": {
			"RegionID":   900,
			"RegionCode": "gz", // 按需要填
			"RegionName": "Guangzhou", // 按需要填
			"Nodes": [{
				"Name":      "myderper", // 按需要填
				"RegionID":  900,
				"HostName":  "IP/HOST", // 改成自己的 IP/域名
				"DERPPort":  13477,
				"STUNPort":  13478,
				"CanPort80": false,
				"InsecureForTests": true // 去掉域名证书检测
			}],
		}},
	}
...

然后你tailscale netcheck看下输出里面,有没有这样的:

Report:
        * Time: 2025-07-03T07:42:24.617968Z
        * UDP: true
        * IPv4: yes, [REDACTED]
        * IPv6: no, but OS has support
        * MappingVariesByDestIP: true
        * PortMapping:
        * CaptivePortal: false
        * Nearest DERP: Guangzhou
        * DERP latency:
                -  gz: 25.1ms  (Guangzhou)
                - sfo: 174.8ms (San Francisco)
                - lax: 176.8ms (Los Angeles)
                - sea: 199ms   (Seattle)
                - hel: 219.2ms (Helsinki)

比如上面那个- gz: 25.1ms (Guangzhou)就表明识别到了自建的derp
然后,tailscale ping [ip/machine],ping一下你自己的另外一个机器,如果提示:pong from macmini ([REDACTED]) via DERP(gz) in 81ms,有DERP(gz)就表明走了对应的中转了

:heart:3
↓ 跳到帖子
handsome
handsome
#61

感谢推荐

:heart:1
906051999
906051999 楼主 ↶ @johnwick
#62

超纲了,我还真没这方向研究

TOPIC OWNER
Debrief3669
Debrief3669 ↶ @johnwick
#63

他的exit node应该做不到智能分流,应该是全局VPN

:heart:2
Debrief3669
Debrief3669 ↶ @PKYF
#64

这个可能的单独出个教程了。。。一般是这样配置的,然后有个重点,配置后,需要重启一下你的tailscale。。。重启后他才会识别到你ACL配置的derp。他不是配置后点保存就立即生效的。

...
"derpMap": {
		"OmitDefaultRegions": false,
		"Regions": {"900": {
			"RegionID":   900,
			"RegionCode": "gz", // 按需要填
			"RegionName": "Guangzhou", // 按需要填
			"Nodes": [{
				"Name":      "myderper", // 按需要填
				"RegionID":  900,
				"HostName":  "IP/HOST", // 改成自己的 IP/域名
				"DERPPort":  13477,
				"STUNPort":  13478,
				"CanPort80": false,
				"InsecureForTests": true // 去掉域名证书检测
			}],
		}},
	}
...

然后你tailscale netcheck看下输出里面,有没有这样的:

Report:
        * Time: 2025-07-03T07:42:24.617968Z
        * UDP: true
        * IPv4: yes, [REDACTED]
        * IPv6: no, but OS has support
        * MappingVariesByDestIP: true
        * PortMapping:
        * CaptivePortal: false
        * Nearest DERP: Guangzhou
        * DERP latency:
                -  gz: 25.1ms  (Guangzhou)
                - sfo: 174.8ms (San Francisco)
                - lax: 176.8ms (Los Angeles)
                - sea: 199ms   (Seattle)
                - hel: 219.2ms (Helsinki)

比如上面那个- gz: 25.1ms (Guangzhou)就表明识别到了自建的derp
然后,tailscale ping [ip/machine],ping一下你自己的另外一个机器,如果提示:pong from macmini ([REDACTED]) via DERP(gz) in 81ms,有DERP(gz)就表明走了对应的中转了

:heart:3
1个回复
PKYF

我也是这么写的但是就是不走自己建立的的。这些线路也出现了

:heart:1
↓ 跳到帖子
#65

我也是这么写的但是就是不走自己建立的的。这些线路也出现了

:heart:1
linuxso
#66

标记,研究一下

:heart:1
MorningStar_Lucif
MorningStar_Lucif
#67

mark

:heart:1
Tartaglia
Tartaglia
#68

学到了,感谢分享

:heart:1
Fayilor
Fayilor
#69

家宽建exit node的话,特别是国内,会有一个致命问题,那就是家宽的上行很低,这就导致其他使用exit node的节点下载速度提不上来,不知道有没有什么好的办法。

:heart:2
1个回复
Fayilor
Fayilor

另外最近正在尝试另一款同类型的netbird,感觉比tailscale可玩性更高,特别是控制机制更细致,比如可以将dns应用到不同的group上(可能包含多个peer),这点在tailscale上比较欠缺,我没研究过tailscale的acl是否可以做到,但是netbird的图形化操作很直观。

:heart:1
↓ 跳到帖子
grassroadsZ
#70

6666 ,我使用的是另外一个easy 的

:heart:1
Fayilor
Fayilor ↶ @Fayilor
#71

另外最近正在尝试另一款同类型的netbird,感觉比tailscale可玩性更高,特别是控制机制更细致,比如可以将dns应用到不同的group上(可能包含多个peer),这点在tailscale上比较欠缺,我没研究过tailscale的acl是否可以做到,但是netbird的图形化操作很直观。

:heart:1
1个回复
Debrief3669
Debrief3669

netbird部署就感觉复杂了点,认证也要自己部署一次

:heart:1
↓ 跳到帖子
TeQuant
TeQuant
#72

感谢佬友分享!

:heart:1
billzhen
billzhen
#73

佬,能否详细说说这个穿透的方式,需要穿透哪些端口?除了需要连接的服务如emby,还有什么tailscale自身的端口需要穿透出来吗

:heart:1
1个回复
billzhen
billzhen

另外,有一个不太道德的做法,白嫖derp节点

白嫖derp节点的方法

用fofa搜索fid="QSk7WHdA/IWH9oZf9xszuw==",让AI用序号排列命名,然后把这些中继服务器都填入ACL里。多次尝试连接,中继成功的,就注释掉或者另外保存一下,如果连接超时就删除掉。最后就能得到一个白嫖中继的列表了。进阶,还可以在fofa里先筛选附近城市的地址,延迟更低

新开一楼,以免前面的回复也一并被举报清理掉。

l站这么多打野节点/api,扫new-api的,我这个应该不违背规则吧。。。

:heart:6:+1:1:open_mouth:1
↓ 跳到帖子
viko
#74

easytier都有啊,自带打洞,打洞不成功会回退到中继,带子网路由,也带出口节点

:heart:1
1个回复
906051999
906051999 楼主

好吧,我孤陋寡闻了 :joy:

TOPIC OWNER
↓ 跳到帖子
soph1
#75

感谢分享

:heart:1
Fayilor
Fayilor
#76

还想到几个佬没提到的有意思功能:serve/funnel,taildrop(这个我超爱用,临时传文件很方便,特别是跨平台)。

:heart:2
billzhen
billzhen ↶ @billzhen
#77

另外,有一个不太道德的做法,白嫖derp节点

白嫖derp节点的方法

用fofa搜索fid="QSk7WHdA/IWH9oZf9xszuw==",让AI用序号排列命名,然后把这些中继服务器都填入ACL里。多次尝试连接,中继成功的,就注释掉或者另外保存一下,如果连接超时就删除掉。最后就能得到一个白嫖中继的列表了。进阶,还可以在fofa里先筛选附近城市的地址,延迟更低

新开一楼,以免前面的回复也一并被举报清理掉。

l站这么多打野节点/api,扫new-api的,我这个应该不违背规则吧。。。

:heart:6:+1:1:open_mouth:1
Specs
Specs
#78

MBP 设置为了 exit node,并且配置好了科学上网,然后 iPhone 上启动 tailscale 并且选择 MBP 作为 exit node,但是还是访问不了外网 :broken_heart:

:heart:1
1个回复
Fayilor
Fayilor

你需要让你的MBP上的代理工具接管所有入站流量?

↓ 跳到帖子
tseujinng
tseujinng
#79

Tailscale 确实好用,开箱即用的情况下从我家到学校也能跑到 100 Mbps 左右。

:heart:1
nerokim
nerokim
#80

感谢分享 :hand_with_index_finger_and_thumb_crossed:

:heart:1
cyilin
cyilin
#81

zerotier其实也有这个功能来着。

:+1:1:heart:1
906051999
906051999 楼主 ↶ @viko
#82

好吧,我孤陋寡闻了 :joy:

TOPIC OWNER
Fayilor
Fayilor ↶ @Specs
#83

你需要让你的MBP上的代理工具接管所有入站流量?

1个回复
Specs
Specs

iPhone上 tailscale 和 shadowrockets 只能同时开一个,开 tailscale 就不能科学上网了,我按这种方式试了下还是不能

↓ 跳到帖子
Specs
#84

iPhone上 tailscale 和 shadowrockets 只能同时开一个,开 tailscale 就不能科学上网了,我按这种方式试了下还是不能

2个回复
906051999
906051999 楼主

出口节点配置了吗

TOPIC OWNER
Fayilor
Fayilor

android上是一样的,但是我是在pc(windows)上开tailscale exit node + mihomo tun mode,让mihomo接管所有入站流量,这样手机端使用exit node,流量就会从pc代理出去。

:heart:1
↓ 跳到帖子
xiangyuejiu
xiangyuejiu ↶ @Cat73
#85

卧槽,我们实验室服务器经常断网的 :upside_down_face:,原来是tailscale的问题吗?

906051999
906051999 楼主 ↶ @Specs
#86

出口节点配置了吗

TOPIC OWNER
Fayilor
Fayilor ↶ @Specs
#88

android上是一样的,但是我是在pc(windows)上开tailscale exit node + mihomo tun mode,让mihomo接管所有入站流量,这样手机端使用exit node,流量就会从pc代理出去。

:heart:1
1个回复
johnwick
johnwick

需要两个设备在同一个真实的局域网吗

:heart:1
↓ 跳到帖子
shh122
shh122
#89

看不懂系列+1

:heart:1
Ben2008
Ben2008
#90

没有看到真姓名

:heart:1
Eggward_Han
Eggward_Han ↶ @NiceBo
#91

有点刑 感觉是不是很容易被扫到?

:heart:1
Eetern1ty
#93

谢谢分享

:heart:1
wxxt
wxxt
#94

一直用的付费derp服务。请问如何防止自建的derp被别人使用呢?

:heart:1
1个回复
Debrief3669
Debrief3669

可以加–verify-clients参数,对流量进行校验,这样别人就用不了了

:heart:1
↓ 跳到帖子
johnwick
johnwick ↶ @Fayilor
#95

需要两个设备在同一个真实的局域网吗

:heart:1
Debrief3669
Debrief3669 ↶ @Fayilor
#96

netbird部署就感觉复杂了点,认证也要自己部署一次

:heart:1
Debrief3669
Debrief3669 ↶ @wxxt
#97

可以加–verify-clients参数,对流量进行校验,这样别人就用不了了

:heart:1
lht19900714
lht19900714
#98

感谢分享

:heart:1
xsd173
#99

:tieba_087:最近v6限速严重,有空用用佬的教程搭一个Tailscale玩玩

:heart:1
a569781231
a569781231 ↶ @Xinalin
#100

目前是公网服务器搭建了 xui + tailscale linux

surge 配置代理

iOS [只开 Surge] 
    ↓ (通过 SSH/SS/VMess 等协议)
跳板机 [运行 Tailscale + 代理服务器]
    ↓ (通过 Tailscale)
Tailscale 网络内的其他设备
# Surge 配置示例
[Proxy]
跳板机 = vmess, 跳板机IP, 端口, ...

[Rule]
# 关键规则:Tailscale 网段走跳板机
IP-CIDR,100.64.0.0/10,跳板机
# 其他流量正常走
FINAL,DIRECT

非常完美!

:heart:2
1个回复
Xinalin
Xinalin

代理服务器+跳板机tun模式有些不优雅,你可以看下tailscale的userspace networking

简单来说,userspace模式下tailscale不会直接接管机器网络,而是简单提供一个http/socks5代理服务。这样你可以直接把surge分流后的流量怼进tailscale,而不是释放到跳板机的网络栈再被tun捕获

不过我自己的配置里是直接让软路由跑tailscale的,软路由用路由表把访问其他子网或是ts ip的包送进tailscale的tun设备,这样所有设备都可以无感互联

:heart:3
↓ 跳到帖子
Xinalin
#101

代理服务器+跳板机tun模式有些不优雅,你可以看下tailscale的userspace networking

简单来说,userspace模式下tailscale不会直接接管机器网络,而是简单提供一个http/socks5代理服务。这样你可以直接把surge分流后的流量怼进tailscale,而不是释放到跳板机的网络栈再被tun捕获

不过我自己的配置里是直接让软路由跑tailscale的,软路由用路由表把访问其他子网或是ts ip的包送进tailscale的tun设备,这样所有设备都可以无感互联

:heart:3
Cansher
Cansher
#102

感谢分享

:heart:1
Denial3938
#103

组网速度怎么样 我要是想串流 想局域网看4k 这块都可以吗

:heart:1