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 by Example - IETF
- 上面的幻灯片对应的讲解视频 IETF94-TUTORIAL-NETCONFbyExample-20151101-1300
下面这个说明文档是我目前觉得对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节点上。