前言
有时候需要在外边访问家里的设备,而众所周知一般家里都没有固定 IP 的,这时候就要内网穿透了,说到穿透的时候,大家都会提到 DDNS(动态域名解析),或者使用反向代理的方式如 FRP、Ngrok。
首先说说 DDNS,这种方式使用起来很方便,只要设置好相应的服务提供商的 API,就能做到每次 IP 变化后自动解析,这样不管家里 IP 怎么变,用域名都能访问回家。这里最大的硬伤就是公网IP,有些朋友的带宽就是个大局域网,路由器只能获取到上一级内网的 IP,这时就 GG 了。
然后是 FRP、Ngrok 这样的反向代理程序,通过服务器转发数据来达到外网访问的目的,这样就需要自己有个 VPS,或者使用他人搭建的服务,据我所知的免费服务都是限速的,要是自己搭建的话,体验就要看服务器的网络质量了。
现在我们就来看看,不需要公网 IP,不依赖服务端网络性能的 ZeroTier。
简介
ZeroTier is a smart Ethernet switch for planet Earth.
!!! 适用于地球的智能网络交换机 …
它是一个分布式网络虚拟机管理程序,建立在加密安全的全球对等网络之上。它提供与企业 SDN 交换机同等的高级网络虚拟化和管理功能,而且可以跨本地和广域网并连接几乎任何类型的应用程序或设备。
好吧,有点牛逼,而说到主要功能,就是可以把多个不同网络的设备连接在一起,用来就像在一个局域网下
例如,我在路由器上装了 ZeroTier,路由器挂了一个硬盘,而现在我在外边想要访问这个硬盘,那么只需要运行电脑上的 ZeroTier,就能通过 Samba、FTP 等方式访问硬盘,而且看起来就像我就在家里一样。
基本原理介绍
说白了就是 P2P(Peer to Peer),而且组织方式很像 DNS(关于 DNS 可以看这里)
根服务器 R 记录了路径信息,设备 A 能通过ZeroTier唯一地址标识找到需要连接的设备 B
这个过程如下:
-
- A 想要将数据包发送到 B,但由于它没有直接路径,因此将其向上发送到 R。
- 如果 R 有直接链接到 B,它会转发数据包给 B。否则它会继续向上游发送数据包,直到达到行星根(planet)。行星根知道所有节点,所以如果 B 在线,最终数据包将到达 B。
- R 还向 A 发送一个名为会和的消息,包含有关它如何到达 B 的提示。同时,将会和发给 B,通知 B 它如何到达 A。
- A 和 B 获取它们的会合消息并尝试相互发送测试消息,可能会对 NAT 或状态防火墙进行穿透。如果这样可以建立直接链路,则不再需要中继。
- 如果无法建立直接路径,则通信可以继续中继(速度慢)
ZeroTier 官方搭建了一个行星根服务器叫做地球 Earth,行星根服务器唯一的且是免费的,它记录了所有的路径信息,一般情况下大家都直接用的这个。除此之外还有 12 个遍布全球的根服务器,这些是收费的服务。所以如果使用免费套餐,连接时的延迟可能会很高,另外由于 Earth 在国外,一些不确定因素可能会影响到使用。考虑到网络的不确定性,ZeroTier 能自己创建根服务器月球 Moons,这样就能在大局域网中得到更好的体验了。
安装
ZeroTier 是跨平台的,能安装在几乎任何平台
Windows、macOS、Linux、iOS、Android、QNAP、Synology、西数 MyCloud NAS,下载地址:https://www.zerotier.com/download.shtml
路由器推荐安装 Entware 后使用 opkg install zerotier
命令安装
ZeroTier使用教程
因为我们没有自己创建 Moons 服务器,现在就先使用 ZeroTier 提供的服务
注册
注册之后是这样的,保持默认就好,免费套餐能连接 100 个设备,一般人够用了
创建网络
创建一个新的网络之后,我们得到一个 Network ID,这个在后面的设备连接时需要用到,点击刚刚创建的网络我们可以设置更多选项
默认的设置就可以用了,右边 IPv4 的设置就是分配设备内网 IP 网段,其他的设置可以在 Setting help 里看到说明,不了解的不建议乱设置,如果不小心把自己的网络暴露在外部,会相当危险
连接(一定要看完,最后还需要允许进入)
直接在客户端输入刚才创建的 Network ID
NAS客户端使用(群晖918+)
下载.spk群晖套件安装包(自行选择构架) https://download.zerotier.com/dist/synology/
打开群晖页面——套件中心——手动安装
加入Zerotier网络ID
MacOS客户端
下载.msi的安装包,安装后在程序中找到zerotier图标打开
windows客户端使用
下载.msi的安装包,安装后在程序中找到zerotier图标打开 https://download.zerotier.com/dist/ZeroTier%20One.msi
输入网络ID按join入网,然后点击show networks,查看状态是否正常
Linux客户端使用(Centos7)
1、编辑添加yum源
vi /etc/yum.repos.d/zerotier.repo #按i,进入编辑模式,输入下面信息,按:wq!保存退出
[zerotier]
name=ZeroTier, Inc. RPM Release Repository
baseurl=http://download.zerotier.com/redhat/el/$releasever
enabled=1
gpgcheck=0
2、安装zerotier
yum clean all
yum install zerotier-one
3、启动服务
zerotier-one -d
4、查看状态
zerotier-cli status
zerotier-cli info
5、加入网络
zerotier-cli join Network ID
5、其他命令
zerotier-cli leave Network ID #离开当前网络
zerotier-cli listnetworks #当前网络状态
info - Display status info
listpeers - List all peers
peers - List all peers (prettier)
listnetworks - List all networks
join <network> - Join a network
leave <network> - Leave a network
set <network> <setting> - Set a network setting
get <network> <setting> - Get a network setting
listmoons - List moons (federated root sets)
orbit <world ID> <seed> - Join a moon via any member root
deorbit <world ID> - Leave a moon
安卓版客户端使用(华为P30)
下载.apk文件,并安装客户端 http://download.zerotier.com/dist/ZeroTierOne.apk
加入zerotier网络组
苹果版客户端使用
苹果客户端使用需要下载美区账号,然后搜索ZeroTier安装客户端,打开软件后输入id加入网络组,软件自动提示添加威屁恩,以后使用威屁恩连接即可。
允许连接
后台设置默认是需要 Auth 才能连接的,在客户端申请加入网络后,需要在后台允许一下
测试连接
为了测试不同网络访问,我添加了一台安卓手机,在移动网络下直接使用分配给路由器的 IP,连接了 ssh 和 onmp 创建的 PHP 探针页面,而且速度还算不错,宽带是电信的,手机是联通的,下文件时能可以达到宽带的上行峰值。