最近在做TSN设备相关的项目,项目中使用了Netconfig协议进行设备管理和配置。以前没接触过,在网上找了很多资料学习,做个笔记记录一下。
NETCONFIG简介
NETCONF(Network Configuration Protocol,网络配置协议)是一种基于 XML 的网络管理协议,它提供了一种可编程的、对网络设备进行配置和管理的方法。它使用简单的基于RPC(Remote Procedure Call)机制实现客户端和服务器之间通信。客户端可以是脚本或者网管上运行的一个应用程序。服务器是一个典型的网络设备。
NETCONF 报文使用 XML 格式,具有强大的过滤能力,而且每一个数据项都有一个固定的元素名称和位置,所以具有很强的兼容性,不同厂家不同设备可以通过 XML 得到相同的结果,便于混合不同厂商不同设备的为冷热软件开发。
NETCONF的优点
- NETCONF协议以XML格式定义消息,运用RPC机制修改配置信息,这样既能方便管理配置信息,又能满足来自不同制造商设备之间的互操作性。
- 减少由于人工配置错误引起的网络故障。
- 提高使用配置工具升级系统软件的效率。
- 扩展性好,不同制造商设备可以定义自己的协议操作,以实现独特的管理功能。
- NETCONF提供了认证、鉴权等安全机制,保证了消息传递的安全。
NETCONFIG与SNMP比较
NETCONFIG协议结构
NETCONF协议采用了分层结构。每层分别对协议的某一方面进行包装,并向上层提供相关服务。分层结构使每层只关注协议的一个方面,实现起来更简单,同时使各层之间的依赖、内部实现的变更对其他层的影响降到最低。
NETCONFIG协议结构分为:
- 安全传输(Secure Transport)层为客户端和服务器之间交互提供通讯路径。
- 消息(Messages)(RPC) (Remote Procedure Call,远程调用) 层提供一种简单的不依赖传输协议层的,生成RPC请求和回应消息框架的机制。Client把RPC请求内容封装在一个元素内,发送给Server;Server把请求处理结果封装在一个元素内,回应给Client。
- 操作(Operations)层定义一组基本的操作,作为RPC的调用方法,可以使用XML编码的参数调用这些方法。
- 内容(Content)层由管理对象的数据模型定义,数据模型定义依赖NETCONF的实现情况。对应xml中具体的配置数据、状态数据等信息。
安全传输层
NETCONF的第一大优势就是其从协议层面就已经规定其传输层必须使用带有安全加密的通信协议。由于NETCONF协议规定必须要支持SSH,所以目前SSH是NETCONF使用最广泛的传输层协议。NETCONF的协议内容是承载在安全传输层之上的,所以NETCONF本身是一个应用层协议。
消息层
NETCONF中定义了三种消息类型,分别是hello, rpc和rpc-reply, notification。
<hello>
<hello>仅用于回话刚刚建立时netconf-server和netconf-client之间进行能力交换。server和client需要在回话建立后互相发送<hello>消息,并在<hello>消息中携带自身支持的能力,以及支持的netconf协议的版本号,server和client根据自身和对方的能力信息协商使用的netconf版本。一般来说,C/S双方互发<hello>且协商版本成功后,认为netconf会话建立成功。
几种常用的能力
(1) XPath Capability
该能力表示client可以在filter中使用XPath表达式作为过滤条件
Capability Identifier:
urn:ietf:params:netconf:capability:xpath:1.0
(2) Writable-Running Capability
该能力表示server支持直接对<running/>库进行修改操作。
Capability Identifier:
urn:ietf:params:netconf:capability:writable-running:1.0
(3) Candidate Configuration Capability
该能力表示server具有一个candidate数据库,并且可以将candidate数据库中的配置提交生效并更新running数据库
Capability Identifier:
urn:ietf:params:netconf:capability:candidate:1.0
(4) Rollback-on-Error Capability
该能力表示server在执行client发送的配置数据出错后可以进行回滚
Capability Identifier:
urn:ietf:params:netconf:capability:rollback-on-error:1.0
(5) Validate Capability
该能力表示server可以校验client发送的配置数据是否正确
Capability Identifier:
urn:ietf:params:netconf:capability:validate:1.1
(6) Distinct startup Capability
该能力表示server有一个startup数据库,用于保存启动配置
Capability Identifier:
urn:ietf:params:netconf:capability:startup:1.0
<rpc>和<rpc-reply>
<rpc>是由netconf-client发起的发送到netconf-server的消息。用于client请求server执行某项具体的操作。<rpc>包含一个强制属性”message-id”,这个id是一个单调递增的正整数,同一会话内不能重复。该id用于<rpc>和<rpc-reply>的配对。<rpc-reply>是有netconf-server发送给netconf-client的rpc响应。不能主动发起,仅能在收到<rpc>之后回复,切必须携带与收到的rpc相同的message-id。在<rpc-reply>定义了两种默认的元素分别是<ok>和<rpc-error>。<ok>表示未定义响应内容的rpc执行成功,而<rpc-error>表示rpc执行失败。
关于RPC最重要的几点:
1. netconf-client必须保证server收到的rpc请求的顺序和message-id的顺序是一致的。
2. netconf-server在能保证数据不冲突的前提下可以并行处理收到的rpc请求。
3. netconf-server在发送<rpc-reply>时必须严格按照收到的<rpc>的顺序。
<notification>
支持Notification上报的netconfig server需在能力交换时上报能力:“urn:ietf:params:netconf:capability:notification:1.0”。
几个关键的知识点:
1. Netconf的通知采用的是订阅发布机制,server仅会向发送过订阅请求的client发送通知。
2. Netconf的通知是以Stream进行分类的,不同类的Stream以不同的stream-name进行区分。netconf-server默认需要支持的stream-name是”NETCONF”。
3. client不能重复下发订阅,即同一Stream的订阅不能重复下发,也不能同时订阅多个Stream,订阅可以设置定时取消,如果没有设置终止时间,取消订阅需要使用close-session或者kill-session。定时取消的订阅netconf的会话还是激活的,而使用close-session或者kill-session来取消的话,netconf会话会关闭。
操作层
操作层仅承载在<rpc>和<rpc-reply>消息上,<hello>和<notification>消息无操作层。
NETCONF协议规定了9种简单的rpc操作,同时也支持用户自定义rpc操作。
1、<get>
查询的是设备当前运行的状态数据,即只能从配置数据库中获取数据。所以,不需要使用source参数指定配置数据库。如果server支持能力:urn:ietf:params:netconf:capability:xpath:1.0则还可以使用filter进行条件查询。
<rpc message-id="101"
xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">
<get>
<filter type="subtree">
<top
xmlns="http://example.com/schema/1.2/stats">
<interfaces>
<interface>
<ifName>eth0</ifName>
</interface>
</interfaces>
</top>
</filter>
</get>
</rpc>
2、<get-config>
用来查询全部或部分指定配置数据。
- source:正在查询的配置数据库名称。
- filter:此参数用来标识要查询配置数据库的范围。如果此参数不存在,则返回设备上所有的配置。
<rpc message-id="101"xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">
<get-config>
<source>
<running/>
</source>
<filter type="subtree">
<top xmlns="http://example.com/schema/1.2/config">
<users/>
</top>
</filter>
</get-config>
</rpc>
3、<edit-config>
用来把全部或部分配置数据加载到指定的目标配置数据库,对设备的操作进行鉴权,鉴权通过后,执行相应的修改。支持多种加载配置方式,如:本地文件、远程文件,支持在线编辑。如果NETCONF服务器支持URL能力,可以使用标识本地配置文件的参数替代参数。一组由数据模型定义的层次化的配置数据中可能包含可选的“operation”属性,用来给配置数据指定操作类型。如果未携带“operation”属性,则默认为merge操作。Operation取值如下:
- merge:在数据库中修改存在或不存在的目标数据,如果目标数据不存在则创建,如果目标数据存在则修改。这是默认操作。
- create:当且仅当配置数据库中不存在待创建的配置数据时,才能成功添加到配置数据库。如果配置数据存在,则会返回,其中包含一个值“data-exists”。
- replace: 如果配置数据库中配置数据已经存在则替换,不存在则创建。
- delete:删除配置数据库中指定的配置数据记录。如果数据存在,则删除该数据,如果数据不存在,则返回,其中包含一个值“data-missing”。
- remove: 配置数据库中配置数据已经存在则删除,不存在则忽略。
<rpc message-id="101"
xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">
<edit-config>
<target>
<running/>
</target>
<config
xmlns:xc="urn:ietf:params:xml:ns:netconf:base:1.0">
<top
xmlns="http://example.com/schema/1.2/config">
<interface xc:operation="replace">
<name>Ethernet0/0</name>
<mtu>1500</mtu>
<address>
<name>192.0.2.4</name>
<prefix-length>24</prefix-length>
</address>
</interface>
</top>
</config>
</edit-config>
</rpc>
4、<copy-config>
源配置数据库替换目标配置数据库。如果目标配置数据库没有创建,则直接创建配置数据库,否则用源配置数据库直接覆盖目标配置数据库。
<rpc message-id="101"
xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">
<copy-config>
<target>
<running/>
</target>
<source>
<url>https://user:password@example.com/cfg/new.txt</url>
</source>
</copy-config>
</rpc>
5、<delete-config>
用来删除一个配置数据库,但不能删除配置数据库。
<rpc message-id="101"
xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">
<delete-config>
<target>
<startup/>
</target>
</delete-config>
</rpc>
6、<lock>
用来锁定设备的配置数据库,独占配置数据库的修改权。这种锁定允许用户在配置时,不会受到如NETCONF mannager、SNMP或者CLI脚本的配置影响,防止产生冲突。如果配置数据库被合法用户锁定,则返回的reply报文中将显示lock-denied,并且将显示锁定者。
<rpc message-id="101"
xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">
<lock>
<target>
<running/>
</target>
</lock>
</rpc>
7、<unlock>
取消锁定数据库操作,只能取消自己的锁定操作。
<rpc message-id="101"
xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">
<unlock>
<target>
<running/>
</target>
</unlock>
</rpc>
8、<close-session>
用来正常关闭当前NETCONF会话。当NETCONF Server收到请求时,它将关闭当前的NETCONF会话。服务器将释放与该会话相关的所有锁和资源。在收到请求后,NETCONF Server将忽略这个会话的所有请求消息。
9、<kill-session>
用来强制关闭另一个NETCONF会话,只有管理员用户才有权限执行操作。当NETCONF Server收到请求时,它将中止该会话正在进行的所有操作,释放与该会话相关联的任何锁和资源,并关闭该会话。如果NETCONF服务器在处理操作时收到请求,它必须将配置恢复到发出确认提交之前的状态。
内容层
内容层需要使用Yang语言对其数据进行建模。支持用户自定义操作,可以根据实际的需求在yang文件中定义相应的rpc操作。
Netconfig基本网络结构
Netconfig基本网络结构的主要元素:
- 客户端(Client):利用NETCONF协议对网络设备进行系统管理。向NETCONF Server发送请求,查询或修改一个或多个具体的参数值。接收NETCONF Server主动发送的告警和事件,以获知被管理设备的当前状态。
- 服务端(Server):维护被管理设备的信息数据并响应客户端的请求。服务器收到客户端的请求后会进行数据解析,然后给客户端返回响应。当设备发生故障或其他事件时,服务器利用Notification机制主动将设备的告警和事件通知给客户端,向客户端报告设备的当前状态变化。
- 配置数据集(Datastores):NETCONF定义了一个或多个配置数据集的存在,并允许对它们进行配置操作。配置数据集被定义为使设备从其初始默认状态进入期望的操作状态所需的完整配置数据集合。运行的配置数据集保存网络设备上当前处于活动状态的完整配置。 在设备上只存在一个此类型的配置数据集,并且始终存在。基本模型中只存在配置数据集。 其他配置数据集可以由能力集定义,且只在宣称支持该能力集的设备上可用。备用配置数据集。存放设备将要提交到的各项配置数据的集合。管理员可以在上进行操作,对配置的任何改变不会直接影响网络设备。可以通过指令将备用配置数据提交为设备运行数据。启动配置数据集。存放设备启动时所加载的配置数据,相当于已保存的配置文件。
NETCONF会话是Client与Server之间的逻辑连接,网络设备必须至少支持一个NETCONF会话。Client从运行的Server上获取的信息包括配置数据和状态数据,Client可以修改配置数据,并通过操作配置数据,使Server的状态迁移到用户期望的状态,Client不能修改状态数据,状态数据主要是Server的运行状态和统计的相关信息。
Netconf建模语言
- Schema:Schema是为了描述XML文档而定义的一套规则。Schema文件中定义了设备所有管理对象,以及管理对象的层次关系、读写属性和约束条件。设备通过Schema文件向网管提供配置和管理设备的接口。Schema文件类似于SNMP的MIB文件。
- YANG:YANG是专门为NETCONF协议设计的数据建模语言,用来为NETCONF协议设计可操作的配置数据、状态数据模型、远程调用(RPCs)模型和通知机制等。YANG数据模型定位为一个面向机器的模型接口,明确定义数据结构及其约束,可以更灵活、更完整地进行数据描述。
Netconf鉴权机制:
NETCONF鉴权机制用于管理特定用户执行NETCONF操作和访问NETCONF资源权限。
NETCONF鉴权支持的内容如下:
- 协议操作(Protocol Operation)鉴权:允许使用指定的NETCONF协议操作。
- 模块(Module)鉴权:允许访问指定的特性模块。
- 数据节点(Data-node)鉴权:允许查询、修改指定的数据节点。
NETCONF鉴权机制用于管理特定用户执行NETCONF操作和访问NETCONF资源权限,使这些用户只能执行或访问NETCONF协议规定的操作和能力集中预配置好的子集。
Netconf会话基本流程:
- 客户端触发NETCONF会话建立,完成SSH连接建立,并进行认证与授权。
- 客户端和服务器完成NETCONF会话建立和能力协商。
- 客户端发送一个或多个请求给服务器,进行RPC交互(鉴权)。例如:修改并提交配置。查询配置数据或状态。对设备进行维护操作。
- 客户端关闭NETCONF会话。
- SSH连接关闭。
能力集(Capabliity):
NETCONF能力集是补充基本NETCONF规范的一组功能。能力集扩展了设备的基本操作,描述了附加操作和操作中允许的内容。客户端可以发现服务器的功能,并使用由这些能力集定义的任何其他操作,参数和内容。能力集定义可以命名一个或多个依赖的能力集。 为了支持一种能力集,服务器必须支持它所依赖的任何能力集。
能力协商是在会话建立阶段,双方通过发送消息给对方来通告自己支持的能力。当NETCONF会话打开,每一端(包括Client和Server)必须发送一个包含自身能力列表的消息。双方至少要发送NETCONF基本能力"urn:ietf:params:netconf:base:1.0"或"urn:ietf:params:netconf:base:1.1"。除了基本功能,NETCONF协议还允许客户端发现服务器端支持的其它能力列表。在交换过Hello消息后,Server等待Client发送请求,为每个请求回应。
本文暂时没有评论,来添加一个吧(●'◡'●)