相信在看这篇博客的人家中都有 NAS 或其他需要出门在外访问的内网设备,由于我是自己组的 NAS 因此没有 Synology QuickConnect 这种方便的服务,并且我也不想再购置服务器去自建 FRP 服务(穷),因此类似 Zerotier 或者 Tailscale 这种异地组网的方案对我来说就非常合适了。
首先说一下为什么不考虑使用 FRP、Ngrok、DDNSTO 这类内网穿透应用或是直接把端口映射到公网,个人认为直接将内网服务直接暴露在公网是一个十分危险的行为,即使服务并不涉及敏感内容,但是还是会存在一定安全风险,因此不考虑。
还有就是“为什么不用蒲公英”,其实我最开始考虑的方案就是用蒲公英,但是蒲公英并不支持使用自己的设备作为旁路网关,来转发内网设备(个人 / 免费套餐),需要额外购买硬件,因此不考虑。
Zerotier 和 Tailscale 的不同
协议
首先最大的一点就是协议上的不同了
Zerotier是使用的私有协议,而 Tailscale 则是使用 WireGuard ,这点对于我来说没有太大的区别。
收费方面
第二是免费额度方面 Zerotier 目前最多支持 25 台设备和 1 个全局管理员,而 Tailscale 为 20 台设备和 1 个全局管理员,个人使用是足够了。Tailscale 现在是 100 台设备和 3 个成员了(2023/04/20 更新)
不同的是 Tailscale 只支持一个网络,并且对路由条目有限制,免费账户最多只能使用 1 条路由。
还有对于权限的划分,Tailscale 可以使用 ACL 进行更详细的权限划分(免费账户仅支持单条规则),不过我也用不到,想要了解的话建议查看官方文档。
顺带一提,Zerotier 和 Tailscale 都是可以自建 control server 和中转服务器的,但是客户端对于 IOS 使用自建 control server 的支持都基本没有,并且自建 control server 也需要一定的服务器费用,因此我还是选择使用官方服务。
使用方面
P2P 打洞
这类应用最重要的一个指标就是打洞成功率了,由于我在我家部署了防火墙设备并且也关闭了 UPnP 服务,因此只能使用端口转发来确保打洞成功率了。
Zerotier 的官方文档是这样写的
Default zerotier-one listening ports are:
- 9993
- Secondary Port, randomized each start up and after being “offline” for too long.
- Random Port for UPnP (UPnP is not required for ZeroTier hole punching to work)
For best results, a device needs be able to send to any IP address, on any UDP port.
If you allow outgoing source:9993 and incoming related return traffic, it’ll probably work OK.
经过我的测试在仅映射 9993 端口的情况下是无法成功打洞的,除非对端满足以上情况,否则无法直接进行 P2P 连接。
也就是说在最理想的情况下我需要将我 Zerotier 客户端上的所有 UDP 端口都映射出去或者开启 UPnP,但是我的客户端上面有一些别的内网服务,我也不想专门起一个虚拟机来放 Zerotier,因此我就放弃了 Zerotier,这也是我放弃 Zerotier 的主要原因。
Tailscale 在官方文档里的描述是
In these cases, you may consider opening a firewall port to help Tailscale connect peer-to-peer:
Let your internal devices initiate TCP connections to
*:443
.Connections to the control server and other backend systems and data connections to the DERP relays use HTTPS on port 443. The set of DERP relays, in particular, grows over time. We recommend
*:443
because attempting to enumerate the set of allowed destinations is almost certain to break your connectivity in the future in ways which won’t immediately resemble a firewall issue. Nodes might lose all contact, or might only partially lose contact between what will appear to be random pairs of devices because one of them is blocked from communicating with a specific DERP.Let your internal devices initiate UDP from
:41641
to*:*
.Direct WireGuard tunnels use UDP with source port 41641. We recommend
*:*
because you cannot possibly predict every guest Wi-fi, coffee shop, LTE provider, or hotel network that your users may be using.Let your internal devices initiate UDP from
:3478
to*:*
.The STUN protocol lets a machine behind NAT ask a machine on the open internet what IP address it sees, allowing the machine behind NAT to figure out its public IP address. STUN also reports the port number seen, which allows
tailscaled
to determine if it is behind “easy NAT” (source port maps to the same external port for all destinations) or “hard NAT” (port number varies per destination).tailscaled
only sends STUN to DERP servers, but the set of DERP servers expands over time so we recommend*:*
in the rule.
根据官方描述只需要将 41641 端口映射出去或是开启 UPnP 就能成功建立 P2P 连接,不过经过我的测试 Tailscale 客户端有时候默认并不会使用 41641 这个端口,但如果你是 Linux 客户端的话可以修改 /etc/default/tailscaled
中 PORT
的值来固定端口,并且将此端口映射出去,来确保 P2P 连接建立的成功率。
内网设备转发
Zerotier 如果需要转发内网设备并不能简单的通过官方应用来实现,而是需要手动添加 iptables 规则(以下并非最优解)
iptables -A FORWARD -d 内网网段 -j ACCEPT
iptables -t nat -A POSTROUTING -j MASQUERADE
Tailscale 则是可以直接通过在应用添加参数 --advertise-routes=内网网段
即可,这也是我更喜欢 Tailscale 的原因。
最后的一点小尾巴
Tailscale 个人套餐只能一个用户使用,并且共享的设备并不支持共享路由条目,因此如果想将内网的一些服务共享给朋友的话并不是很方便,官方建议是购买企业套餐。
由于企业套餐的价格原因,秉承着能省就省的原则,我目前的解决方法是,注册一个微软账号专门用于 Tailscale,和朋友共享一个账号,不过这样做也有些安全方面的弊端,因此只能共享给信得过的朋友,现在免费套餐支持三个成员,对我来说是完全够用了(2023/04/20 更新)。
注意:Tailscale 需要使用同一个域名下(非公共域名)的邮箱注册才能邀请成员,也就是说你需要一个自己的域名邮箱,我的做法是把域名添加到 Cloudflare 然后用路由功能把邮件路由到已有邮箱,再拿域名邮箱去注册微软账号。(2023/04/20 更新)
请教一下,VPS上安装tailscale作为Exit-node作为代理,这种方式有什么安全隐患吗?因为我的vps的ip国内目前是可以正常访问的。我担心这样代理会被GFW检测到然后封掉我的vps的ip
from--august (augusttty@gmail.com)
august 10-05
这个需要你自行判断了,我暂时没有这样使用过 Tailscale,不过我海外的朋友通过 Tailscale 连接我家里的 NAS 也没遇到过什么问题
bingyin 10-06 回复 @august
Tailscale唯一的问题就是首次登录认证设备需要翻墙...
router 09-28
可以试试自建 headscale
bingyin 10-01 回复 @router
楼主好!我是在windows上使用tun模式来全局代理的。但是有个问题是tailscale经常掉线,只有把tun关掉让tailscale连上之后,再打开tun,才能正常工作。
好像clash的tun有解决方案,但是我用的是netch,一个v2ray节点,目前不知道该怎么解决
想问一下您遇到过类似的情景么?
tun 2023-06-28
根据 Tailscale 的官方文档来看是无法同时使用的,不过根据你的描述,很可能是因为 Netch 代理了你本地到 Tailscale 的流量,可以尝试不代理 Tailscale 的网页 / DERP 等服务,以及 Tailscale 用到的网段(可参考 https://tailscale.com/kb/1105/other-vpns)
bingyin 2023-06-30 回复 @tun
楼主好,方便的话,能联系一下吗,求助。
我正在部署Tailscale,使用官方服务,很容易的连接了。 我想在国内建中转服务。
Zerotier的国内moon中转,不能用于iphone。
那么,Tailscale的国内DERP中转,可以用于iphone?
谢谢。
我的联系方式: jzsmqss@gmail.com 或者 https://t.me/samuelsong
samuelsong 2023-06-27
可以建立 P2P 连接的话就没必要用中转了
Tailscale DERP 是官方提供的一个功能,可以在所有客户端使用
具体可以参考
https://icloudnative.io/posts/custom-derp-servers/#%E8%87%AA%E5%BB%BA%E7%A7%81%E6%9C%89-derp-server
https://tailscale.com/kb/1118/custom-derp-servers/
bingyin 2023-06-28 回复 @samuelsong