NETCONF是IETF NETMOD工作组推出的用于配置网络节点(路由器、交换机等)的控制协议。本文对其做稍微的介绍。

Tail-f的NETCONF Overview对NETCONF的背景有不错的介绍。在NETCONF之前,IETF用来管理网络节点的协议叫做SNMP。可是在实践中,因为特性缺失,SNMP主要用来获取设备的告警信息,而不是用来做设备的配置。具体配置设备的时候,还是通过命令行(CLI)来操作。这个对人的依赖太大,复杂的命令可能需要一个CCIE才能搞定。

IETF在RFC3535中记录了一些SNMP作为网络配置工具所缺失的特性,主要是下面几点(英文就不翻译了):

  • Distinction between configuration and state data
  • Multiple configuration data stores (candidate, running, startup)
  • Configuration change transactions
  • Configuration testing and validation support
  • Selective data retrieval with filtering
  • Streaming and playback of event notifications
  • Extensible procedure call mechanism

简单的说,就是配置经常需要倒来倒去,需要一定的版本管理,而SNMP不提供这方面的支持。

一些参考材料

IETF是一个开放组织,所以很多资料都是公开的。IETF的EDU部门专门负责制作培训材料用于推广IETF技术,下面的教程就是IETF EDU制作的:

下面这个说明文档是我目前觉得对NETCONF协议比较好的介绍,值得参考:

NETCONF协议

和二进制的SNMP不同,NETCONF是基于文本的,更确切地说是基于XML的。NETCONF是非对称的网络协议,有服务端和客户端,通常网络节点为服务端,客户端用于对服务端进行配置。

NETCONF通常运行于SSH之上,其会话管理比较简单。当客户端连上服务端时,服务端向客户端发送Hello消息,同时汇报自己所支持的配置列表。当配置完成时,客户端发送<close-session>或者<close-session>操作来关闭会话。NETCONF的用户管理,登录、鉴权等等功能都是在SSH层做的。

NETCONF主要的消息类型有两种,一种是RPC消息,用于从客户端往服务端发命令;另一种是Notification,用于从服务端往客户端发送状态报告。RPC消息可以包含不同的操作,前面提到的<close-session><close-session>就是两个例子。其他操作还包含:

<get>
<get-config>
<edit-config>
<copy-config>
<delete-config>
<lock>
<unlock>
...

NETCONF的一个重要概念是配置数据和状态数据分离,所以上面的<get>操作用来同时获取配置和状态数据,而<get-config>这种带有config的操作只适用于配置数据。可以把状态数据看成是只读不可配的。

上面还列举了<lock><unlock>操作,用来锁定目标数据库。当一个目标数据库被一个客户端锁定之后,其他客户端无法修改。但是有一点需要注意,这个不能阻止配置被NETCONF以外的方式修改,比如直接使用命令行修改配置。

谈到目标数据库,NETCONF服务端可以具有不同的配置数据库,常见的比如:

  • :running,每个服务端都必须支持的数据库,用于存储使用中的配置
  • :candidate,后台数据库,可以用来准备一些未生效的配置,当准备好了之后可以把配置提交(commit)到:running
  • :startup,只在启动时读取的数据库

针对不同的目标数据库,NETCONF还提供了相应的操作,在此就不一一介绍了。

NETCONF协议本身并不是非常有趣,有趣的是如何描述其中的XML文件包含的信息,这需要用到YANG,留待在以后的文章中介绍。

其他参考

(完)

后记

2019-08-07

如何删除已经有的配置呢?NETCONF提供了delete-config命令,可以用来删除某个datastore下所有的配置。如果只是想删除一部分配置,那么还是可以使用edit-config命令,但是要把operation属性指定为"delete",如下所示:

...
            <message-size operation=”replace”>255</message-size>
...

上面的例子删除了<message-size>这个元素。更多可以参考RFC 6241 Network Configuration Protocol (NETCONF)中的描述。

另外注意的是,如果删除的是list,那么operation属性必须在list节点上,而不是在key节点上。