使用 Zerotier 组建虚拟局域网实现内网穿透
作者:互联网
首先 Zerotier 是什么呢? Zerotier 是一拨人为了解决网络复杂,以及因特网过于中心化而提出的解决方案。他们使用点对点 的网络,并且在上面附加一层 VXLAN-like 虚拟网络层 来提高局域网的可见性,安全性。
所以简单来说,Zerotier 通过创建一个虚拟网络,把你的设备添加到这个网络,那么在这个网络内,你的设备就像在同一个路由器内那样可以使用各种端口。
免费版 Zerotier 支持局域网内 100 个设备。Zerotier 支持 Windows、macOS、Linux 三大桌面平台,iOS、Android 两大移动平台,QNAP(威连通)、Synology(群晖)、Western Digital MyCloud NAS(西部数据)三个 NAS 平台,还支持 OpenWrt/LEDE 开源路由器项目。
官网地址:
使用
- 注册 ZeroTier
- 创建 Network 私有局域网,得到一个 16 位的 Network ID
- 在需要加入虚拟局域网的设备上安装各个平台客户端,设备会生成一个 10 位的 ZeroTier address
- 在设备上加入刚刚创建的 Network ID
zerotier-cli join <network id>
(或在网页上添加 ZeroTier address) - 在官网 network 页面上找到设备,在设备前勾选,信任设备,获得局域网 IP
Windows 系统用命令 IPconfig
,Linux/Unix 用命令 ifconfig
,然后会看到一个虚拟网卡,有一个 IP 地址。这个 IP 和在官网看到的 network 下的 IP 是一致的,只有同在该虚拟网络下的机器才能访问。
接下来,你可以设置远程桌面(端口号 3389),或者 FTP 服务(端口 21),或者搭建内网网站(端口 80),各种玩法都可以尝试咯。
图文教程可以参考这篇文章
对比
和 ngrok 和 frp 功能类似,但是 ZeroTier 明显入手简单。ZeroTier 只有客户端开源,服务端并没有开源。而 ngrok 和 frp 都是完全开源。但是 ngrok 和 frp 严重依赖于公网固定 IP 的 VPS,是一个中性化的内网穿透工具,一旦中心挂掉,那么所有的节点都无法工作。Zerotier 帮助用户实现了服务端,虽然安全性有待考验,但至少还是能用状态。
另外很多人提到的 N2N 开上去也不错,不过我还没怎么用过。等以后尝试过后再补上。
建立中转服务器 moon
Zerotier 的官方服务器在国外,国内客户端使用时延迟较大,网络高峰期时甚至各个客户端节点之间访问不了。此时,“自定义根服务器”,又称 moon 中转服务器就显得非常重要,它的主要功能是通过自定义的服务器作为跳板加速内网机器之间的互相访问。
Zerotier 定义了几个专业名词:
PLANET
行星服务器,Zerotier 各地的根服务器,有日本、新加坡等地moon
卫星级服务器,用户自建的私有根服务器,起到中转加速的作用LEAF
相当于各个枝叶,就是每台连接到该网络的机器节点。
在使用 zerotier-cli listpeers
命令时能看到这几个名词。充当 moon 的机子最好有公网 IP,现在我们尝试用 qnap 搭建一个 moon 中转:
获取 moon.json 文件
zerotier 安装好之后会带有 zerotier-idtool
这个命令,之后的内容需要依赖该命令。假设现在有一台公网固定 IP 的 VPS,在上面安装完 Zerotier 之后。
cd /var/lib/zerotier-one
zerotier-idtool initmoon identity.public > moon.json
获得 moon.json 文件。查看文件内容,其中 id
为 VPS 的 Zerotier ID。 vi 编辑 moon.json,修改 “stableEndpoints” 为 VPS 的公网的 IP,以 IPv4 为例:
"stableEndpoints": [ "8.8.8.8/9993" ]
8.8.8.8 为公网 IP,9993 为 Zerotier 默认端口。
另外,记录下 json 中的 id 值,是一个 10 位的字符串。
生成签名文件
用到上一步中的 moon.json
, 执行
zerotier-idtool genmoon moon.json
执行之后生成 000000xxxx.moon
文件。
将 moon 节点加入网络
在 VPS 的 Zerotier 安装目录下(/var/lib/zerotier-one)建立文件夹 moons.d
,将生成的 .moon
文件拷贝进去。
重启 zerotier,重启电脑。至此,VPS 上(moon 服务器)配置完成。
其他客户端机器连接 moon 节点
其他虚拟局域网中的机器想要连接到 moon 节点的话有两种方法,第一种方法就是使用 zerotier-cli orbit
命令。连接 moon 节点方法一,使用之前步骤中 moon.json 文件中的 id 值 (10 位的字符串)
分别在客户端机器里执行:
zerotier-cli orbit <id> <id>
完成
第二种方法是需要在 /var/lib/zerotier-one
目录下新建 moons.d
文件夹和 moon 节点一样,将 000000xxxx.moon
文件放到其中,并重启 zerotier。
测试
zerotier-cli listpeers
如果有 moon 服务器 IP 地址的那一行后面有 moon 字样,证明 moon 节点已经被本机连接。
不同系统下的 ZeroTier 目录位置:
- Windows:
C:\ProgramData\ZeroTier\One
- Macintosh:
/Library/Application\ Support/ZeroTier/One)
- Linux:
/var/lib/zerotier-one
- FreeBSD/OpenBSD:
/var/db/zerotier-one