searchusermenu
  • 发布文章
  • 消息中心
点赞
收藏
评论
分享
原创

网络管理技术之NETCONF/YANG

2023-06-02 01:24:06
560
0

1. NETCONF

    网络配置协议NETCONF(Network Configuration Protocol)为网管和网络设备之间通信提供了一套协议,网管通过NETCONF协议对远端设备的配置进行下发、修改和删除等操作。网络网络设备提供了规范的应用程序编程接口API(Application Programming Interface),网管可以通过NETCONF使用这些API管理网络设备。关于NETCONF的理论部分网上有很多资料,最权威的肯定还是RFC 6241,下面就先来了解下NETCONF的理论部分。

1.1 NETCONF的协议框架

    NETCONF采用分层的协议框架,可以分为四层,由低到高分别为安全传输(Secure Transport),消息(Messages),操作(Operations)和内容(Content):

                                                   

每层分别对协议的某一方面进行包装,并向上层提供相关服务。分层结构使每层只关注协议的一个方面,实现起来更简单,同时使各层之间的依赖、内部实现的变更对其他层的影响降到最低。

  1. 安全传输层 : NETCONF从协议层面就已经规定其传输层必须使用带有安全加密的通信协议。而NETCONF协议规定必须要支持SSH,所以目前SSH是NETCONF使用最广泛的传输层协议。

  2. 消息层 : 基于Remote Procedure Call(远程调用)这个协议,其作用是提供一个简易的不依赖于传输层,生成RPC和通知消息框架的通信协议。客户端把RPC请求封装在一个<rpc>元素内,发送给服务器;服务器把请求处理的结果封装在一个<rpc-reply>元素内,回应给客户端。

    NETCONF中定义了几种消息类型,分别是hello, rpc和rpc-reply, notification。
    
  3. 操作层 :就是定义了一组用来配置以及读取设备信息的基本操作,作为RPC的调用方法,这些基本操作都是在XML语言下被调用                   

  4. 内容层 :由管理数据内容的数据模型定义。目前主流的数据模型有Schema模型,YANG模型等。其中YANG是专门为NETCONF协议设计的数据建模语言。后续会详细介绍YANG。

1.2 NETCONF基本网络架构

   NETCONF网络架构由客户端和服务器组成,客户端一般就是我们的主机,服务器就是被操控的交换机或者路由器,基于ssh的netconf服务端口号是 830,也是可以更改。

   NETCONF 在Client和Server之间使用RPC机制进行通信。Client必须和Server成功建立一个安全的、面向连接的会话才能进行通信。Client向Server发送一个RPC请求,Server处理完用户请求后,给Client发送一个回应消息。下面以NETCONF over SSH 来说明NETCONF基本会话建立过程:

                                                               

1.3 NETCONF数据集

ETCONF支持对数据的分类存储和迁移,支持分阶段提交和配置隔离。所以NETCONF中支持三个数据集,分别是Running、Startup、Candidate。

Running数据集: 运行配置数据集,保存网络设备上当前处于活动状态的完整配置。

Candidate数据集:备选配置数据集,存放设备将要提交到<running>的各项配置数据的集合。对<candidate>的任何改变不会直接影响网络设备。

Startup数据集:启动配置数据集,存放设备启动时所加载的配置数据,相当于已保存的配置文件。

             

 

1.4 NETCONF能力集

除了基本功能,NETCONF协议还允许客户端发现服务器端支持的其它能力列表。能力协商是在会话建立阶段,双方通过发送 消息给对方来通告自己支持的能力。当NETCONF会话打开,每一端(包括Client和Server)必须发送一个包含自身能力列表的 hello 消息。双方至少要发送NETCONF基本能力"urn:ietf:params:netconf:base:1.0"或"urn:ietf:params:netconf:base:1.1"。

可扩展的能力集有如下:

                                   

 

Writable-running能力:此能力指明设备支持对配置数据库的写能力

Candidate Configureation能力:该能力表示server具有一个candidate数据库,并且可以将candidate数据库中的配置提交生效到 running 数据库。

Confirmed Commit能力:此能力仅在支持Candidate Configuration能力时有效,主要应用于对业务进行试运行、验证的场景中。

Rollback on Error能力:此能力表明设备具备错误回滚能力。即支持在操作的参数中携带“rollback-on-error”字段,如果在执行操作时出现错误并产生错误元素,则服务器将停止处理操作,并将配置恢复至执行操作之前的状态。此能力仅在设备支持Candidate Configuration能力时生效。

Validate能力:该能力表示server可以校验client发送的配置数据是否正确;

Startup能力:该能力表示server有一个startup数据库,用于保存启动配置。

NETCONF服务器需要对运行的配置进行独立维护,一般采用<copy-config>操作将 running 数据库中内容更新到startup数据库中,这样在设备重启后就能够恢复运行的配置。

Notification能力: 该能力指明设备可以通过NETCONF协议的Notification能力向客户端上报告警和事件,以便客户端及时感知设备配置等的变更。

2. YANG

    我们知道NETCONF协议标准化了,但却没有对内容层标准化。当需要对设备的配置(configuration)和状态(state)做操作,就需要一种语言来对configuration和state进行建模,从而触发了更优秀的模型语言YANG的出现。

那到底什么是数据模型呢?数据模型可以认为是一种被充分理解和认可的用于描述“某物”的方法。例如思考一下针对一个人的数据模型。我们可能会想到,姓名,性别,身高,体重,职业,籍贯等等。

而Yang就是一种建模语言,我觉得其实就类似别的编程语言,有自己的语法规则并提供一些数据结构,基于这些我们就能建立网络设备的模型。下面就先来了解下 Yang的基本语法结构。

2.1 YANG的语法结构

YANG模型是一种树形结构,是由无数的叶子、列表、叶列表、容器组成的描述整个设备的一棵树。下面介绍YANG基本数据类型,四种主要类型的数据节点,包括叶节点(leaf)、列表节点(list)、叶列表节点(leaf-list)和容器节点(container),以及moudule和submodule。

基本数据类型

在定义叶节点和叶列表节点时,须指定值类型。YANG原生支持的 build-in基础数据类型,主要有binary、bits、boolean、decimal64、empty、enumeration、instance-identifier、int8/16/32/64、leafref、string、uint8/16/32/64、union。

(1) 叶(leaf)

    叶子包含简单的数据,如整数和字符串,是一个叶子节点,只能有一个实例。每个单独属性可以由叶 leaf 表示,每个叶必须指定类型

(2) 叶列表(leaf-list)

    叶列表定义了特定类型的值序列。它是只有一个叶子的列表,只能创建和删除。类似数组。与leaf区别在于leaf只有一个实例,而leaf-list可以有多个实例

(3) 列表(list)

  列表为一系列数据节点的集合,它像一张数据库表一样,列表中用 关键字 key 来标识其主键,由关键字 unique定义哪些数据节点需保持唯一 ,有多个实例 。子节点可以是容器、叶节点、叶列表。

(4) 容器(container)

    容器节点用于在子树中组织相关的节点。容器可以包含任何数量的任何类型(包括叶节点,列表节点,叶列表节点和容器)的子节点。

(5) 派生类型typedef

    但是在实际建模中,YANG原生支持的 build-in基础数据类型肯定是不够的。YANG允许用户使用typedef来定义自己需要的type,可以基于build-in type另外一个派生的type。

module

module是YANG的基本单元,是包含各节点的顶层结构,是写yang文件的基本框架,YANG将数据模型构建为模块,模块名与YANG文件名一致。一个module可以从其他module中导入数据,也可以从子模块中引用数据。

外部module 的引入(import & include):

导入语句import :允许引用其他模块中定义的材料;

包括语句 include :来标识属于它的每个子模块。

module中包括以下几种类型语句:

1、head语句(yang-version/namespace/prefix)

2、连接语句(import/include)、

3、元信息(organization/contract)、

4、revision语句、

5、定义语句(container/leaf/leaf-list/grouping等等)。

module中元素介绍图:

YANG模块有如下的布局:

submodule

submodule是部分模块定义,用于对模块提供支持。

submodule文件内容布局如下:

submodule必须通过belongs-to语句使用, submodule只能由belong-to指定的module或这个指定module的其它submodule进行include,其它module(包括submodule)都不能include。同时子模块不可以import它的父模块

2.2 Yang模型分类以及获取

YANG只是一种让网络设备上的数据以一种标准结构存在的语言,这个模型结构可能做得很简洁好用,也可能做得很复杂难用。YANG并不能保证vendor不写出很烂的模型,YANG只能保证这些模型都是有规律的。因此虽然统一了协议和建模语言,但是YANG模型并没有统一,YANG模型分为标准(Standard)和私有(Native)两种类型,其中标准类型中比较著名的有IETF, IEEE, OpenConfig等国际知名组织制定的模型,其中IETF制定的YANG模型最常见。除标准YANG模型之外,各家厂商又根据自家产品的不同设计了私有的YANG模型,比如思科、华为等都有自家的YANG模型。

在Github(https://github.com/YangModels/yang)上存放着大部分标准(standard)和私有(vendor)的YANG模型,截止2020年9月,标准模型中包含IETF,IEEE,ETSI等国际知名组织和协会制定的YANG模块,私有模型中包含思科,Juniper,华为,诺基亚,富士通在内的厂商自己制定的YANG模块。

2.3 处理Yang工具介绍

Pyang是Python专为YANG开发的一个开源模块,主要有三个功能:

  1. 用来验证YANG模块代码的准确性;

  2. 将YANG模块转换成其他格式(比如我们前面讲到的树形格式,XML格式等);

  3. 从YANG模块中生成代码。

    将Yang转化成 XML文件也称为YIN文件,是为了利用各编程语言中现有的XML解析器等工具,这些工具可用来进行数据过滤和验证,自动生成代码和文件或者其他任务,这样可以提升设备解析YANG模型的效率。而将Yang转化为树形格式也会便于查看。

0条评论
作者已关闭评论
l****n
3文章数
0粉丝数
l****n
3 文章 | 0 粉丝
l****n
3文章数
0粉丝数
l****n
3 文章 | 0 粉丝
原创

网络管理技术之NETCONF/YANG

2023-06-02 01:24:06
560
0

1. NETCONF

    网络配置协议NETCONF(Network Configuration Protocol)为网管和网络设备之间通信提供了一套协议,网管通过NETCONF协议对远端设备的配置进行下发、修改和删除等操作。网络网络设备提供了规范的应用程序编程接口API(Application Programming Interface),网管可以通过NETCONF使用这些API管理网络设备。关于NETCONF的理论部分网上有很多资料,最权威的肯定还是RFC 6241,下面就先来了解下NETCONF的理论部分。

1.1 NETCONF的协议框架

    NETCONF采用分层的协议框架,可以分为四层,由低到高分别为安全传输(Secure Transport),消息(Messages),操作(Operations)和内容(Content):

                                                   

每层分别对协议的某一方面进行包装,并向上层提供相关服务。分层结构使每层只关注协议的一个方面,实现起来更简单,同时使各层之间的依赖、内部实现的变更对其他层的影响降到最低。

  1. 安全传输层 : NETCONF从协议层面就已经规定其传输层必须使用带有安全加密的通信协议。而NETCONF协议规定必须要支持SSH,所以目前SSH是NETCONF使用最广泛的传输层协议。

  2. 消息层 : 基于Remote Procedure Call(远程调用)这个协议,其作用是提供一个简易的不依赖于传输层,生成RPC和通知消息框架的通信协议。客户端把RPC请求封装在一个<rpc>元素内,发送给服务器;服务器把请求处理的结果封装在一个<rpc-reply>元素内,回应给客户端。

    NETCONF中定义了几种消息类型,分别是hello, rpc和rpc-reply, notification。
    
  3. 操作层 :就是定义了一组用来配置以及读取设备信息的基本操作,作为RPC的调用方法,这些基本操作都是在XML语言下被调用                   

  4. 内容层 :由管理数据内容的数据模型定义。目前主流的数据模型有Schema模型,YANG模型等。其中YANG是专门为NETCONF协议设计的数据建模语言。后续会详细介绍YANG。

1.2 NETCONF基本网络架构

   NETCONF网络架构由客户端和服务器组成,客户端一般就是我们的主机,服务器就是被操控的交换机或者路由器,基于ssh的netconf服务端口号是 830,也是可以更改。

   NETCONF 在Client和Server之间使用RPC机制进行通信。Client必须和Server成功建立一个安全的、面向连接的会话才能进行通信。Client向Server发送一个RPC请求,Server处理完用户请求后,给Client发送一个回应消息。下面以NETCONF over SSH 来说明NETCONF基本会话建立过程:

                                                               

1.3 NETCONF数据集

ETCONF支持对数据的分类存储和迁移,支持分阶段提交和配置隔离。所以NETCONF中支持三个数据集,分别是Running、Startup、Candidate。

Running数据集: 运行配置数据集,保存网络设备上当前处于活动状态的完整配置。

Candidate数据集:备选配置数据集,存放设备将要提交到<running>的各项配置数据的集合。对<candidate>的任何改变不会直接影响网络设备。

Startup数据集:启动配置数据集,存放设备启动时所加载的配置数据,相当于已保存的配置文件。

             

 

1.4 NETCONF能力集

除了基本功能,NETCONF协议还允许客户端发现服务器端支持的其它能力列表。能力协商是在会话建立阶段,双方通过发送 消息给对方来通告自己支持的能力。当NETCONF会话打开,每一端(包括Client和Server)必须发送一个包含自身能力列表的 hello 消息。双方至少要发送NETCONF基本能力"urn:ietf:params:netconf:base:1.0"或"urn:ietf:params:netconf:base:1.1"。

可扩展的能力集有如下:

                                   

 

Writable-running能力:此能力指明设备支持对配置数据库的写能力

Candidate Configureation能力:该能力表示server具有一个candidate数据库,并且可以将candidate数据库中的配置提交生效到 running 数据库。

Confirmed Commit能力:此能力仅在支持Candidate Configuration能力时有效,主要应用于对业务进行试运行、验证的场景中。

Rollback on Error能力:此能力表明设备具备错误回滚能力。即支持在操作的参数中携带“rollback-on-error”字段,如果在执行操作时出现错误并产生错误元素,则服务器将停止处理操作,并将配置恢复至执行操作之前的状态。此能力仅在设备支持Candidate Configuration能力时生效。

Validate能力:该能力表示server可以校验client发送的配置数据是否正确;

Startup能力:该能力表示server有一个startup数据库,用于保存启动配置。

NETCONF服务器需要对运行的配置进行独立维护,一般采用<copy-config>操作将 running 数据库中内容更新到startup数据库中,这样在设备重启后就能够恢复运行的配置。

Notification能力: 该能力指明设备可以通过NETCONF协议的Notification能力向客户端上报告警和事件,以便客户端及时感知设备配置等的变更。

2. YANG

    我们知道NETCONF协议标准化了,但却没有对内容层标准化。当需要对设备的配置(configuration)和状态(state)做操作,就需要一种语言来对configuration和state进行建模,从而触发了更优秀的模型语言YANG的出现。

那到底什么是数据模型呢?数据模型可以认为是一种被充分理解和认可的用于描述“某物”的方法。例如思考一下针对一个人的数据模型。我们可能会想到,姓名,性别,身高,体重,职业,籍贯等等。

而Yang就是一种建模语言,我觉得其实就类似别的编程语言,有自己的语法规则并提供一些数据结构,基于这些我们就能建立网络设备的模型。下面就先来了解下 Yang的基本语法结构。

2.1 YANG的语法结构

YANG模型是一种树形结构,是由无数的叶子、列表、叶列表、容器组成的描述整个设备的一棵树。下面介绍YANG基本数据类型,四种主要类型的数据节点,包括叶节点(leaf)、列表节点(list)、叶列表节点(leaf-list)和容器节点(container),以及moudule和submodule。

基本数据类型

在定义叶节点和叶列表节点时,须指定值类型。YANG原生支持的 build-in基础数据类型,主要有binary、bits、boolean、decimal64、empty、enumeration、instance-identifier、int8/16/32/64、leafref、string、uint8/16/32/64、union。

(1) 叶(leaf)

    叶子包含简单的数据,如整数和字符串,是一个叶子节点,只能有一个实例。每个单独属性可以由叶 leaf 表示,每个叶必须指定类型

(2) 叶列表(leaf-list)

    叶列表定义了特定类型的值序列。它是只有一个叶子的列表,只能创建和删除。类似数组。与leaf区别在于leaf只有一个实例,而leaf-list可以有多个实例

(3) 列表(list)

  列表为一系列数据节点的集合,它像一张数据库表一样,列表中用 关键字 key 来标识其主键,由关键字 unique定义哪些数据节点需保持唯一 ,有多个实例 。子节点可以是容器、叶节点、叶列表。

(4) 容器(container)

    容器节点用于在子树中组织相关的节点。容器可以包含任何数量的任何类型(包括叶节点,列表节点,叶列表节点和容器)的子节点。

(5) 派生类型typedef

    但是在实际建模中,YANG原生支持的 build-in基础数据类型肯定是不够的。YANG允许用户使用typedef来定义自己需要的type,可以基于build-in type另外一个派生的type。

module

module是YANG的基本单元,是包含各节点的顶层结构,是写yang文件的基本框架,YANG将数据模型构建为模块,模块名与YANG文件名一致。一个module可以从其他module中导入数据,也可以从子模块中引用数据。

外部module 的引入(import & include):

导入语句import :允许引用其他模块中定义的材料;

包括语句 include :来标识属于它的每个子模块。

module中包括以下几种类型语句:

1、head语句(yang-version/namespace/prefix)

2、连接语句(import/include)、

3、元信息(organization/contract)、

4、revision语句、

5、定义语句(container/leaf/leaf-list/grouping等等)。

module中元素介绍图:

YANG模块有如下的布局:

submodule

submodule是部分模块定义,用于对模块提供支持。

submodule文件内容布局如下:

submodule必须通过belongs-to语句使用, submodule只能由belong-to指定的module或这个指定module的其它submodule进行include,其它module(包括submodule)都不能include。同时子模块不可以import它的父模块

2.2 Yang模型分类以及获取

YANG只是一种让网络设备上的数据以一种标准结构存在的语言,这个模型结构可能做得很简洁好用,也可能做得很复杂难用。YANG并不能保证vendor不写出很烂的模型,YANG只能保证这些模型都是有规律的。因此虽然统一了协议和建模语言,但是YANG模型并没有统一,YANG模型分为标准(Standard)和私有(Native)两种类型,其中标准类型中比较著名的有IETF, IEEE, OpenConfig等国际知名组织制定的模型,其中IETF制定的YANG模型最常见。除标准YANG模型之外,各家厂商又根据自家产品的不同设计了私有的YANG模型,比如思科、华为等都有自家的YANG模型。

在Github(https://github.com/YangModels/yang)上存放着大部分标准(standard)和私有(vendor)的YANG模型,截止2020年9月,标准模型中包含IETF,IEEE,ETSI等国际知名组织和协会制定的YANG模块,私有模型中包含思科,Juniper,华为,诺基亚,富士通在内的厂商自己制定的YANG模块。

2.3 处理Yang工具介绍

Pyang是Python专为YANG开发的一个开源模块,主要有三个功能:

  1. 用来验证YANG模块代码的准确性;

  2. 将YANG模块转换成其他格式(比如我们前面讲到的树形格式,XML格式等);

  3. 从YANG模块中生成代码。

    将Yang转化成 XML文件也称为YIN文件,是为了利用各编程语言中现有的XML解析器等工具,这些工具可用来进行数据过滤和验证,自动生成代码和文件或者其他任务,这样可以提升设备解析YANG模型的效率。而将Yang转化为树形格式也会便于查看。

文章来自个人专栏
文章 | 订阅
0条评论
作者已关闭评论
作者已关闭评论
2
1