Netconf简介
网络配置协议NETCONF(Network Configuration Protocol)提供一套管理网络设备的机制,用户可以使用这套机制增加、修改、删除网络设备的配置,获取网络设备的配置和状态信息。通过NETCONF协议,网络设备可以提供规范的应用程序编程接口API(Application Programming Interface),应用程序可以直接使用这些API,向网络设备发送和获取配置。
Netconf协议:
NETCONF(Network Configuration Protocol)是基于可扩展标记语言XML(Extensible Markup Language)的网络配置和管理协议,使用简单的基于RPC(Remote Procedure Call)机制实现客户端和服务器之间通信。客户端可以是脚本或者网管上运行的一个应用程序。服务器是一个典型的网络设备。
NETCONF提供了一种通过运行网络管理软件的中心计算机(即网络管理工作站)来远程管理和监控设备的方法。其优点如下:
- NETCONF协议以XML格式定义消息,运用RPC机制修改配置信息,这样既能方便管理配置信息,又能满足来自不同制造商设备之间的互操作性。
- 可减少由于人工配置错误引起的网络故障。
- 可提高使用配置工具升级系统软件的效率。
- 扩展性好,不同制造商设备可以定义自己的协议操作,以实现独特的管理功能。
- NETCONF提供了认证、鉴权等安全机制,保证了消息传递的安全。
Netconf与SNMP比较:
特性 | SNMP | NETCONF |
---|---|---|
配置管理 | SNMP在进行设备数据操作时,如果多个用户对同一个配置量进行操作,协议没有提供保护锁定机制。 | NETCONF提供保护锁定机制,防止多用户操作产生冲突。 |
查询 | SNMP能够对某个表的一条或多条记录进行操作,查询中需要多次交互才能够完成。 | NETCONF针对整个系统的配置数据可直接进行操作,且定义了过滤功能。 |
扩展性 | 扩展性差。 | 扩展性好:协议模型采取分层定义,各层之间相互独立,当对协议中的某一层进行扩展时,能够最大限度不影响到其上层协议。协议采用了XML编码,使得协议在管理能力上和系统兼容性方面也具有一定的可扩展性。 |
安全性 | 以目前最新的SNMPv3为例,SNMPv3在安全上存在的主要问题是,SNMPv3全部自己定义,未有扩展的余地。 | NETCONF利用现有的安全协议提供安全保证,并不与具体的安全协议绑定。在使用中,NETCONF要比SNMP更灵活。说明:NETCONF传输层首选推荐SSH协议,XML信息通过SSH协议承载。 |
Netconf协议框架;
NETCONF协议采用了分层结构。每层分别对协议的某一方面进行包装,并向上层提供相关服务。分层结构使每层只关注协议的一个方面,实现起来更简单,同时使各层之间的依赖、内部实现的变更对其他层的影响降到最低。
NETCONF协议在概念上可以划分为4层:
- 安全传输(Secure Transport)层为客户端和服务器之间交互提供通讯路径。
- 消息(Messages)(RPC) (Remote Procedure Call,远程调用) 层提供一种简单的不依赖传输协议层的,生成RPC请求和回应消息框架的机制。Client把RPC请求内容封装在一个
元素内,发送给Server;Server把请求处理结果封装在一个 元素内,回应给Client。 - 操作(Operations)层定义一组基本的操作,作为RPC的调用方法,可以使用XML编码的参数调用这些方法。
- 内容(Content)层由管理对象的数据模型定义,数据模型定义依赖NETCONF的实现情况。
Netconf报文结构:
Netconf基本网络结构:
NETCONF基本网络架构的主要元素:
客户端(Client)。主要作用如下:
- 利用NETCONF协议对网络设备进行系统管理。
- 向NETCONF Server发送
请求,查询或修改一个或多个具体的参数值。 - 接收NETCONF Server主动发送的告警和事件,以获知被管理设备的当前状态。
服务器(Server)。主要用于维护被管理设备的信息数据并响应客户端的请求。
- 服务器收到客户端的请求后会进行数据解析,然后给客户端返回响应。
- 当设备发生故障或其他事件时,服务器利用Notification机制主动将设备的告警和事件通知给客户端,向客户端报告设备的当前状态变化。
配置数据集(Datastores)
NETCONF定义了一个或多个配置数据集的存在,并允许对它们进行配置操作。配置数据集被定义为使设备从其初始默认状态进入期望的操作状态所需的完整配置数据集合。
运行的配置数据集保存网络设备上当前处于活动状态的完整配置。 在设备上只存在一个此类型的配置数据集,并且始终存在。NETCONF协议使用
引用此数据库。 基本模型中只存在
配置数据集。 其他配置数据集可以由能力集定义,且只在宣称支持该能力集的设备上可用。例如: 备用配置数据集。存放设备将要提交到 的各项配置数据的集合。管理员可以在 上进行操作,对 的任何改变不会直接影响网络设备。可以通过 指令将备用配置数据提交为设备运行数据。华为设备支持的备用配置数据集在不同会话间独立,不存在会话间配置数据共享,所以配置备用配置数据集时,不需要额外的加锁操作。 启动配置数据集。存放设备启动时所加载的配置数据,相当于已保存的配置文件
NETCONF会话是Client与Server之间的逻辑连接,网络设备必须至少支持一个NETCONF会话。Client从运行的Server上获取的信息包括配置数据和状态数据。
Client从运行的Server上获取的信息包括配置数据和状态数据。
- Client可以修改配置数据,并通过操作配置数据,使Server的状态迁移到用户期望的状态。
- Client不能修改状态数据,状态数据主要是Server的运行状态和统计的相关信息。
Netconf建模语言:
Schema:
Schema是为了描述XML文档而定义的一套规则。Schema文件中定义了设备所有管理对象,以及管理对象的层次关系、读写属性和约束条件。
设备通过Schema文件向网管提供配置和管理设备的接口。Schema文件类似于SNMP的MIB文件。
YANG:
YANG是专门为NETCONF协议设计的数据建模语言,用来为NETCONF协议设计可操作的配置数据、状态数据模型、远程调用(RPCs)模型和通知机制等。
YANG数据模型定位为一个面向机器的模型接口,明确定义数据结构及其约束,可以更灵活、更完整的进行数据描述。
相关概念:
NETCONF Client和Server之间使用RPC机制进行通信。Client必须和Server成功建立一个安全的、面向连接的会话才能进行通信。Client向Server发送一个RPC请求,Server处理完用户请求后,给Client发送一个回应消息。Client的RPC请求和Server的回应消息全部使用XML编码。
NETCONF协议提供了定义capabilities语法语意规范,协议允许Client与Server交互各自支持的capabilities,Client只能发送Server支持的capabilities范围内的操作请求。
XML编码:
XML作为NETCONF协议的编码格式,用文本文件表示复杂的层次化数据,即支持使用传统的文本编译工具,也支持使用XML专用的编辑工具读取、保存和操作配置数据。
基于XML网络管理的主要思想是利用XML的强大数据表示能力,使用XML描述被管理数据和管理操作,使管理信息成为计算机可以理解的数据库,提高计算机对网络管理数据的处理能力,从而提高网络管理能力。
总而言之,基于XML的网络管理的主要优点:
- 具有强大的数据表示能力。
- 方便高效安全的进行大量数据传输。
- 很好的适应网络配置管理的需求。
XML编码格式文件头为<?xml version=”1.0” encoding=”UTF-8”?>,其中:
- <?:表示一条指令的开始。
- xml:表示此文件是XML文件。
- version:NETCONF协议版本号。”1.0”表示使用XML1.0标准版本。
- encoding:字符集编码格式,当前仅支持UTF-8编码。
- ?>:表示一条指令的结束。
RPC模式:
NETCONF协议使用RPC通信模式,采用XML编码的
元素 | 说明 |
---|---|
在处理 |
|
在处理 |
能力集(Capabliity):
NETCONF能力集是补充基本NETCONF规范的一组功能。 该能力由统一资源标识符(URI)标识。
能力集扩展了设备的基本操作,描述了附加操作和操作中允许的内容。客户端可以发现服务器的功能,并使用由这些能力集定义的任何其他操作,参数和内容。
能力集定义可以命名一个或多个依赖的能力集。 为了支持一种能力集,服务器必须支持它所依赖的任何能力集。
Netconf鉴权机制:
NETCONF鉴权机制用于管理特定用户执行NETCONF操作和访问NETCONF资源权限。
NETCONF鉴权支持的内容如下:
协议操作(Protocol Operation)鉴权:允许使用指定的NETCONF协议操作。
例如:
、 、 、 等操作。 模块(Module)鉴权:允许访问指定的特性模块。
例如:Telnet-client、L3VPN、OSPF、Fault-MGR、Device-MGR、ISIS等特性模块。
数据节点(Data-node)鉴权:允许查询、修改指定的数据节点。
例如:/ifm/interfaces/interface/ifAdminStatus/devm/globalPara/maxChassisNum等数据节点。
NETCONF鉴权机制用于管理特定用户执行NETCONF操作和访问NETCONF资源权限,使这些用户只能执行或访问NETCONF协议规定的操作和能力集中预配置好的子集。
Netconf会话和能力集
Netconf会话基本流程:
- 客户端触发NETCONF会话建立,完成SSH连接建立,并进行认证与授权。
- 客户端和服务器完成NETCONF会话建立和能力协商。
- 客户端发送一个或多个请求给服务器,进行RPC交互(鉴权)。例如:
- 修改并提交配置。
- 查询配置数据或状态。
- 对设备进行维护操作。
- 客户端关闭NETCONF会话。
- SSH连接关闭。
能力集交互:
能力集扩展了设备的基本操作,描述了附加操作和操作中允许的内容。客户端可以发现服务器的功能,并使用由这些能力集定义的任何其他操作,参数和内容。
能力协商是在会话建立阶段,双方通过发送消息给对方来通告自己支持的能力。当NETCONF会话打开,每一端(包括Client和Server)必须发送一个包含自身能力列表的
在交换过Hello消息后,Server等待Client发送
Netconf基本操作
get查询数据;
示例:
RPC请求:
1 | <rpc message-id="101" xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"> |
RPC应答:
1 | <rpc-reply message-id="101" xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"> |
get-config查询配置数据:
- source:正在查询的配置数据库名称,
、 或 。 - filter:此参数用来标识要查询配置数据库的范围。如果此参数不存在,则返回设备上所有的配置。
示例:查询running中接口配置;
1 | <rpc message-id="101" xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"> |
只能查询 配置数据库的数据, 可以查询 、 和 中数据。 可以查询配置数据和状态数据, 只能查询配置数据。
edit-config编辑配置数据:
:一组由数据模型定义的层次化的配置数据。 中可能包含可选的“operation”属性,用来给配置数据指定操作类型。如果未携带“operation”属性,则默认为merge操作。Operation取值如下: - merge:在数据库中修改存在或不存在的目标数据,如果目标数据不存在则创建,如果目标数据存在则修改。这是默认操作。
- create:当且仅当配置数据库中不存在待创建的配置数据时,才能成功添加到配置数据库。如果配置数据存在,则会返回
,其中包含一个 值“data-exists”。 - delete:删除配置数据库中指定的配置数据记录。如果数据存在,则删除该数据,如果数据不存在,则返回
,其中包含一个 值“data-missing”。
target:待编辑的配置数据库。基于场景选择对应的数据库:
- 立即生效模式,配置数据库为
。 - 两阶段生效模式,配置数据库为
,对该数据库操作后需执行 操作提交配置,修改后的配置才能生效。 - 试运行,配置数据库设置为
。
- 立即生效模式,配置数据库为
default-operation:为
操作设置默认操作。 default-operation参数是可选的,缺省值为“merge”,取值如下:
- merge:
参数中的配置数据与目标配置数据库中的配置合并。这是默认操作。 - replace:使用
参数中的配置数据,完全替换目标配置数据库中的配置。 - none:除了执行operation属性指定的操作外,目标配置数据库中的配置数据不受
中其他配置数据影响。如果 参数中含有目标配置数据库中对应的数据层次上不存在的配置数据,则返回 , 值为“data-missing”,这样可以避免在执行指定操作时,无意中创建了冗余的元素。比如执行删除指定子元素操作时, 中包含该子元素的父层次结构,而目标数据库中不包含其父元素的配置,此时如果default-operation参数取值为非none的其他操作类型,则在删除该子元素的同时也会在目的数据库中创建其父元素的配置,如果default-operation参数取值为none,则只会删除该子元素,而不会创建其父元素的配置。
- merge:
error-option:
用于设置一个实例配置出错后,后续实例配置的处理方式,缺省值为stop-on-error,取值为 - stop-on-error:出现错误后停止操作。
- continue-on-error:出现错误后记录错误信息并继续执行,只要发生错误,NETCONF服务器会给客户端返回一个操作失败的
消息。 - rollback-on-error:出现错误后停止操作,并将配置回退到执行
操作之前的状态。只有设备支持rollback-on-error能力才支持此操作。
示例:将运行配置数据库中接口名为10GE1/0/1的接口的ifDescr值修改为“huawei”。
RPC请求
1 | <rpc message-id="60" xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"> |
RPC应答:
1 | <rpc-reply message-id="60" xmlns="urn:ietf:params:xml:ns:netconf:base:1.0" flow-id="104"> |
copy-config拷贝操作:
源配置数据库替换目标配置数据库。如果目标配置数据库没有创建,则直接创建配置数据库,否则用源配置数据库直接覆盖目标配置数据库。
示例: 将
RPC请求:
1 |
|
RPC应答:
1 | <rpc-reply message-id="596" xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"> |
delete-config删除配置数据:
用来删除一个配置数据库,但不能删除
删除
RPC请求:
1 | <rpc message-id="101" xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"> |
RPC应答:
1 | <rpc-reply message-id="101" xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"> |
lock锁定配置数据库:
用来锁定设备的配置数据库,独占配置数据库的修改权。这种锁定允许用户在配置时,不会受到如NETCONF mannager、SNMP或者CLI脚本的配置影响,防止产生冲突。
如果配置数据库被合法用户锁定,则返回的reply报文
锁定
RPC请求:
1 | <rpc message-id="101" xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"> |
RPC应答:
1 | <rpc-reply message-id="101" xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"> |
锁定
RPC请求
1 | <rpc message-id="101" xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"> |
RPC应答
1 | <rpc-reply message-id="101" xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"> |
unlock取消锁定配置数据库:
用来取消用户自己之前执行的
取消锁定
RPC请求
1 | <rpc message-id="101" xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"> |
RPC应答
1 | <rpc-reply message-id="101" xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"> |
close-session关闭netconf会话:
用来正常关闭当前NETCONF会话。
当NETCONF Server收到
关闭当前NETCONF会话示例:
- RPC请求
1 | <rpc message-id="101" xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"> |
- RPC应答
1 | <rpc-reply message-id="101" xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"> |
kill-session强制关闭netconf会话:
用来强制关闭另一个NETCONF会话,只有管理员用户才有权限执行
当NETCONF Server收到
如果NETCONF服务器在处理
强制关闭session-id为4的NETCONF会话示例:
- RPC请求
1 | <rpc message-id="101" xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"> |
Netconf能力集
Netconf标准能力:
Writable-running能力:
此能力指明设备支持对
1 | <capability>urn:ietf:params:netconf:capability:writable-running:1.0</capability> |
Candidate Configureation能力:
此能力指明设备支持
用户为了得到期望的配置数据,可以执行删除和修改操作。任意时刻可以执行如下操作:
:将 配置数据库中的所有数据全部提交,转化为设备当前运行的配置数据。 如果
操作失败, 配置数据库中的内容保持不变。 :放弃执行 配置数据库中还未提交的配置数据,使 数据库中的配置数据恢复到与当前 配置数据库相同数据。
设备会为每个NETCONF会话单独创建一个
能力标识
1 | <capability>urn:ietf:params:netconf:capability:candidate:1.0</capability> |
Confirmed Commit能力:
此能力指明设备支持协议操作
:将 数据库中的配置数据提交,转化为设备当前运行的配置数据,即 数据库中的配置。 : 操作确认超时时间,单位是秒,缺省值是600秒。设备执行 操作后,在确认超时时间内,如果没有执行确认操作,则对 数据库中的配置进行回滚,配置数据恢复到执行 操作之前的状态,并放弃 数据库中的编辑数据。
此能力仅在支持Candidate Configuration能力时有效,主要应用于对业务进行试运行、验证的场景中。
能力标识
1 | <capability>urn:ietf:params:netconf:capability:confirmed-commit:1.0</capability> |
提交当前的配置,并设置
RPC请求:
1 | <rpc message-id="101" xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"> |
Rollback on Error能力:
此能力表明设备具备错误回滚能力。即支持在
此能力仅在设备支持Candidate Configuration能力时生效。
能力标识
1 | <capability>urn:ietf:params:netconf:capability:rollback-on-error:1.0</capability> |
示例RPC请求:
1 |
|
Distinct Startup能力:
此能力指明设备具备独立启动的能力,即设备能够区分运行数据库
NETCONF服务器需要对运行的配置进行独立维护,并在设备重新启动后能够恢复运行的配置。对
能力标识
1 | <capability>urn:ietf:params:netconf:capability:startup:1.0</capability> |
执行
RPC请求
1 | <rpc message-id="101" xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"> |
Notification能力:
该能力指明设备可以通过NETCONF协议的Notification能力向客户端上报告警和事件,以便客户端及时感知设备配置等的变更。用户通过执行
能力标识
1 | <capability>urn:ietf:params:netconf:capability:notification:1.0</capability> |
扩展能力集:
Action能力:
此能力指明设备具备处理
能力标识
1 | <capability>http://www.huawei.com/netconf/capability/action/1.0</capability> |
Execute CLI能力:
此能力指明设备在处理请求过程中,能与发送端进行交互。
能力标识
1 | <capability>http://www.huawei.com/netconf/capability/execute-cli/1.0</capability> |
Client端通过
客户端通过
RPC请求
1 | <rpc message-id="11" xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"> |
Discard Commit能力:
此能力用来取消或终止正在执行的confirmed-commit操作。例如,在commit操作确认超时之前或正在执行的
能力标识
1 | <capability>http://www.huawei.com/netconf/capability/discard-commit/1.0</capability> |
放弃当前正在执行的commit操作示例。
1 | <rpc message-id="101" xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"> |
Netconf编程实现
Python—ncclient实现:
python网络自动化netconf配置模块ncclient学习笔记 )
https://github.com/ncclient/ncclient
Go–go-netconf实现:
https://github.com/Juniper/go-netconf
参考文档:
http://www.h3c.com/cn/d_201709/1031825_30005_0.htm#_Toc492405216