一文秒懂cli、snmp、yang、netconf、restconf、openconfig

前言

自以太网诞生以来,各种技术引领着一代代的潮流。星辰闪耀,数不尽的网络承载着各种通信的可能,让我们也不禁感慨网络之浩瀚。

前有“云大物移智链边”的风起云涌,后有AI浪潮的大放异彩。上层应用的遍地开花,也迫使着底层网络技术的不断发展。SD-WAN、P4、QUIC、SRV6、SNOIC等一堆和网络相关的技术也应运而生。

无论以上种种技术如何的变迁,最终信息的传递还是基础硬件扛下了所有。尽管这些年来也有高性能硬件也在不断诞生,
如多年前处理网络数据包速度达到6.5Tb/s的Tofino芯片犹如破竹之势,与传统交换机相比可谓是以一抵百,然而硬件的变革不像软件一般疾风骤雨说换就换,迁移成本、兼容性等都不是能一蹴而就的。为了一解燃眉之急,只好使出必杀技:质量不够,数量来凑。

随着设备数量的增加,也给运维管理人员带来了更大的挑战。如何对如此众多的设备进行统一的管理也成为了一个的思考方向。

本文将以笔者的个人观点,总结下从cli到snmp、netconf、restconf、openconfig这些网络管理技术的特点与应用场景。

cli

从祖师爷CLI开始,人们便开始探索着如何通过命令行界面来掌控网络的命运。
telnet带内(管理),cosole带外(管理),飘逸又自在。

cli-console

特点:简单方便,功能完备,一本参考手册可走天下。

如果仅需管理几台设备用cli方式完全足够,酷酷的控制台界面,不能再拉风。

命令基本靠手敲,是否敲错全靠人眼判别。

这种模式下,一旦所需要管理的设备多起来还用cli来管理,疯是早晚的事儿。

为此有人想到了自动化编程来解决:什么Paramikojsch哪种语言熟练用哪个。
paramiko-jsch

看似能解决繁琐和批量管理的问题,但也让人想到了一些缺点:

  • 不同型号的设备命令不同,还得靠背,兼容性差
  • 没有规范的协议标准,自动化方式效率低
  • 缺乏模块化与事务机制,配置一个功能由多个命令组成,容易出现部分命令成功的情况,可靠性差
  • 监控功能匮乏,尽管通过CLI提供的命令能输出状态信息但解析为自动化成本则较高,无标准的监控机制
    ……

SNMP

前面讲到cli实现自动化有诸多不便,“饭得一口一口吃,事得一件一件办”。于是,横扫网络监控数十载的SNMP便就此诞生了。

Simple Network Management Protocol (SNMP),简单网络管理协议。

snmp

SNMP协议也算是一个发展历史较长的协议,诞生于上世纪80年代初,主要为解决网络设备的监控与管理诞生,它最重要特点就是:simple,简单

发展至今SNMP有了3个版本,主要特点如下表:
snmp-version

简单来讲,SNMP基于C/S架构,网络设备作为SNMP代理,向网络管理系统提供各种管理信息,管理系统则通过SNMP协议进行查询和配置。

snmp-nms

SNMP中主要涉及到以下组件:

  • NMS,网络管理系统
  • Agent,代理进程,被管理设备中的代理进程,向NMS上报数据
  • Managed Object,被管对象/设备
  • MIB,管理信息库,被管理设备维护的变量的数据库。设备与网管需持有相同的MIB,以确保采集指标一致。

snmp-overlay

另一个重点为:SNMP交互过程主要采用一问一答的pull机制,数据包使用UDP进行传输,NMS(网管)端监听162端口,Agent(被采集者)监听161端口。

Agent也可使用Trap或Inform主动向NMS上报消息,多用于告警场景。Trap与Inform区别在于Inform需要NMS回复确认消息。

整体来看SNMP非常符合它的名字——SIMPLE。也正因为简单,在当前网络大时代SNMP存在以下缺点:

  • 消息传递使用UDP传递,缺乏可靠性
  • 监控功能基于pull机制,且必须一对一通信,监控大量设备时Server端占用资源大
  • SET功能缺乏事务性,加上UDP传输,多个SET容易部分成功部分失败
  • 监控周期一般为分钟级,微突发场景的数据无发采集到,毛刺数据丢失(不满足《奈圭斯特采样定理》),数据完整性不佳

当然SNMP并非无用武之地,毕竟它是SIMPLE NMP,如仅需采集些数据做做展示,用它绝对是不二之选。搞个prometheus的snmp_exporter,再搭配个grafana的界面,实现个XXX监控系统分分钟的事儿(天下武功,唯快不破)。
snmp-grafana

该有的数据都有,界面要多炫酷有多炫酷,有没有?没准这也是SNMP经久不衰的秘诀之一。

MIB

在SNMP中组件有好几个,这里单独对MIB简单介绍下。
MIB是Management Information Base的缩写,即:管理信息库。
也可以简单理解为:MIB是对象与ID映射关系库。
mib
在MIB中定义了被管理设备所维护的变量,如:对象的名称、对象的状态、对象的访问权限和对象的数据类型等。

MIB为树型结构,每个对象标识符OID(object identifier)对应于树中的一个管理对象,该树的每个分支都有一个数字和一个名称,并且每个点都以从该树的顶部到该点的完整路径命名,如上图mgmt的OID为1.3.6.1.2。

支持SNMP的每个设备都有一个自己的MIB,可以是公有的也可以是私有的,一般设备厂商采用公有+私有方式,私有MIB算是公有MIB的必要补充。

当使用SNMP查询设备的某个信息时,需要先找到对应的设备信息的MIB拿到OID值。
mib-oid
以要查询华为S7700设备的CPU信息为例,找到对应的产品手册MIB文档,获取出OID,再使用Agent传入OID参数查询即可。

Telemetry(广义)

前面提到SNMP在监控场景存在着一些不存,有耿直的小伙这里可能表示不服了:既然SNMP不行,那有解决办法么?

于是乎《RFC 9232》便被提出来了——Network Telemetry Framework。它算是对一个广义的网络监控框架的描述,其中构思了理想的框架。
telemetry

可以认为:在广义的Telemetry中,一个监控系统应由网络设备、采集器、分析器和控制器等部件组成。

telemetry-overlay

控制器向设备发送订阅消息请求订阅某项监控数据,随后设备将被监控数据使用推模式向采集器进行持续上送,数据推送周期由采集器自行控制,监控周期可实现亚秒级监控。

RFC 9232中提出的Telemetry没有阐述具体的实现,一般也认为它是广义的Telemetry,狭义的Telemetry可查看后文OpenConfigStream Telemetry章节。

yang

《周易》有言:“易有太极,是生两仪。两仪生四象,四象生八卦”。
从微观到宏观,从物质到精神,世间万物都被认为是太极的表现形式。站在一个更高阶的抽象,仿佛它就是宇宙的万象之源。
yang

没错,接下来介绍本文的一个重点——yang。

前文多次提到,无论是cli还是snmp都只能对一个对象单独配置,而不是面向一个业务。不支持事务,可读性差等问题纷来沓至。

为了解决以上问题并应对现代网络环境中日益增长的配置管理需求,IETF亲自出手提出了YANG(Yet Another Next Generation)作为描述网络配置数据的建模语言。其对应的RFC链接为:https://datatracker.ietf.org/doc/html/rfc6020

yang-client-server

YANG官方定义为:YANG是一种数据建模语言。YANG模型定义了数据的层次化结构,可用于基于网络配置管理协议(例如NETCONF/RESTCONF)的操作,包括配置、状态数据、远程过程调用和通知。YANG相对于SNMP的模型MIB,更有层次化,能够区分配置和状态,可扩展性强。

简单来讲,YANG站在一个更高的维度,提供了一种高屋建瓴的思想来指导配置或监控的数据落地的方式。如数据库表中的DDL,提供出定义和约束。也可以与SNMP中的提到的MIB进行类比,MIB中将一个个具体的指标进行定义,属于最小单元,YANG则将这些最小单元进行组装形成一个模型。

与MIB同样的,在管理者与被管理者间都有一份相同的YANG模型,具体数据发送时发送方携带YANG模型标识及数据实体形成一个整体进行发送,发送方式并不进行约束,SSH、HTTP、gRPC啥都行。

yang-with-conf

如作为网络配置人员需对某一设备进行配置,仅需要拿到对应设备的YANG文件按照它的定义向设备下发配置即可。
huawei-yang

如作为开发人员则可能需要编写YANG文件,YANG文件的语法需要符合它的语法规则,这部分网上的资料也很多,如果是大佬也可直接查看对应RFC文档。
https://datatracker.ietf.org/doc/html/rfc7950

快速入门的话看华为的资料也不错,链接为:YANG API参考

yang-model

在yang的github中也整理了些关于其他硬件厂商的yang模型,感兴趣者可进一步查看
https://github.com/YangModels/yang/tree/main/vendor

yang-public

NETCONF

netconf
如前所述,YANG模型的上层一般由NETCONF、RESTCONF、OPENCONFIG/gRPC来进行调用。这里根据各自诞生的时间顺序依次来看一下。

最先出场的是NETCONF(Network Configuration Protocol)其诞生时间也最久,由IETF于2003年成立。在当时那个XML蔚然成风的年代,NETCONF协议也选择使用XML作为传输载体,以SSH协议进行通信。
netconf-overlay

交互过程如上图所示。每次NETCONF CLIENT与NETCONF SERVER进行交互前也需要进行握手,各自发送HELLO包并完成支持能力的协商,之后便可以发送RPC包进行正真的交互了。

以某个修改设备的某个配置为例,其封装的XML内容如下:
netconf-xml

NETCONF中除了支持配置外,也支持订阅告警功能。
netconf-notification

使用的是netconf中的Notification能力,Notification支持向客户端上报告警和事件,以便客户端及时感知设备配置等的变更。

经过多年的发展,各设备厂商也几乎NETCONF协议进行了适配。

github上也逐步涌现出了一些关于netconf的框架,比较知名的有netopeer2,使用C语言实现了NETCONF-SERVER端。ncclient,使用PYTHON实现了NETCONF-CLEINT端。JAVA方面比较成熟则有OPENDAYLIGHT中的NETCONFIG模块,NETCONF的SERVER端与CLIENT端均有实现。

RESTCONF

restconf-his

随着网络规模、复杂度、自动化运维的需求增大,以及WEB技术的高速发展,当前网络管理者希望设备能够提供支持Web应用访问和操作网络设备的标准化接口,NETCONF已无法满足网络发展中对设备编程接口提出的新要求,于是2017年融合了NETCONF和HTTP协议RESTCONF悄然诞生,为用户提供高效开发Web化运维工具的能力。

RESTCONF与NETCONF比较

项目 NETCONF+YANG RESTCONF+YANG
传输通道(协议) NETCONF传输层首选推荐SSH(Secure Shell)协议,XML信息通过SSH协议承载。 RESTCONF是基于HTTP协议访问设备资源。RESTCONF提供的编程接口符合IT业界流行的RESTful风格。
报文格式 采用XML编码。 采用XML或JSON编码。
操作特点 NETCONF的操作复杂,例如:
* NETCONF支持增、删、改、查,支持多个配置数据库,也支持回滚 。
* NETCONF需要两阶段提交(即先提交参数,再commit参数)。
RESTCONF的操作简单,例如:
* RESTCONF支持增、删、改、查操作,仅支持<running/>配置数据库。
* RESTCONF操作方法无需两阶段提交,操作直接生效。

与NETCONF相比,RESTCONF涵盖有NETCONF的所有功能,其支持JSON编码的特点让数据的可视化进行了增强,也大大减少了运维管理的开发周期。
net/rest-conf

RESTCONF操作方法与NETCONF协议方法

RESTCONF+YANG NETCONF+YANG
OPTIONS N/A
HEAD <get-config>,<get>
GET <get-config>,<get>
POST <edit-config> (nc:operation=“create”)
POST 调用RPC操作
PATCH 当操作对象已存在时,<edit-config> (nc:operation=“merge”)
DELETE <edit-config> (nc:operation=“delete”)

RESTCONF目前落地方面也还不错,很多厂商的设备都对其进行了支持。

更多RESTCONF的资料也可查看此链接:RESTCONF介绍

OPENCONFIG

现在的你是否还记《笑傲江湖》中有过这样一句话:“有人的地方就会有江湖。”
dfbb

我想,这句话搬到网络行业中同样适用,不同的网络设备厂商有着各自不同的规范与命令,从SNMP的MIB到YANG的模型,厂商与厂商之间,设备与设备之间均不能通用,仿佛一个个的江湖。

普遍来看不同厂商有着各自的特色也没有什么不好,总比全一模一样被告抄袭好很多。不过有个问题是比较明显的,给要管理众多设备的软件厂商带来了许多适配工作,终于有一天几位软件老大哥提出了构想:“大道之行也,天下为公,要不咱们哥几个给制定个规范,让所有的配置和监控模型全给统一一下?”,大哥们的执行能力也很强,想着:“反正自己又不是设备厂商对自己也没啥影响”,说干就干,于是由Google、Facebook、Microsoft、AT&T等公司牵头的OpenConfig便诞生了。
openconfig

OpenConfig标语中写着一句话:“Vendor-neutral, model-driven network management designed by users”,由用户设计的与厂商无关模型驱动的网络管理。

在OpenConfig的主页中也用4个图例概括了OpenConfig的主要功能:
openconfig-features
分别有:

  • Common data models,通用数据模型
  • Streaming telemetry,流式数据遥测
  • Management protocols,管理协议
  • Testing and compliance,测试与合规

仔细一品,仿佛理想被照进了现实,一切都是那样的美好。接下来一起简单学习下。

Data models

在Common data models部分,OpenConfig旨在使用通用的数据模型来管理网络中的各种设备。
openconfig-public
模型描述语言仍使用的是YANG,已发布的模型在OpenConfig的github中也可能看到对常用的协议进行了全覆盖。其已发布模型链接地址为:
https://github.com/openconfig/public/tree/master/release

查看某些主流设备厂商的主页,OpenConfig也能在部分产品中找到对OpenConfig模型进行了部分的适配
openconfig-devices

除了硬件设备厂商外,部分软件交换机也进行了部分的适配,如在SONIC的github中也可看到OpenConfig的身影

sonic-openconfig

初步来看效果也还不错。

Streaming telemetry

在前文介绍SNMP的时候提到了广义的telemetry技术,而满足telemetry要求的狭义telemetry技术的则为这里的Streaming telemetry
同时Streaming telemetry也是OpenConfig各大模块中落地最多的模块,现几乎所有的大型硬件厂商都对Streaming telemetry提供了支持。

streamTelemetry
Streaming telemetry的出现让设备监控发展到另一个新的高度。

Streaming telemetry下的数据监控/遥测过程大致为:采集控制器与被采集设备使用GRPC进行通信完成数据的订阅,采集设备再使用GRPC方式持续向采集器进行数据的推送,数据使用gpb进行封装也具有良好的性能。

工程应用时,如需使用Streaming telemetry实现可直接查看对应设备的介绍文档,各大设备厂商几乎都有对它的介绍。

再提一点:为什么grpc比netconf、restconf性能高,可直接看如下图:
grpc-conf-diff

同样的内容如果用netconf传输,使用的是xml进行传输其字节大大小会比GPB大上很多,性能也便是不言而喻。

gNMI

文章最后再看下gNMI是何方神圣。

gNMI是gRPC Network Management Interface的简写,是一套基于gRPC的标准化网络管理接口。

接口内容可从gNMI的github仓库中找到,gnmi.proto的service内容如下:

service gNMI {
  // Capabilities allows the client to retrieve the set of capabilities that
  // is supported by the target. This allows the target to validate the
  // service version that is implemented and retrieve the set of models that
  // the target supports. The models can then be specified in subsequent RPCs
  // to restrict the set of data that is utilized.
  // Reference: gNMI Specification Section 3.2
  rpc Capabilities(CapabilityRequest) returns (CapabilityResponse);
  // Retrieve a snapshot of data from the target. A Get RPC requests that the
  // target snapshots a subset of the data tree as specified by the paths
  // included in the message and serializes this to be returned to the
  // client using the specified encoding.
  // Reference: gNMI Specification Section 3.3
  rpc Get(GetRequest) returns (GetResponse);
  // Set allows the client to modify the state of data on the target. The
  // paths to modified along with the new values that the client wishes
  // to set the value to.
  // Reference: gNMI Specification Section 3.4
  rpc Set(SetRequest) returns (SetResponse);
  // Subscribe allows a client to request the target to send it values
  // of particular paths within the data tree. These values may be streamed
  // at a particular cadence (STREAM), sent one off on a long-lived channel
  // (POLL), or sent as a one-off retrieval (ONCE).
  // Reference: gNMI Specification Section 3.5
  rpc Subscribe(stream SubscribeRequest) returns (stream SubscribeResponse);
}

以上便是gNMI的全部,仅有4个方法。分别为:

  • Capabilities
  • Get
  • Set
  • Subscribe

既然gNMI是接口,熟悉面向对象编程的同学一定知道,接口必定有实现。
gRPC-overlay
那么gNMI的实现在哪里呢?
gNMI-demo

以上图为例,展示了gNMI的实现交换总览图。
简单来讲:gNMI作为grpc的接口,实现时由调用者和提供者两部分构成,以Streaming telemetry遥测场景为例,则监控管理平台为client端,被监控设备上的系统为server端,client与server端都为gNMI接口的实现。

再以sonic的官方配置文档为例,一起看下:
sonic-gMNI

gNMI Collector与gNMI Server都为gNMI的实现者,一方为调用方,一方为被调用方。

JAVA方面著名的SDN开源项目onos中的开(放)光(传输)项目odtn(Open Disaggregated Transport Network)应用也使用到了OpenConfig,ODTN应用架构图如下:
ODTN-ARCH

如想快速体验下OpenConfig可直接使用google官方的gnxi,容器和源码在github中都能找到,值得体验。

更多详尽内容可移步openConfig的官方gNMI介绍查看:https://www.openconfig.net/docs/gnmi/gnmi-specification

快速也入门gNMI也可查看此文《网络编程和自动化基础-gNMI》


总结

以上,总结了cli、snmp、netconf、restconf、opencofig这些配置与遥测技术的知识与特点,总体来说各有各的优劣。如果您恰巧面临着配置技术的选型希望此文对您有帮助,如果您问我哪个最好?我的答案是:“技术选型就像买新鞋,只有都亲自看看试试才知道。没有最好的只有最合适的”。

每项技术的诞生都解决了对应时期很多的实际问题,而今再来回头看,我认为它们都是伟大的。

个人文笔原因很多细节仍有许多不尽之处,如有问题欢迎留言评论交流。如果此文对您有帮助,记得点赞收藏额~

相关推荐

  1. c++ 容器

    2024-04-06 19:30:02       33 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-04-06 19:30:02       16 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-04-06 19:30:02       16 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-04-06 19:30:02       15 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-04-06 19:30:02       18 阅读

热门阅读

  1. Python SQLite数据库中处理空值几种方法

    2024-04-06 19:30:02       13 阅读
  2. 洛谷P1000-P1001题解

    2024-04-06 19:30:02       18 阅读
  3. 【C++】 二叉搜索树复习+模拟实现

    2024-04-06 19:30:02       12 阅读
  4. uview2 表单Form校验validate不生效处理方法

    2024-04-06 19:30:02       16 阅读
  5. Python数据分析与可视化笔记 十 关联

    2024-04-06 19:30:02       14 阅读
  6. 数位DP模型

    2024-04-06 19:30:02       14 阅读
  7. Vue 3.0使用router

    2024-04-06 19:30:02       16 阅读
  8. vscode免费登录ssh ,linux git配置免密码

    2024-04-06 19:30:02       13 阅读