NAS内网穿透方案之ZeroTier方案
1、写在前面
首先,本文不推荐任何产品,不带任何商品链接,本文是个人经验分享,不做任何广告
玩NAS也好,用NAS也罢,内网穿透是绕不过去的。讲实话方法非常多,但经过我的长期实践,我认为ZeroTier方案是最好的,尤其是和软路由结合的时候,具有以下优点:
- 安全性高,虚拟局域网方案,不对公网暴露任何端口;
- 穿透速度快,点对点,基本可以打满家里宽带上行速度的上限;
- 可配置能力强,可以在ZeroTier控制台管理必要的路由表;
- 不需要公网IPV4地址,这一点很重要
- 安装配置相对简单
- 免费版本就提供整个局域网转发的能力,这个很强
当然,也有一些局限性,在使用之前需要考虑:
- 最好有IPV6,否则可能无法构建点对点虚拟局域网,那速度就只能说完全废物了,没有IPV6未必不行,有一定概率不行,只能这么说
- 局域网不能冲突,比如,家里和办公室的局域网都是192.168.1.0/24,那就不行,尴尬的是,有些内网网段地址不是自己能修改的,比如办公室,那就只能改自己能改的部分,以避免冲突
ZeroTier其实最有价值的是第6点优势,就是整个虚拟局域网通过ZeroTier的虚拟局域网进行打通,比如,我办公室的网段是192.168.6.0/24,我家是192.168.3.0/24,整个局域网打通以后,我在办公室即可访问家里192.168.3.0/24网段内的任何一台电脑,包括NAS,虚拟主机,甚至上游192.168.1.1的光猫。反之,我家里也能访问放在单位的工作电脑。这个访问是全端口可用,包括共享目录(SMB),远程桌面(RDP),HTTP服务(80或443或任何其他端口),梯子的转发端口(socks5)等,而这一切不需要任何端口映射,所有端口不对公网暴露,安全性有保证。
2、我的配置效果
下图是我的实际情况,先放出来,后面慢慢解释

我的虚拟局域网,家里这端就是普通的宽带,光猫也是普通的光猫,完全没有改桥接,路由器拨号的事情不存在。办公室端复杂一点,我的5G CPE设备信号非常好,我是说5G信号非常好,自带的Wifi6也给力,承担了5G链路和Wifi信号收发的功能,内网路由实际由旁路由完成,包括DHCP。
工作原理是这样的:
- ZeroTier利用公网IPV6的能力,直接在9993的UDP端口上,实现点对点打通,感谢IPV6;
- 在ZeroTier的后台配置路由信息,即图上的两个路由表,由ZeroTier在上线后下发到两台软路由,使得软路由明确知道,如果我在家(192.168.3.0/24网段)要访问单位的设备(192.168.6.0/24),则应该通过ZeroTier虚拟局域网中,办公室端的虚拟地址(192.168.195.99)作为下一跳(路由地址);
- 两个软路由中,配置防火墙,使得从ZeroTier的虚拟地址到LAN口的实际地址之间,可以转发。在软路由的Lucy界面内操作的时候,只要勾上对应选项,ZeroTier的客户端会自动干这个事情,并不需要手工配置IPTABLES规则
- 现在,在家里(192.168.3.0/24)就可以访问到公司(192.168.6.0/24)网段内的任何一台,任何一个端口,无需搞什么端口映射,无需搞什么DMZ,直接通,任何一个机器都通,插上就通。
打通后效果是这样的,这是从我家软路由上,直接ping到放在单位的工作电脑

虽然不算很稳定,毕竟底层UDP就那样,但这个速度和延迟,对于绝对大多数应用来说,已经完全完全足够。
ZeroTier底层的链路是(从家里的软路由看公司):

f1d开头的ZeroTier设备编号就是我公司的软路由设备,底层就是这条IPV6的链路,直接9993端口。最重要的就是中间的那个”DIRECT“,表示直接点对点对接,不经过任何转发服务器。
站在办公室的软路由,反过来观察,是这样的:

6409开头的设备代码,就是我家的软路由,可以看到是直接通过我家软路由的IPV6的9993端口对接,这个IPV6地址,和我上面ping公司网络中软路由WAN的IPV6地址是一模一样的。
至于要访问?简单,直接RDP就行,完全不会卡,没有安全性问题,什么其他的都不需要,如果要传输文件,甚至可以直接访问共享目录。
当然,如果是NAS玩家,只想暴露NAS出去,那么当然也是ok的,那么就完全不需要什么软路由了,一个ZeroTier装在NAS上,另一个ZeroTier装在自己带出去的电脑上就完事了。
3、搭建方法-安装篇
3.1、ZeroTier网站注册账号
网站在这里 https://www.zerotier.com/
怎么注册,我想就不用写什么教程了吧,注册完了之后,会分配给你一个NETWORK,就是虚拟局域网,一般来说,一个就够了。

我搞的比较复杂,有3个,注册后自动就会有一个,就是我红框中的那个,每个人的NETWORK ID是不一样的,注意,这个最好不要泄露。
免费版本最多可以连接25个节点,一般来说是足够了,别看我用了24个,大部分是休眠的,或者测试用的,真的作为生产力在用的,不到10个。
3.2、ZeroTier的安装
安装其实并没有太多可以说的,从官网下载对应版本的安装即可,当然,这说的是windows这种简单情况(MacOS也差不多),比较麻烦的是NAS上安装,Linux和软路由倒反而简单了。
—- 软路由上安装 —-
对于软路由来说,有些甚至默认都帮你装好了ZeroTier应用,无需安装,直接用即可。如果没有安装,那么去Openwrt的仓库里面找对应硬件平台的和核心版本的程序包,自己安装,这里就不展开了(OpenWrt的软件安装展开得单独开一篇文章,有疑问的朋友们,请自行搜索了)。
在VPN菜单下,找到ZeroTier,然后界面长这样:

输入NetWork ID,勾上允许客户端NAT,保存&应用,完事了。(这已经不是安装了,而是配置)
—- Linux上安装 —-
Linux上其实安装就一行命令,非常简单,长这样:
curl -s https://install.zerotier.com | sudo bash
如果要说麻烦的话,主要是需要翻墙,否则下载不下来(Linux单行命令也好,Docker拉取更是一样)
—- NAS上安装 —-
群晖这种NAS是有应用商店可以安装,如果没有应用商店支持,那么我推荐Docker安装,以避免各种奇奇怪怪的问题,但是注意,这个Docker安装是比较特殊的,需要底层权限,一般的配置界面未必能搞定,最好在命令行下操作。
我使用的命令大致长这样:
docker run -d \
--restart unless-stopped \
--device /dev/net/tun \
--net host \
--cap-add NET_ADMIN \
--cap-add SYS_ADMIN \
-v /你的zerotier配置文件存放路径:/var/lib/zerotier-one \
--name myzerotier \
zerotier/zerotier
上面是我的写法,和官方文档有点出入,不过重点是需要映射一个device到容器内,这是zerotier必须的,我早期在我自己nas上安装ZeroTier的时候,/dev/net/tun设备默认权限不足,还需要chmod 666才行。
光这样并没有连接上,还需要执行一个容器内的命令
docker exec myzerotier zerotier-cli join ${YOUR_NETWORK_ID}
${YOUR_NETWORK_ID}是ZeroTier的网络ID(Network ID),这是ZeroTier在注册后分配给你的。
这样启动容器,会持久化ZeroTier的配置文件,不会每次重启容器都变化设备ID,导致需要去ZeroTier后台做授权,这样只需要去后台授权一次即可。
下一次重启容器,因为配置文件持久化了,直接启动容器即可,没有额外操作。
4、搭建方法-设置篇
4.1、授权
设备首次连入ZeroTier的时候,需要授权(否则一旦泄露了NetWork ID,设都能访问你内网了)

最左边的√,一开始是没有的,勾上表示授权。对于软路由来说,需要局域网内桥接,需要勾选第二个√(Allow Ethernet Bridging),如果单纯NAS设备,第二个√不需要(勾了也不户有问题)
授权之前,不会分配虚拟局域网的IP地址,就是我画线的部分,授权之后才会有,授权之后如果一下子看不到,可以重启一下ZeroTier的服务(重启容器,软路由就是在界面上把启用的√去掉保存,在重新启用后保存即可,Linux上用systemctl命令重启),不需要重启设备。
4.2、允许局域网转发
如果只是为了打通一台NAS,那么压根不需要什么局域网转发,本段可无视。同理,如果客户端只是一台PC,那么也不需要这个操作。直接跳转到5
如果是软路由,在下面这个界面中,只要勾选了允许客户端NAT即可,客户端会自己往IPTABLES里面加转发规则

对于Linux来说,就不行了,需要额外配置iptable规则
官网上有一篇文档,位于:https://docs.zerotier.com/route-between-phys-and-virt
具体来说就是下面这通操作:

第三段脚本图片上不全,完整的长这样
sudo iptables -t nat -A POSTROUTING -o $PHY_IFACE -j MASQUERADE
sudo iptables -A FORWARD -i $PHY_IFACE -o $ZT_IFACE -m state --state RELATED,ESTABLISHED -j ACCEPT
sudo iptables -A FORWARD -i $ZT_IFACE -o $PHY_IFACE -j ACCEPT
分步解释一下:
- 打开转发
- 找到自己的网口名称,取一个别名,PHY_IFACE是lan口,不是wan口,别搞错,ZT_FACE就是ZeroTier的虚拟网卡,都是zt开头
- 设置iptables,允许转发,建立转发规则
- 保存iptables规则,系统重启后自动加载,省的重启后再敲一次命令
以上命令不同版本的linux可能小有区别,如果报错得看情况处理
4.3、配置路由表
这个路由表并不需要在软路由上配置静态路由,虽然可以这么做,但是没必要,在ZeroTier后台配置,会自动下发到设备上。
在Advanced部分,直接输入路由规则,Destination就是实际的局域网LAN网段,Via就是那个网段内软路由的虚拟ZeroTier地址。

添加后,立刻生效,会在很短的时间内下发到设备上,并开始起作用。
在ZeroTier后台配置的好处之一就是,如果有很多不同局域网要打通,不需要在一个个路由器上都配置静态路由,统一配置,自动下发,简单省力。
5、联通性测试
如果一切顺利,那么已经通了。
可以使用命令
zerotier-cli peers
查看对端状态,只要看到中间是DIRECT,那么恭喜你,点对点打通。值得注意的是,这个打通有时候需要一点时间,尤其是没有IPV6的时候,中间NAT穿透需要时间。
下面是我的运行结果:

理想状态下,全部DIRECT,其中PLANET节点是ZeroTier的中心服务器,35.208开头的3个IP,我没有打码的,那也是ZeroTier的服务器。
可以看到,除了111开头的两台服务器,那是我自己的云服务器,有公网IP之外,其他都是靠IPV6在打通,大部分都是9993端口直接通讯,感谢IPV6的大力支持。
如果显示RELAY,表示经过转发,这个转发是ZeroTier的服务器,根本不在境内,别说速度了,ping过去10次都不能保证8次是通的。
这时候,你大胆的ping对面局域网内的设备,建议先从对面的路由LAN地址开始,路由器LAN地址ok,然后再试试下面挂的设备,如果LAN可以通,下面挂的设备不通,那么说明路由表设置或者iptables转发有问题。
接下来就是无缝的使用了,当在一个局域网内一样使用,所有端口可用,TCP和UDP都可以。
- 想要NAS的SMB共享挂载么?没问题,直接挂;
- 想访问对面局域网里面的PC?简单,直接远程桌面,比什么壳体验不知道高到哪里去了;
- 想使用NAS上的服务?内网IPV4直接用,挂了反向代理更佳;
- 想在公司上网的时候用家里的梯子?没问题,直接配置过去;
- 访问NAS的HTTP界面?简单,直接端口直连;
- 家里的Linux要访问?直接SSH;
- 要访问公司办公网的服务,比如OA?胆子大一点,再加个路由规则试试看?单位的电脑上启动一个代理服务器当跳板试试看?
- ……………………
安全性没问题,因为外人根本连不入你的虚拟局域网,不管是家里也好,单位里也罢,不对外暴露端口,别人根本访问不到。
安全,快速,一劳永逸。