P2P 内网穿透工具 ZeroTier

前言

在外面的时候可能会需要连接家里放的树莓派、智能路由器(Openwrt)、NAS 等设备,但是家里的网络一般没有公网 IP 不能直接连接,这时候就需要使用各种内网穿透的方法连接家中的设备。

简介

常见的内网穿透方法有 OpenVPN、 FRP、Ngrok 等,这些方案一般需要一个有公网 IP 的 VPS 做反向代理进行内网穿透连接,连接的速度取决于做中转代理的 VPS 的最大带宽。一般而言代价比较昂贵。今天介绍一款不需要公网 IP 就可以实现内网穿透d,而且最好的情况下连接的速度可以达到当前带宽的最大速度 —— ZeroTier。

ZeroTier is a smart Ethernet switch for planet Earth.

基本原理介绍

ZeroTier 利用 P2P(Peer to Peer) 的方式进行连接。

根服务器 R 记录了路径信息,设备 A 能通过 ZeroTier 唯一地址标识找到需要连接的设备 B

这个过程如下:

  1. A 想要将数据包发送到 B,但由于它没有直接路径,因此将其向上发送到 R。
  2. 如果 R 有直接链接到 B,它会转发数据包给 B。否则它会继续向上游发送数据包,直到达到行星根(planet)。行星根知道所有节点,所以如果 B 在线,最终数据包将到达 B。
  3. R 还向 A 发送一个名为会和的消息,包含有关它如何到达 B 的提示。同时,将会和发给 B,通知 B 它如何到达 A。
  4. A 和 B 获取它们的会合消息并尝试相互发送测试消息,可能会对 NAT 或状态防火墙进行穿透。如果这样可以建立直接链路,则不再需要中继。
  5. 如果无法建立直接路径,则通信可以继续中继(速度慢)

ZeroTier 官方搭建了一个行星根服务器叫做地球 Earth,行星根服务器唯一的且是免费的,它记录了所有的路径信息,一般情况下大家都直接用的这个。除此之外还有 12 个遍布全球的根服务器,这些是收费的服务。所以如果使用免费套餐,连接时的延迟可能会很高,另外由于 Earth 在国外,一些不确定因素可能会影响到使用。考虑到网络的不确定性,ZeroTier 能自己创建根服务器月球 Moons,这样就能在大局域网中得到更好的体验了。

安装客户端

ZeroTier 是跨平台的,能安装在几乎任何平台

Windows、macOS、Linux、iOS、Android、QNAP、Synology、西数 MyCloud NAS,下载地址:https://www.zerotier.com/download/

这里主要介绍一下常见几个平台安装方案:

MacOS

  1. 直接下载安装包进行安装:ZeroTier One.pkg
  2. 使用 brew cask 进行安装
1
brew cask install zerotier-one

启动和停止

  • 启动:

    1
    sudo launchctl load /Library/LaunchDaemons/com.zerotier.one.plist
  • 停止

    1
    sudo launchctl unload /Library/LaunchDaemons/com.zerotier.one.plist

Linux

运行下列命令进行安装:

1
curl -s https://install.zerotier.com | sudo bash

启动和停止

  • 启动

    1
    sudo zerotier-one -d
  • 停止

    1
    ps -ef | grep "zerotier-one -d" | grep -v grep | awk '{print $2}' | xargs kill -9

安卓

下载安装包进行安装:Get in Google Play Store

Ps: 不能访问的同学请自行百度搜索相关安装包下载安装

ZeroTier 使用教程

一般情况下我们可以先使用 ZeroTier 提供的免费服务,不需要自己创建 Moons 服务器。

注册账号

进入官网进行注册: https://my.zerotier.com/

登录后显示如下界面,直接使用默认的免费方案能够连接 100 个设备。

创建网络

创建网络后使用默认配置即可,切记不要将自己的网络设置里的 Access Control 设为公开网络(PUBLIC)!!!

客户端命令行操作网络

1
2
3
4
5
6
# 加入网络
sudo zerotier-cli join Network ID
# 离开网络
sudo zerotier-cli leave Network ID
# 列出整个网络中的所有节点
sudo zerotier-cli listnetworks

其中 Network ID 为刚刚创建网络时生成的值,请根据自己的网络添加。

MacOS 可以直接打开软件加入网络:

网站后台认证

加入网络后需要在网站后台认证后方可使用

测试

选择两台安装好的机器进行测试,互相 Ping 一下分配的 IP 看是否可以连通。有时候会处理连接不通大量丢包的现象,请耐心等待一会儿。

参考

  1. ZeroTier One
  2. ZeroTier内网穿透教程
给我加个菜?