使用 IPv6 + Tailscale 实现 NAS 外网访问

在上一篇文章中写到我搭建了 NAS,但没有折腾外网访问功能。这篇文章就写一下我如何实现 NAS 外网访问。

外网访问的方式

外部设备要访问家里局域网中设备,最好局域网有一个公网 IP,如果没有公网 IP,就只能使用内网穿透的方式。

公网 IP

由于目前 IPv4 地址不够用,运营商使用 NAT(网络地址转换)技术,可能一个小区才有一个 IPv4 公网 IP,每户只有这个大内网的内网 IP。我使用电信宽带,如果要 IPv4 公网 IP,一个月 100 元。虽然没有 IPv4 公网 IP,但现在宽带基本都分配 IPv6 公网 IP。查看自己宽带是否有 IPv6 公网 IP,可以登录自己路由器后台,看是否有开启 IPv6 按钮。我小米 AX3000T路由器开启 IPv6 如图所示:

开启后,如果 IPv6 地址是数字开头,则代表有 IPv6 公网 IP:


或者在终端软件中使用这行命令查看(240C::6666 是一个 IPv6 公共 DNS 地址):

ping6 240C::6666

或者访问 https://www.test-ipv6.com/ 在线查看,注意关闭 VPN 等软件。

如果你不能使用路由器开启 IPv6,可以尝试通过网线连接光猫测试或者改为路由器拨号的方式尝试开启。

内网穿透

内网穿透也叫 NAT 穿透,是利用具有公网 IP 的服务器做中转,内网设备与中转服务器建立连接,外网通过中转服务器访问大内网 NAT 后面的设备。内网穿透也可以穿透防火墙,因为防火墙只拦截入站,不拦截出站(由内网设备发起请求,外网设备的返回响应,也属于出站请求。只有外网设备主动发起的请求,才属于入站请求)。

内网穿透可以使用 ZeroTier、Tailscale 的中转服务实现,可以免费使用,但因为其中转服务器不在大陆,速度不是很理想,想获取稳定快速的体验,需要使用一台具有公网 IP 的云服务器做为中转服务器,如:做 ZeroTier 的 Moon 服务器,做 Tailscale 的中转服务器。

ZeroTier 内网穿透示意图:

图片来自:https://www.youtube.com/watch?v=5qzYwvotlNg

Tailscale 内网穿透示意图:

图片来自:https://www.youtube.com/watch?v=l7pRuK0oEPc&t=2s

也可以利用 Cloudflare Tunnel 来实现内网穿透,和 ZeroTier、Tailscale 一样,也有速度不理想的问题。

设置 IPv6 防火墙

因为宽带有 IPv6 公网 IP,也不想购买中转服务器来实现内网穿透了,所以我就直接用 IPv6 来实现外网访问。这种方式也有一个弊端,就是双方都要 IPv6 公网 IP,假如一方没有 IPv6 地址也不行(如公司网络没有开 IPv6)。当开启 IPv6 后,局域网中每个设备都会有一个 IPv6 公网 IP,此时需要开启 IPv6 防火墙,不然就是大门不上锁,有安全隐患。IPv4 因为没有公网 IP,运营商使用 NAT,防火墙由运营商设置,所以我们不用设置。正常来说,运营商已经屏蔽 IPv6 公网 IP 的 80 和 443 接口。而光猫和路由器也会自己的 IPv6 防火墙设置,默认情况下防火墙是开启的,可以在线测试防火墙。或者使用以下命令测试:

telnet -6 240e:330:2dc7:8c04:a874:a432:ed19:47af 445

如果通过 VPN 的方式来实现外网访问,即使防火墙完全关闭,也没有影响,所以可以直接「使用路由器关闭防火墙」。我考虑到后面可能使用 DDNS 或 WebDAV,这些功能需要指定端口放开,不能关闭所有防火墙,所以我「使用软路由设置防火墙」。

使用路由器关闭防火墙

某些路由器,如 小米路由器 AX3000T 可以配置开启 IPv6 防火墙:

使用软路由设置防火墙

宽带安装时,一般默认设置的光猫拨号(宽带账号+密码),这样路由器默认插上光猫就可以联网,不用额外设置,这种情况,光猫有自己防火墙配置。要使用软路由设置防火墙,则需要使用软路由拨号,此时光猫只是桥接,做一个光信号转电信号的作用。光猫拨号改桥接也很简单,我给客服打电话,客服反应由宽带师傅更改,宽带师傅直接远程就改了,很快。再让宽带师傅把宽带账号密码给你。我使用的电犀牛 R68s软路由,它默认刷了 iStoreOS 系统(基于 OpenWRT),防火墙也配置好了,只需要设置宽带拨号,再将路由器插到软路由上就可以了,此时的软路由相当于原来的光猫,这样智能家居等也不需要重新配置。

使用 Tailscale 点对点直连

当有 IPv6 公网 IP,并且设置了防火墙,就可以通过直连实现外网访问。 ZeroTier 和 Tailscale 可以通过中转服务实现内网穿透,当节点都有公网 IP,它们也可以建立点对点的加密隧道,让两个节点直连,不走中转服务,此时网络速度取决于双方的带宽。这提供了更稳定快速的体验。此时外网节点可以访问已连接内网节点所有端口的服务,内网节点也不再需要通过端口暴露服务。

我使用下来,发现 Tailscale 比 ZeroTier 更稳定一点,可能是 Tailscale 底层用了 WireGuard 协议。ZeroTier 和 Tailscale 都需要使用 VPN(Virtual Private Network),在 iPhone 中,VPN 同一时间只能使用一个,所以 Tailscale 我使用 AppleID 注册,没有使用 Gmail。

点对点直连外网访问延迟在 100ms 以内:

效果

使用 Tailscale + IPv6,基本可以跑满上行带宽(30M),看一些小一点的 NAS 中视频基本没有问题。

相关链接

评论默认使用 ,你也可以切换到 来留言。