我的心里除了露娜大人已经装不下其他女人了

为什么我选择 Tailscale

相信在看这篇博客的人家中都有 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/tailscaledPORT 的值来固定端口,并且将此端口映射出去,来确保 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 更新)

为什么我选择 Tailscale

https://www.9bingyin.com/archives/why-i-choose-tailscale.html

作者

bingyin

发布时间

2023-03-03

许可协议

CC BY 4.0

添加新评论