2023年10月

这是我的第299篇专栏文章。

前几篇文章,我持续介绍了AIoT+Web3=DePIN(分布式物理基础设施网络)这一最新趋势。

在驱动DePIN增长飞轮的过程中,物联网预言机起到了至关重要的作用。

那么如何深入浅出的解释什么是“物联网预言机”呢?

这是一个让我们既熟悉又陌生的词汇。

在两周之前举办的第九届区块链全球峰会上,aitos.io首席执行官林瑶发表了题为《BoAT3物联网预言机:链接物数世界之道》的演讲。演讲中,林瑶解读了物联网预言机,并且发布了BoAT3作为物联网预言机赋能者的概念。

在中秋国庆的双节小长假期间,BoAT3仍在快马加鞭的持续进化。

前两天,aitos.io正式发布了关于BoAT3的全面介绍白皮书《BoAT3 物联网预言机:DePIN新叙事下如何将真实世界资产桥接到Web3?》(BoAT3 IoT Oracle: Bridging Real-World Assets to Web3 in the DePIN Narrative)。

白皮书中详细阐述了物联网预言机及其工作流程、构建模块、开发指南。这不仅是BoAT3的一个重要里程碑,也是物联网+区块链持续创新的阶段性成果。

因此今天这篇文章,我们一起来全面解读:

  • 什么是物联网预言机?

  • 物联网预言机为何对DePIN的发展至关重要?

  • 物联网预言机如何工作?

什么是物联网预言机?

先来说明什么是预言机?

在区块链的术语中,预言机(Oracle)是为智能合约提供外部信息的第三方服务。

预言机作为智能合约与外部世界通信的网关,为区块链打开了一扇通往外部世界的窗户。

在计算机领域,预言机是一种抽象电脑,又称谕示机。

预言机具备图灵机的一切功能,并额外拥有一种能力:可以不通过计算直接得到某些问题的答案,这个过程叫做Oracle(神谕)。也就是说,预言机可以解决图灵机通过计算也无法解决的问题,比如从外界获取问题的答案。

举个例子,有一个天气预报预警的去中心化应用,用户可以通过链上智能合约进行天气预报的查询。天气预报的数据不是在链上自行生成的,而是需要智能合约向气象服务网站的接口发起请求获取数据。这时预言机就起作用了,智能合约可以向预言机发起请求,由预言机执行气象服务网站接口的调用,返回一致性的响应数据给智能合约,供智能合约处理。

了解了预言机的概念,接下来,我们就更容易理解什么是物联网预言机了。

由于在DePIN叙事中,拉通了物理世界和Web3.0领域,这就必须要利用最新技术将物理世界与区块链打通,让物理世界中的数据上链进行交互。

而物联网预言机本质上作为一个翻译者,是将信息从物理世界传递到数字领域的首选,也是潜移默化的改变区块链技术与现实世界之间协作关系的变革者。

可以说,物联网预言机为信息从现实经济流向区块链提供了一条高效、可靠且安全的途径,推动了实时反应,并赋予来自真实世界的价值,以及前所未有的动态性。

围绕物联网预言机的探索一直都在进行。aitos.io与物联网和区块链融合生态中的众多合作伙伴一起,致力于探索如何让全球海量的物联网设备都能快速访问区块链服务,从而赋能各类物联网设备成为预言机。

早在2018年,aitos.io就率先启动了开源项目BoAT-X,它是BoAT3的前身。BoAT-X是物联网行业的一组区块链赋能工具,用于管理链上身份(加密算法和密钥),进行可验证的声明,将交易传输到区块链。

近年来物联网产业高歌猛进,“物超人”之后持续着井喷式发展,预计到2025年全球物联网设备的数量将达到全球人口的5倍以上。海量的物联网设备正在日以继夜的高效采集数据,为人工智能训练和推断等各类数据应用场景提供宝贵的数据“原油”。

而数据“原油”的有效开采和价值挖掘关键就在数据必须是真实可信的。区块链可以在多方之间进行可信的数据确权,并记录各类数据采集活动。

但对物联网进行区块链改造并非易事。因为大多数物联网设备的能力远远没有我们想象的强大,比如很多物联网开发者熟知的硬件开发板“树莓派”功能强大,在实际商用场景中,大多数物联网设备的性能远远不如“树莓派”强大。

如何将各种面向碎片化场景、能力参差不齐的物联网设备上链,让物联网设备成为有效可用的预言机,这就是BoAT-X乃至BoAT3所要解决的挑战。

应对这一挑战的基本策略是裁剪区块链钱包核心功能,并将其移植到物联网设备的关键组件上。

过去五年, BoAT-X区块链应用框架作为多链物联网区块链钱包,已经率先支持了主流的物联网芯片和模块,特别是有效解决了各类资源受限的物联网芯片和模块的上链问题,并且覆盖了绝大多数内置物联网芯片或模组的智能硬件设备的区块链改造场景。而BoAT3正是BoAT-X在Web3.0时代的重要延续。

物联网预言机为何对DePIN的发展至关重要?

DePIN是Web3与AIoT结合的一个全新的叙事,其中“De”代表分布式、“PIN”代表物理基础设施网络。DePIN的关键特征是通过众包的方式构建物理基础设施网络(例如,无线网络、存储网络),这就需要组织协调起现实世界中数以百万量级的设备,先从供给端创造出一个能提供足够大量、有吸引力的底层基础设施服务网络。

DePIN的参与者们作为供给侧的建设者,正在孜孜不倦地投身于各类物理基础设施网络的搭建和运营,并因其做出的实际贡献而获得奖励。因此,在DePIN领域,准确测量、安全报告和有效验证物理工作至关重要。而准确衡量建设者们所做的实际工作量是有效奖励的关键基础,就是物理工作量证明(PoPW)。

在此前的文章《AIoT+Web3=DePIN,共建机器间大规模协作网络的网络》中,我曾经对PoPW做过详细介绍。

PoPW是DePIN的核心机制,因为有了PoPW,才能让全球几十万、甚至上百万的社区贡献者一起来参与DePIN基础设施网络的建设。

物联网预言机正是落实PoPW的重要技术手段。

因为物联网预言机能够有效的度量工作量,并且能够把工作量实时登记到区块链上,实现给贡献者公允的回报。

我们看到各种各样的设备在不停运转,给社会做出重要的贡献,这个就是物理工作量(Physical Work)。

它可以是充电桩给车充了多少电,可以是基站对外发了多少字节的数据,可以是光伏发了多少度绿电…这些是对外的商业服务,应该有商业的回报,需要基于这个工作量的精确度量,给到公允的回报。

物联网设备透过传感器去采集工作量,比如光伏发了多少度电。透过物联网设备内制的设备钱包,用设备公钥对工作量进行签名,这样就可以得到一个物联网设备要度量的工作量的可验证的凭证,这就是PoPW。

需要把PoPW送到区块链上面,让智能合约根据贡献,根据PoPW度量的工作量进行分配。这里会引入物联网预言机的机制。因为合约要访问链下数据,必须要有物联网预言机的支持。

PoPW是物联网设备产生的链下数据,就需要有物联网预言机来服务,物联网的预言机去判断和验证这是不是来自真实设备的真实数据,这个过程就叫PoPW验证。

一旦经过验证的PoPW,就可以放到区块链去存证,送到合约里面,根据合约的规则进行相应的分配。

通过将PoPW安全地锚定到区块链,物联网预言机将现实世界的资产与Web3连接起来。

物联网预言机如何工作?

物联网预言机提供了一套用于DePIN项目的硬件和软件解决方案,涉及物联网设备、云服务和区块链服务,用于生成、报告和验证特定物理工作量的证明。

对于每个DePIN项目来讲,能够准确测量、安全报告和有效验证每一个DePIN 基础单元的物理工作量至关重要。

DePIN 基础单元是执行物理工作的各类终端。例如,无线网络DePIN 基础单元的PoPW是它传输的字节数;而太阳能光伏发电DePIN 基础单元的PoPW是其发电量。物理工作量代表了各类真实世界资产的状态或价值。

无论精确的测量标准是什么,DePIN 基础单元通常依赖物联网设备来测量和报告PoPW,并由分布式网络进行验证。与区块链原生数据不同,PoPW实际上是链下数据。因此,需要物联网预言机来安全可信地将PoPW上传到区块链上,以进行贡献评估。

受限于计算能力、存储空间以及网络连接以及供电等能力的不足,传统的物联网设备访问区块链服务并非易事。

例如,一个室外天气数据采集器可能采用太阳能面板和电池进行供电,为了节能甚至需要周期性地唤醒以测量和报告天气数据,在这类天气数据采集器中安装一个客户端(比如以太坊)来传输PoPW几乎不可能。

为了解决这类棘手的问题,BoAT3物联网预言机应运而生,它将海量物联网设备改造成DePIN 基础单元,记录各类PoPW,从而将现实世界的资产引入Web3.0。

如上图所示,DePIN系统中典型的PoPW流程是:

  1. DePIN 基础单元产生一些物理工作量(例如,采集天气数据)并生成工作量数据。

  2. 在这些数据中,可能会有一些非PoPW应用数据(例如,低电池警报)被直接发送到去中心化应用的后台(上图中的粉红色路径)。

  3. 与此同时,PoPW在DePIN 基础单元内部生成,通过打包工作量数据(例如,温度和湿度)。DePIN 基础单元中的设备钱包持有唯一的设备加密密钥,并对PoPW进行签名。签名后的PoPW声明随后通过上图中的蓝色路径发送到物联网预言机。

  4. 物联网预言机根据在数字身份DID中注册的设备凭据来对PoPW进行签名验证。如果验证通过,经过验证的PoPW将发送到区块链和去中心化应用(上图中的绿色路径)。

  5. 经过验证的PoPW成功存储到区块链上后,各类去中心化应用可以调用这些PoPW(例如,基于物理工作量对作出贡献的DePIN 基础单元进行奖励)。

写在最后

物联网预言机正在成为DePIN世界的重要基石,它连接着现实世界和区块链世界,为基于物理工作量的价值交换和治理提供了技术支持。

蓬勃发展的DePIN生态系统需要物联网预言机来将DePIN基础单元贡献的物理工作证明上链。与其他Web3项目不同,DePIN基础单元是基于物联网设备构建的,为真实物理世界提供服务,这带来了许多新机遇。

通过安全可信地将PoPW上传到区块链,物联网预言机在DePIN的全新叙事下,正在帮助现实世界的资产在Web3.0新经济下焕发出全新的活力。

让我们继续关注物联网预言机的发展,也欢迎你加入到这个崭新世界的构建中来!

如果你对《BoAT3 物联网预言机: DePIN新叙事下如何将真实世界资产桥接到Web3?(BoAT3 IoT Oracle: Bridging Real-World Assets to Web3 in the DePIN Narrative)》白皮书的更多内容感兴趣,欢迎点击下面的链接阅读原文:

中文版:BoAT3 物联网预言机:DePIN新叙事下如何将真实世界资产桥接到Web3?

https://mirror.xyz/0x6510f5d8CC090b38BE8Bf1BBCd28d15e726395A2/IteGyM3tFgbbPLwrAimt9vwpRKe47coFcpKKll3XYaM

English Version:BoAT3 IoT Oracle: Bridging Real-World Assets to Web3 in the DePIN Narrative

https://t.co/RxDa6jreIg


ZeroTier可以将任何两台或多台装有ZeroTier客户的电脑组成局域网,如果在OpenWRT里安装ZeroTier的插件,还可以访问OpenWRT下面的任何设备,要实现的方法也非常简单,只需要简单的几步即可。

步骤如下:

1,在ZeroTier网站上注册一个用户,然后生成一个key

2,在ZeroTier网站上下载各个系统的客户端,在win或linux电脑上安装

3,在客户端输入key

4,在ZeroTier网站后台将客户端电脑启用

5,这些电脑可以相互访问了。如果是OpenWRT,再在ZeroTier网站后台添加两个IP,就可以访问OpenWRT下面的任何设备了。

具体方法及步骤:

一,注册、登录、生成key

1,注册:打开https://www.zerotier.com/网站,点Sign Up,会出现登录界面,如果没有用户,点Sign Up进行注册


2,登录后,生成一个网络id,也就是key

点一下Create A Networ,下面就会生成一条记录,NETWORK ID就是我们要的重要的一个key,这个key看起来是一个16位的乱码。在这个key上面点一下,就进入了高级设置了。


二,对ZeroTier网站后台进行简单设置

挑选一个自己喜欢的IP段,点上面的NETWORK ID后,会进入后台设置界面。

在IPv4 Auto-Assign这里,选一个看着顺眼、自己觉得好记的IP段,随便选。比如我选的就是192.168.192.x,这个跟我们平时用的接近,好记,只要不跟自家的路由器IP冲突就行。


这样ZeroTier的后台就基本设置结束了。


三,客户端安装ZeroTier软件

1,转到https://www.zerotier.com/download/ 下载页面,下载自己适合的客户端软件

2,下载Windows的客户端

双击运行ZeroTier客户端,会缩小在右下角,鼠标点一下,再点Join New Nenwork,会弹出一个框,填入我们之前在后台生成的那个16位网络id,点Join。这时,这台电脑就加入到这个网络id之中了。

同理,在其它的win上面做一样的操作,这样两台电脑就加入到后台了。


四,组局域网

1,进入ZeroTier网站后台,向下滚动到Members区域,会发现多了几行,就是我们刚刚添加进来的电脑

在设备前面打色勾,这是状态条就变绿了,表示这台设备已正式批准加入这个网络了。后面会自动生成一个IP地址,就是我们上面选的那个IP段,是192.168.192开头的。

2,使用方法

A和B电脑是win10,都安装了ZeroTier客户端,都已加入网络。A电脑分配的IP:192.168.192.100,B电脑分配的IP:192.168.192.200。

在A电脑上用192.168.192.200可以连接B电脑的远程桌面(前提是B电脑打开了远程桌面功能)。

上面的实例,我家的OpenWRT分配到的IP是192.168.192.130,我在公司浏览器里输入192.168.192.130,就可以登录路由器了,前提是公司电脑也安装了ZeroTier客户端,并加入网络。


五,利用OpenWRT访问家里所有的设备

1,在OpenWRT上安装ZeroTier插件,其中Luci界面,要自己去找,官方的仓库里没有。x86的可以到这里下载安装:https://op.supes.top/packages/x86_64/luci-app-zerotier_git-23.343.54657-21c5c02_all.ipk

2,填入key,运行,打开允许客户端自动NAT


3,到ZeroTier网站后台,把刚才增加的OpenWRT加入到网络,就是在前面打上勾。这时,会分配给OpenWRT一个IP地址,假如是192.168.192.130

4,增加一条路由记录。在Adveanced里面,Add Routes下面,Destination这里,填路由器的IP段,如果你家里的路由器是192.168.1.1,那就填192.168.1.0/24,Via那里填192.168.192.130,就是刚刚给路由器生成的IP地址。填好后,点一下Submit,就有一条记录生成了。

下图是我设置的,前面那一条是我家的路由器IP段,我家的是192.168.0.1,所以是192.168.0.0/24,后面就是后台生成的路由器IP地址。翻译一下大白话:家里的路由器192.168.0.0下面的设备,通过192.168.192.130来访问。

5,设置结束

可以在任何电脑上访问家里的设备了,前提是这台电脑也装有ZeroTier客户端,加入到这个网络。


起因

最近和两个表妹一起玩星露谷物语,但是这个游戏的 steam 联机国内超卡,所以我搭了 FRP 内网穿透服务。过程中了解到ZeroTier ,就顺手做了 ZeroTier 和 FRP 的测速对比实验。

测试

测试条件

轻量级腾讯云:公网IP,出站带宽 6Mbps,部署 FRP 服务器 和 Zerotier moon
主机1:组装台式机,windows10,中国联通宽带,100Mbps 下载 / 40Mbps 上传
主机2:Macbook Air 2014,windows10,中国联通手机流量,200Mbps下载 / 50Mbps 上传
此时 主机1 和 主机2 都没有公网IP,无法实现直连

测试指标

下载速度,上传速度,延迟,抖动

测试工具

psping:用于测试延迟,抖动
iperf3:用于测试下载速度,上传速度
speedTestX:docker版,用于测试所有指标

测试结果
主机1 <-> FRP <-> 主机2

延时与抖动
在这里插入图片描述
上传速度
在这里插入图片描述
下载速度
在这里插入图片描述

主机1 <-> 主机2 (ZeroTier + ZeroTier moon)

延时与抖动
在这里插入图片描述
上传速度
在这里插入图片描述
下载速度
在这里插入图片描述

主机1 <-> 腾讯云在这里插入图片描述
主机2 <-> 腾讯云在这里插入图片描述
测试结论

在测试条件下
ZeroTier 的 网络速度比 FRP 快很多
ZeroTier 的 网络延时 和 FRP 差不多
ZeroTier 的 网络抖动 高于 FRP

可以看到 FRP 这种转发服务,测试结果接近腾讯云的带宽上限 6mbps;
ZeroTier 的测试结果远高于 6mbps,可见它的原理不是全转发,应当是使用了 TCP 打孔,因为网络同属中国联通所以比较成功。推测如果 主机2 从中国联通的手机流量换成中国移动的手机流量,传输速度可能会大受影响。

附:FRP 与 ZeroTier 的安装使用

本文假定以星露谷联机为目的。

FRP

FRP 的原理不难理解,就是转发。将公网 IP 服务器的一个端口接收到的所有数据,转发到内网 IP 的主机上,这样就使得内网 IP 的主机仿佛拥有了公网 IP 一样。

FRPs

登录腾讯云,下载 FRP,编写配置文件,frps.ini

[common]bind_port = 7939token = xxxxxxxxxxxxxxxx

bind_port 是 绑定本地端口。
token 是 密钥,使用这个服务器的凭证。
到腾讯云的防火墙面板放行 TCP 7939 端口。
然后写一个小脚本 frp_start 用来启动 FRP 服务器。

#!/bin/bashnohup ~/frp/frps -c ~/frp/frps.ini > frp.log  2>&1 &

运行脚本,FRP服务端搭建完成。
cat frp.log查看运行日志,ps -ef|grep frps查看进程。

FRPc

来到星露谷主机的 windows 主机1,下载 FRP,编写配置文件,frpc.ini

[common]server_addr = 172.7.76.71
server_port = 7939token = xxxxxxxxxxxxxxxx[stardew-valley]type = udp
local_ip = 127.0.0.1
local_port = 24642remote_port = 24642[iperf3]type = tcp
local_ip = 127.0.0.1
local_port = 5201remote_port = 5201[iperf3-u]type = udp
local_ip = 127.0.0.1
local_port = 5201remote_port = 5201

server_addr 腾讯云的公网IP
server_port, token 和 frps.ini 一样
下面是三个隧道,stardew-valley 用来联机星露谷,剩下两个用来做速度测试。
local_port 是本地端口,remote_port 是服务端端口,
stardew-valley 隧道 会把本机的 24642 udp端口,映射到腾讯云 172.7.76.71 的 24642 udp端口。
到腾讯云的防火墙面板放行 UDP 24642,TCP 5201,UDP 5201。
然后在主机1上运行 frpc,保持此程序一直运行。

frpc -c frpc.ini

主机1 正常建房,另外两个星露谷玩家在联机窗口直接输入 172.7.76.71 即可。

ZeroTier

ZeroTier是虚拟局域网,所有用户通过 ZeroTier-one 连接到一个虚拟化的局域网中。这种方案所有用户都必须安装使用 ZeroTier-one

ZeroTier-one

在 ZeroTier 网站上注册账户,创建网络,并把 network ID 记录下来。
然后参照官网在所有要参与联机的节点上都安装 zerotier-one。
加入网络(如果是windows,可以用 ZeroTier-ui 图形化操作)

sudo zerotier-cli join db64858fxxxxxxxx

注意加入后,还要等待批准,在 ZeroTier 网站上可以看到已加入的节点,把前面的 Auth? 复选框选上即可批准,服务器会自动给该节点分配虚拟局域网的 IP。
该命令可以确认自己的 IP。

sudo zerotier-cli listnetworks
ZeroTier moon 服务器搭建
生成 moon.json

ZeroTier moon 服务器需要公网IP,因此用腾讯云来搭建。

cd /var/lib/zerotier-onesudo -s
zerotier-idtool initmoon identity.public >>moon.jsonvim moon.json

vim 修改这一条"stableEndpoints": ["172.7.76.71/9993"],填入 公网IP 和 端口

生成 moon 签名文件
zerotier-idtool genmoon moon.json

可以看到生成了一个类似 000000xxxxxxxxxxx.moon 的文件,新建 moons.d 文件夹并将此文件移入

mkdir moons.dmv 000000xxxxxxxxxxx.moon moons.d

然后重启 zerotier-one 服务

service zerotier-one restart
加入 moon 节点
zerotier-cli orbit [moon.json 文件中的 id] [moon.json 文件中的 id]

这里注意 ID 要写两次。这条命令要在所有节点上全部运行一遍。
在非 moon 节点上执行如下语句验证 moon 节点是否添加成功

zerotier-cli listpeers

应当可以看到类似

200 listpeers xxxxxxxxxx 172.7.76.71/9993;4214;4090 124 1.10.1 MOON

则说明 moon 节点设置成功。

联机游戏

主机1 用 ZeroTier-ui 图形界面看一下自己的 IP,或者用 zerotier-one-cli listnetworks 获取。
然后正常建房,其他玩家输入主机 IP 即可。

联机方案简单讨论

最终选择 FRP 来联机星露谷。
游戏联机传输的数据通常都很少,决定联机体验的关键是延迟和抖动。因此 ZeroTier 速度快的优势无法发挥。
更关键的是,选择 FRP 的话,只有主机需要折腾 FRPc,其他玩家只需要知道一个 IP 就行,ZeroTier 要一人装一个,对于非专业人士来说比较劝退。


内⽹穿透⼯具对⽐FRP+NPS+Zerotier与NAT服务器测试

中展⽰了私有云盘的搭建⽅式,但仅能本地访问肯定⽆法满⾜有私有云⽤户的需求,于是笔者尝试了多个流⾏的内⽹穿透⼯具,⾸先说明⼀下笔者⽬前的配置情况,可道云是通过树莓派挂载的,到达公⽹前⾄少有两次NAT,服务器有⼀个⾹港的普通服务器( 30M 带宽)和两个江苏的NAT服务器( 100M 带宽),笔者将分别在两种服务器上使⽤三个软件,并介绍安装和配置⽅法以及注意事项

⾸先解释⼀下NAT服务器,与普通服务器不同的是,NAT服务器是多个⽤户共⽤ IP 的,仅能使⽤⼗个⾄⼏⼗个端⼝,有的是直接划分好端⼝段( OLVPS ),服务器上⽤防⽕墙打开对应端⼝即可使⽤,有的可以⾃⾏设定端⼝映射( CloudIPLC ),但是在公⽹上只能打开 1 万以上的端⼝号,且可能已经被占⽤

FRP 和 NPS 的原理都相近,⼀个主(Server)多个从(Client),通过⼀个端⼝(TCP复⽤)使多个从服务器的端⼝映射到主服务器上,使得访问主服务器端⼝时,能获得访问从服务器对应端⼝的⽬的。以本⽂的需求为例,假如我在树莓派的 5000 端⼝上挂载了⼀个⽹页服务,想通过公⽹访问,则可以将树莓派的 5000 端⼝映射到公⽹服务器的 6000 端⼝,然后访问公⽹服务器的6000端⼝即可访问⽹页,其他的可以⼀⼀映射,如5100到6001,5200到6002,如下图所⽰

NAT 服务器稍有不同,即多了⼀层映射,需要将 NAT 服务器的内⽹端⼝映射到公⽹端⼝上,假设需求和上图相同,则需要将树莓派的 5000、 5100 和 5200 端⼝映射到 NAT 服务器的 6000 、 6001 、 6002

端⼝上,数据沟通端⼝则填写 37000 ⽽不是 7000 ,然后⽤户通过访问36000 、 36001 和 36002 可获得相同效果,如下图所⽰

那么下⾯进⼊部署阶段

FRP

⼀个由 go 语⾔实现的内⽹穿透⼯具,优点是下载即⽤,不需要安装,可以在不同服务器间拷贝,直接运⾏即可,缺点是官⽅提供的 WebUI ⾮常鸡肋,可以直接忽略,本⽂使⽤的是 0.34.1 版本

/fatedier/frp

普通服务器

Server端

笔者⼀般先部署 Server 端,因为调试逻辑会更加简单,⾸先去官⽹下载 Release 包,注意区别服务器系统版本,解压压缩包之后给予 frps ⽂件执⾏的权限,当然最简单的⽅式就是整个⽬录递归赋予777权限(笔者通过 WinSCP 操作的),然后修改frps.ini,笔者使⽤的设置为

[common]

bind_port = 7000

kcp_bind_port = 7000

token =服务器间通信密码

dashboard_port = 7001

dashboard_user =⽤户名

dashboard_pwd = WebUI密码

log_file = /root/log/frps.log

log_level = info

log_max_days = 7

其中含有 dashboard 的⼏个变量都是和 WebUI 相关的,不使⽤该功能的话可以直接删掉,然后切换到⽬录下运⾏看是否报错(记得先创建log ⽂件夹,不知道为什么这些软件连创建⽂件夹都不会),如果未正常开启可以在 log ⽂件中查看⽇志并修正

./frps -c ./frps.ini

Client端

解压后修改配置⽂件frpc.ini,注意和上⾯的区别,别修改或运⾏错了

[common]

server_addr =服务器ip

server_port = 7000

token =服务器间通信密码

protocol = kcp

log_file = /root/log/frpc.log

log_level = info

log_max_days = 7

[ssh]

type = tcp

local_ip = 127.0.0.1

local_port = 22

remote_port = 6000

[web]

type = tcp

local_ip = 127.0.0.1

local_port = 80

remote_port = 6001

将服务器 ip 和密码设置好后就可以运⾏了,如果使⽤的是 kcp 协议,需要放⾏通信端⼝(如上⽂中的

7000 端⼝)的 udp 协议,也可以使⽤默认的 tcp 协议,下⽅模块的 type 中的协议不需要更改,更多协议可以参考官⽅⽂档

./frpc -c ./frpc.ini

这时建议先两边都⽤ ssh 客户端直接运⾏命令开启服务并验证是否可以连通,如果⼀切正常再使⽤其他⽅式后台运⾏,如果⽆法连接,下⾯列出了⼏个常见的解决思路

1、查看 log ⽇志的报错信息,其中 log ⽇志所在的⽬录需要提前创建,然后根据错误信息来排查问题

2、查看是否端⼝已经被占⽤ netstat -lnp|grep 端⼝号

3、查看两侧防⽕墙是否均放⾏所有相应的端⼝的 tcp 协议,其中 kcp 需要放⾏沟通端⼝(如上⽂中的7000)的 tcp + udp 协议

4、从外部查看端⼝是否开放(测服务器的),需要开启服务后即有程序监听端⼝后查看, /tool/port

5、frpc.ini 配置⽂件⾥⾯的模块是否重名,可能因为复制粘贴忘记修改⽽重名以⾄⽆法开启服务

NAT服务器

Server端

和上⾯完全相同,如果是⼿动开启映射的服务器,记得在使⽤ kcp 协议的时候,增加⼀条 udp 的映射

Client端

稍有不同的是需要将 server_port 改为映射后的端⼝,如上图中的 37000 ,server_addr 实测⽀持填写域名

NPS

⼀个同样由 go 实现的内⽹穿透⼯具,但官⽅提供了更好的 WebUI ,并且可以直接操作 Server 端就能完成映射,在增减映射的时候不⽤重启服务,避免了想重启服务但关闭服务导致 ssh 掉线然后服务⽆法开启因此失联的尴尬局⾯,当然,为了更保险起见,笔者同时开了 FRP 和 NPS 服务,防⽌掉线后⽆法重连的尴尬,当然,后⾯加⼊了 ZeroTier  实现了三重保险,本⽂使⽤的是 0.26.9 版本

/ehang-io/nps

普通服务器

Server端

下载Release包,解压然后进⼊⽬录,安装

./nps install

默认情况下,服务会安装到  /etc/nps  ⽂件夹中,编辑配置⽂件  /etc/nps/f

⼀般情况下修改这四⾏内容即可

http_proxy_port=未被占⽤的端⼝

https_proxy_port=未被占⽤的端⼝

web_username=⽤户名

web_password=密码

因为很可能服务器的80和443端⼝已经⽤来开启其他服务⽐如被 Nginx 监听了,所以直接运⾏会报错,因此需要修改成未被占⽤的端⼝,并填写后台管理⽤的⽤户名和密码,在放⾏ 8080 端⼝后开启服务就可以访问到后台了

nps start

点击客户端 - 新增 - 新增使⽤默认配置新增⼀个服务器,可以⾃⾏选择是否加密和压缩,然后点击隧道 - 新增新增⼀个映射,以上图为例,则服务器端⼝填写 6000 ,⽬标 (IP:端⼝)  填写路由器下内⽹:5000或者127.0.0.1:5000

然后返回客户端列表点击服务器左侧加号,可以得到⼀条如下所⽰的客户端命令,复制后配置客户端时使⽤,记得放⾏防⽕墙端⼝

./npc -server=服务器IP:端⼝(默认8024) -vkey=⾃动⽣成的密钥 -type=tcp

如果需要修改默认端⼝ 8024 ,可以修改  bridge_port  后重启⽣效(理论上,笔者未测试),卸载可以执⾏  nps uninstall  后通过whereis nps  找到残留⽂件删除即可

Client端

⾸先防⽕墙放⾏相应端⼝,然后解压压缩包然后进⼊⽬录并执⾏上⾯复制的客户端命令,理论上,刷新后台即可看到客户端状态均变为绿⾊,因为是直接⽤ ssh 执⾏的命令,因此如果未正常连接,可以通过⽇志来查错和修正,基本的排查错误的思路和 FRP 相同

NAT服务器

Server端

和上⾯完全相同

Client端

稍有不同的是需要将客户端命令改为映射后的端⼝,如上图中的 37000 ,服务器IP  实测⽀持填写域名

ZeroTier

如果阅读了上⾯两个⼯具的 Github 页⾯或者官⽅⽂档,就会发现,⾥⾯都提到了⼀个 P2P 的连接⽅式,但是笔者尝试后会发现存在诸多问题且很多时候⽆法连接,官⽅也表名并不稳定,那么,有没有⼀个专门做 P2P 连接的⼯具呢,这个就是了,⼀个使⽤ CPP 和 C 实现的内⽹穿透⼯具,并且组建的是局域⽹,本⽂使⽤的是 1.4.6 版本

/zerotier/ZeroTierOne

Leaf 节点(叶⼦节点)

这⾥⾯的概念发⽣了⼀些变化,因为这个的⽬的是将所有⽤户连接起来形成⼀个局域⽹,因此所有⽤户都是平等的,也就没有服务端和客户端的区别了,增加⼀个⽤户相当于增加了⼀个 Leaf 节点,可以

使⽤⼀键安装包, Windows ⽤户去下载 exe ⽂件安装即可,如果 debian 系统下提⽰没有 sudo 同时已经在 root ⽤户下,去掉 sudo 即可

curl -s | sudo bash

如果安装时提⽰  NO_PUBKEY 1657198823E52A61  ,则需要添加公钥,这种情况⼀般是使⽤了第三⽅的镜像导致的,⽐如清华源、阿⾥源

apt-key adv --keyserver --recv-keys 1657198823E52A61

安装完后就可以通过  zerotier-cli  配置服务器了,⾸先,开启服务并设置开机⾃启

systemctl start zerotier-one

systemctl enable zerotier-one

打开官⽹创建账号然后新增⽹络

/network

然后获得⼀个  Network ID  ,所有节点加⼊⽹络都使⽤相同的命令,Windows 下就使⽤管理员权限的

CMD 来执⾏

zerotier-cli join ID

如果成功则会返回

200join success

然后打开防⽕墙 9993 的 udp 协议,Windows 下⾃动打开了,⽆需⼿动操作

然后在官⽹中打开该⽹络的设置页⾯,在  Members  中就会多出⼀个成员,即 Leaf 节点,左侧打钩即可同意加⼊⽹络,同时会显⽰版本号和公⽹ IP 并分配⼀个内⽹ IP ,当有超过两个节点之后,就可以通过内⽹IP  Managed IPs  相互连通了,这个页⾯似乎是会进⾏ ajax 刷新的,所以不需要⼿动刷新

Moon节点(⽉亮节点)

但如果连接国外 Planet 节点(⾏星节点)的效果不够好怎么办,可以⾃⾏搭建 Moon 节点当中转站,⾸先,将 Moon 节点按上⾯⽅法加⼊⽹络并授权,然后新增 Moon 配置

cd /var/lib/zerotier-one

zerotier-idtool initmoon identity.public > moon.json

修改配置⽂件  moon.json  ,在括号内填⼊服务器的公⽹ IP 和端⼝,注意需要双引号,同时复制ID,位于  ["id": "18fasd2319"] 内,后⾯让其他 Leaf 节点加⼊时使⽤

"stableEndpoints": ["公⽹IP/9993"]

在该⽬录下⽣成 Moon ⽂件,⽂件名类似于

zerotier-idtool genmoon moon.json

新增 moons.d ⽂件夹,即  /var/lib/zerotier-one/moons.d/  ,将 ⽂件移⼊,然后重启服务

systemctl restart zerotier-one

其他节点绑定 moon 节点的⽅式都是输⼊以下命令, ID 需要改为上⾯复制的 ID

zerotier-cli orbit 18fasd231918fasd2319

重启服务后查看是否添加成功

zerotier-cli listpeers

zerotier-cli listmoons

listpeers 列出了局域⽹内所有的节点,包括官⽅的⾏星中转节点 Planet 、所有⽤户的叶⼦节点 Leaf 以及⾃建的⽉亮中转节点 Moon ,⼀⾏为⼀个节点,如果没有看到 Moon 节点则添加失败, listmoons 如果返回为空则失败

当然 Linux 下可以新建⽬录  /var/lib/zerotier-one/moons.d/  ,然后复制⽣成的 moon ⽂件到⽂件夹下,重启服务后查看是否⽣效

Windows下的默认⽬录在  C:\ProgramData\ZeroTier\One\moons.d\  ,新建该⽂件夹然后复制进去,重启(停⽌然后启动)服务(打开开始菜单然后搜索服务即可找到)即可,如果执⾏ zerotier-cli 的命令时出现missing authentication token,则需要⽤管理员⾝份启动 CMD ,如果出现了服务不正常的情况,⽐如右键状态栏中图标发现没有节点,可以尝试⼿动重启服务或重启电脑

两个 Leaf 节点如果打通则通过 9993 端⼝的 UDP 协议连接,速度取决于两端的带宽和延时,与中转节点⽆关,如果两个 Leaf 节点之间未能成功打通,则会⾛服务器中转

NAT服务器对⽐

⽆论如何都要选择 KVM 架构的服务器,⼀般都有标明的,这个可玩性才⾼,⼀般情况下价格也不会⾼很多

CloudIPLC

/

需要实名认证,仅能开启⼀个服务器,电信移动联通均有,最便宜的 1C+384M+4G+600G ,价格为30元⼀个⽉,这个⼤⼩的内存如果重装纯净版,仅能安装 Debian9 , CentOS 和 Debian10 都是装不上的,512M 的内存可以装 Debian10 ,具体的重装教程请阅读下⼀篇⽂章

需要⼿动映射内⽹端⼝到公⽹端⼝上,TCP和UDP分开映射,考虑 ssh 端⼝占⽤⼀条,则可以配置额外⼗条映射规则

如果使⽤ FRP 的 KCP 模式,通信端⼝占⽤ TCP + UDP 两条映射规则,则可以映射 8 个额外的端⼝

如果使⽤ NPS ,通信和 WebUI 占⽤两个端⼝,同样有额外 8 个端⼝可⽤,如果使⽤纯⽂本配置,则多⼀个,但是会⿇烦很多,⽤ NPS 就是看上了他的 WebUI

如果使⽤ ZeroTier,emmmmmm,为什么要为⼀个中转功能开⼀个 NAT 服务器啊淦,随便开个普通的服务器就好了,或者直接⽤官⽅的节点

不过不太能够理解的是,因为不明原因,在穿透可道云的时候,加载含⼤⽂件的⽂件夹时百分百会出现  Ajax Error ,且⽆法打开  AriaNG,在重装清华源 Debian9 、开启 BBR 、检查 MTU 、⼿动部署 Nginx-1.14.2 、⼿动部署 PHP7.3-FPM 、提⾼所有超时和⼤⼩限制、开启UDP 之后问题依旧,服务器提供商表⽰问题你们⾃⼰解决,可道云开发者表⽰不关我事,遂放弃。不过在下载时,速度⽐较稳定,能长期维持 5MB/s 的速度,因为百兆是进出⼝带宽,在中转的时候同时进出,所以满速就是 5MB/s 左右,如果有 dalao 能解决上述问题,欢迎评论区留⾔和讨论

OLVPS

/

不需要实名认证,能开启多个服务器,电信移动联通均有,最便宜的仅有 256M 内存,考虑到上⾯的经历,尝试了下 512M 内存的服务器,价格稍贵,读者可以尝试更便宜的那⼀款,进去后成功重装清华源的 Debian10

固定开启⼀个端⼝段,需要在使⽤的时候将端⼝改到相应的端⼝段内,不过好处是 TCP 和 UDP 可以同时开启,直接在防⽕墙上放⾏即可,因此最多有 10 个端⼝(相当于20 条映射规则)

测试可道云穿透和 AriaNG 穿透均正常,不过速度不是很稳定,经常会掉到⼏百 K ,在开启 BBR 之后情况依旧,那么,有什么理由让我不使⽤ ZeroTier 呢

更多推荐

服务器,服务,节点,需要,映射


一、Zerotier 原理

1665711994820.png

关于 zerotier,搜集网上资料和个人一点浅薄的理解。

概念

  1. planet:核心角色,官方不允许自建私有,zerotier 的行星服务器,用于管理全球所有的 zerotier 客户端的地址信息,帮助建立客户端间的直接链接,以及在无法建立直接链接时,作为中继服务器转发设备间的流量。

  2. moon:官方允许自建私有,作为离客户端更近的中继服务器存在,可以使转发的效率更高。

原理

  1. 客户端注册

在内网机器上启动一个 zerotier 客户端,使用 join 加入一个网络,在控制台对客户端进行授权,此时 planet 上有如下记录:

10.0.0.1 - 150.0.0.1/15679
10.0.0.2 - 160.0.0.1/22226
  1. 尝试 p2p 连接

当在 10.0.0.1 机器上访问 10.0.0.2,内网机器向 planet 查询到目标地址的公网 160.0.0.1,端口为 22226。

10.0.0.1 尝试与 160.0.0.1的 22226 端口进行直接数据交互,这个过程称为 udp 打洞实现 p2p 直连。

  1. planet 转发

由于各种网络限制,p2p 不能直连。

此时通过 planet 转发,如果还配置了 moon 节点,此时会通过速度快的 moon 节点进行转发。

如上图则大概率从上海的 moon 节点进行数据转发,此时网络取决于 moon 的带宽。

二、私有 zerotier-planet 的优势

  • 解除官方的设备连接数限制

  • 提升手机客户端连接的稳定性

三、搭建私有 planet

了解了 zerotier 的概念原理,那么大概了解搭建私有 planet 的重要性。

1、运行控制器容器

docker run -d \
--name zt-ui \
-v /home/docker/zt-ui/zerotier-one:/var/lib/zerotier-one \
-v /home/docker/zt-ui/ztncui/etc:/opt/key-networks/ztncui/etc \
-p 4000:4000 \
-p 9993:9993 \
-p 9993:9993/udp \
-e MYADDR=1.1.1.1 \
-e HTTP_PORT=4000 \
-e HTTP_ALL_INTERFACES=yes \
-e ZTNCUI_PASSWD=admin123 \
--restart=always \
hausen1012/ztncui

这里需要注意的是传参需要将 1.1.1.1 修改为公网 ip。

2、生成 planet 文件

docker exec -it zt-ui bash /tmp/patch.sh && \
docker restart zt-ui

如果 linux 内核版本太低,可能报错 FATAL: kernel too old,那么需要升级内核。

关于升级内核,可以参考这篇文章 Linux 系统内核升级

当然,如果你觉得云服务器不太方便升级内核,那么完全可以用一台测试的虚拟机进行生成文件,文件生成后用 ftp 上传到 /home/docker/zt-planet 目录,然后再启动容器。

3、测试

docker exec -it zt-ui zerotier-cli listmoons
# 显示如下内容则表示搭建成功
[
 {
  "id": "00000004e3b1b4b0",
  "roots": [
   {
    "identity": "04e3b1b4b0:0:ea0c548b45efcc701c052305f06568c749a4647b9a5b111e2b372c05f7c3ed56ae1009c29cb1aa51d95057bf1b65b3a2f7b01d129437f6b72efd08f68281fb52",
    "stableEndpoints": [
     "1.1.1.1/9993"
    ]
   }
  ],
  "signature": "b4f539ef93e198203d9e270c155d091769408ff98489d83bcf6444d2a95112ca7369138b98d42512caa3c878f3eff2c27ecada28f549ea19e3a407e71bbeb008d51f6ba92af17e8b6e4c1b8eacbd4abc42f0f639746ea924cffb99b539f94e2b",
  "timestamp": 1665642068786,
  "updatesMustBeSignedBy": "7fcb120079801a1ddde8c1fb6657365351bca7279e8470728f4cf01fb5efc81b57cde03338b4ea76dfd39570f74f2654d8d52a22613e77ed2e4cbb46a648a42d",
  "waiting": false
 }
]

1.1.1.1 为公网 ip 则搭建 planet 成功。

四、创建私有网络

访问 http://公网ip:4000,账号密码:admin/admin123。

1、创建网络

1665677264789.png

2、初始化网络

点击 Easy setup

1665677326694.png

设置网段和子网掩码

1665677383128.png

五、安装 zerotier 客户端

docker 安装

既然已经搭建了私有的 planet,当然是使用自己的,需要先下载服务器 /home/docker/zt-planet/zerotier-one 目录下的 planet 文件。

1、启动 zerotier 客户端

docker run -d \
--name=zt-cli \
--device=/dev/net/tun \
--net=host \
--cap-add=NET_ADMIN \
--cap-add=SYS_ADMIN -d \
-v /home/docker/zt-client/zerotier-one:/var/lib/zerotier-one \
--restart unless-stopped \
hausen1012/zerotier

2、替换 planet 文件

将服务器下载的 planet 文件上传到客户端的 /home/docker/zt-client/zerotier-one 目录。

3、重启客户端

docker restart zt-cli

4、查看 planet

docker exec -it zt-cli zerotier-cli listpeers

1665675010184.png

可以看见 stableEndpoints 的配置是自己的公网 ip。

5、加入网络

docker exec -it zt-cli zerotier-cli join 8b8b9ed58a10bd45

6、授权

1665677970480.png

ip 也可以自己设置,不过要在刚刚设置的网段内。

1665678246335.png

windows 安装

1、下载客户端

下载地址

2、安装客户端

双击安装即可

3、替换 planet

将下载好的 planet 文件复制到 C:\ProgramData\ZeroTier\One 目录下

4、重启服务

如果仅仅只是重启 ui 是不行的,需要找到任务管理器 -> 服务 -> ZeroTierOneService,进行重启。

1665726393553.png

5、查看 planet

1665726530197.png

可以看见 planet 地址是自己的公网。

6、加入网络

点击右下角图标,join new network,输入刚刚创建的虚拟网络 id,我这边是 8b8b9ed58a0baa3d。

7、授权

和 dokcer 安装一样的操作,不再赘述。

六、测试

通过上述方式将两台机器加入到网络,通过 ping 查看是否能打洞成功。其中 202 本地虚拟机,vps 是有公网 ip 的云服务器。

1665710086842.png

ping 检测

在 10.0.0.202 机器上 ping 10.0.0.222。

1665727979834.png

listpeers 查看到只有自己的私有根服务器,ping 的延迟不到 100ms 和直接 ping 公网 ip 差不多,说明打洞成功。

局域网 scp 检测

1665679296983.png

可以看见速度能达到十几MB,而我的根服务器是腾讯云的 8Mbps 服务器,如果通过根服务器转发肯定不可能达到这个速度,说明打洞成功。

speedtest 测速

1665740929613.png

发布于 2022-10-14 22:59

局域网

内网穿透

NAT网络地址转换协议

赞同 1224 条评论

分享

喜欢收藏申请转载

写下你的评论...


24 条评论

默认

最新

大世界小师

大世界小师

有没有办法修改9993端口呀,我用的FRP,想把本地的9993转发到公网的其他端口

09-29 · IP 属地浙江

回复喜欢

佐蓝

佐蓝

ZT_ADDR=localhost:9995

昨天 09:25 · IP 属地江苏

回复1

阿蛮君

阿蛮君

作者

这个没试过诶,建议直接上headscale[大笑]

09-30 · IP 属地广东

回复1

颹椲

颹椲

你好,已经按大佬的布置成功了,想咨询一下,我通过在openwrt路由器上安装zerotier让路由器能加入到自建内网当中来,想开启路由的nat模式。让路由器下面的也能够到内网当中,在服务器端应该怎么设置呀

07-18 · IP 属地四川

回复喜欢

阿蛮君

阿蛮君

作者

颹椲

这个我也不是很清楚,我现在还headscale了,方便迁移。headscale用命令可以很方便看是直连还是中转

08-11 · IP 属地广东

回复喜欢

颹椲

颹椲

阿蛮君

嗷嗷嗷,谢谢!现在是自建了planet服务器,双方一方是有公网IP是的联通一方是公网IP v6的移动,路由表net也设置成功了,延迟也基本上60ms以内,但是用iperf测出来穿透的速率始终不理想,想知道到底是因为中转的问题还是说运营商qos了([爱]

08-10 · IP 属地四川

回复喜欢

展开其他 1 条回复

阿蛮君

阿蛮君

作者

zero只能使用ip,换机器会比较麻烦,headscale可以使用域名,且打洞更加稳定,教程在这:amjun.com/1957.html

07-05 · IP 属地广东

回复喜欢

脑阔有点痛

脑阔有点痛

请问一下为啥我添加routes还是不行呀?我想的是内网一台加入zerotier网络完后负责转发内网流量。

06-24 · IP 属地四川

回复喜欢

阿蛮君

阿蛮君

作者

可能你可能添加的路由有问题,参考我博客另外一篇文章。

06-25 · IP 属地广东

回复喜欢

3584SP

3584SP

可以支持多个plant吗,我的服务器在国外,有时候也会连不上,想多搞几个plant当备用[捂脸]

06-17 · IP 属地上海

回复喜欢

枫叶果冻

枫叶果冻

请问第一步的1.1.1.1那里可以用域名吗?我的公网IP是变动的

05-20 · IP 属地湖南

回复喜欢

阿蛮君

阿蛮君

作者

目前好像是不行的

05-21 · IP 属地广东

回复喜欢

sjfuxhebdudn

sjfuxhebdudn

请教下,自建plant以后,苹果跟安卓手机能加进来吗

03-31 · IP 属地云南

回复喜欢

阿蛮君

阿蛮君

作者

苹果没试过,安卓肯定可以

03-31 · IP 属地广东

回复喜欢

风钥

风钥

我搭建好了。但是我不是mc那种,我想玩的游戏时深岩银河,需要官方服务器握手才行。请问怎么可以在游戏里联机?


03-30 · IP 属地安徽

回复喜欢

BlacKucha

BlacKucha

纯小白 其他都弄好了 就差这一步生成 planet 文件 该嗯么办呀楼主

2022-12-08 · IP 属地北京

回复喜欢

初心

初心

阿蛮君

为什么我根服务器搭建好了,两台客户端机子也加入网络建立连接了,这时把根服务器断开网络,然后两台客户端机子的连接也中断了。按理说两台客户端机子建立的p2p连接,服务器断开不会影响已经建立好的p2p呀。难道说不是建立的P2P连接?

03-29 · IP 属地广东

回复喜欢

初心

初心

阿蛮君

第二步这里是生成planet,上一步是运行容器,那么搭建呢?

03-28 · IP 属地广东

回复喜欢

展开其他 2 条回复

cc7ing

cc7ing

请问planet可以relay吗?是不是自建planet就不需要moon了?

2022-11-15 · IP 属地北京

回复喜欢

阿蛮君

阿蛮君

作者

对的

2022-11-15 · IP 属地广东