网络配置协议(NETCONF和RESTCONF)
1 引言
网络配置协议(NETCONF)是由IETF开发并标准化的网络管理协议。它是由NETCONF工作组制定的,并于2006年12月以RFC 4741的形式发布,后来在2011年6月进行了修订,以RFC 6241的形式发布。
NETCONF协议规范是一个互联网标准跟踪文件。
2 NETCONF
NETCONF提供了安装、操作和删除网络设备配置的机制。其操作是在一个简单的远程过程调用(RPC)层之上实现的。
NETCONF协议对配置数据以及协议消息使用基于可扩展标记语言(XML)的数据编码。协议消息是在安全传输协议之上进行交换的。
NETCONF协议在概念上可以分为四层:
1. 内容层由配置数据和通知数据组成。
2. 操作层定义了一组基础协议操作,用于检索和编辑配置数据。
3. 消息层为远程过程调用(RPC)和通知的编码提供了一种机制。
4. 安全传输层提供了客户端和服务器之间安全可靠的消息传输。
NETCONF协议已经被一些主要的设备供应商在路由器和交换机等网络设备中实现。
NETCONF的一个特别的优势是它支持使用涉及多个设备的事务进行强大的配置变更。
2.1 与SNMP的渊源与历史由来
IETF在20世纪80年代末开发了简单网络管理协议(SNMP),事实证明它是一种非常流行的网络管理协议。
在21世纪初,人们发现SNMP并没有被用来配置网络设备,而是主要用于网络监控。
2002年6月,互联网架构委员会和IETF网络管理社区的主要成员与网络运营商聚在一起讨论这一情况。这次会议的结果记录在RFC 3535中。
结果发现,运营商主要使用专有的命令行接口(CLI)来配置他们的设备。这些接口有许多运营商喜欢的功能,包括它是基于文本的,而不是BER编码的SNMP。
此外,许多设备供应商没有提供完全通过SNMP配置设备的选项。
由于运营商一般喜欢编写脚本来管理他们的盒子,他们发现SNMP CLI在很多方面都有欠缺。最明显的是输出的不可预知性。输出的内容和格式很容易以不可预测的方式改变。
大约在同一时间,瞻博网络(Juniper Networks)一直在使用基于XML的网络管理方法。
这着方式被推广到IETF,并与广大社区分享。
这两个事件共同促使IETF在2003年5月成立了NETCONF工作组。这个工作组的任务是制定一个网络配置协议,以便更好地满足网络运营商和设备供应商的需求。
基础NETCONF协议的第一个版本于2006年12月作为RFC 4741发布。在随后的几年中发布了一些扩展(2008年7月RFC 5277中的通知,2009年12月RFC 5717中的部分锁,2011年6月RFC 6243中的默认值,2012年2月RFC 6470中的系统通知,2012年3月RFC 6536中的访问控制)。2011年6月,NETCONF基本协议的修订版作为RFC 6241发布。
2.2 NETCONF协议层
(NETCONF协议图)
2.2.1 内容
NETCONF操作的内容是格式完善的XML。大部分内容与网络管理有关。随后,还增加了对JavaScript对象符号(JSON)编码的支持。
NETMOD工作组已经完成了定义一种 "对人类友好"的建模语言的工作,用于定义操作数据、配置数据、通知和操作的语义,称为YANG。YANG在RFC 6020(版本1)和RFC 7950(版本1.1)中进行了定义,并附有RFC 6991中的 "通用YANG数据类型"。
2010年夏天,NETMOD工作组重新成立,致力于核心配置模型(系统、接口和路由)以及与SNMP建模语言的兼容性。
2.2.1.1 YANG
YANG(Yet Another Next Generation)是一种数据建模语言,用于定义通过NETCONF和RESTCONF等网络管理协议发送的数据。YANG数据建模语言由互联网工程任务组(IETF)中的NETMOD工作组维护,并在2010年10月作为RFC 6020发布。
该数据建模语言既可以用来建模配置数据,也可以用来建模网元的状态数据。
此外,YANG可以用来定义网络元素发出的事件通知的格式,它允许数据建模者定义远程过程调用的签名,这些远程过程可以通过NETCONF协议在网络元素上调用。由于该语言与协议无关,因此可以将其转换为网络配置协议支持的任何编码格式,如XML或JSON。
YANG是一种模块化的语言,以XML树格式表示数据结构。该数据建模语言带有许多内置的数据类型。可以从内置的数据类型中派生出额外的特定应用数据类型。更复杂的可重用数据结构可以用分组来表示。YANG数据模型可以使用XPATH表达式来定义YANG数据模型元素的约束。
(YANG模型示意图)
2.2.1.2 YANG数据实例
下面的YANG模块example-sports展示了一个团队运动的数据模型。该模块声明了一个命名空间和一个前缀,并在定义类型 season 之前导入了类型库模块 ietf-yang-types。然后它定义了一个容器sports,其中包括一个人的列表和一个队的列表。一个团队有一个球员列表,通过 leafref 类型及其路径限制来引用人员。
数据模型如下定义:
module example-sports {
namespace "http://example.com/example-sports";
prefix sports;
import ietf-yang-types { prefix yang; }
typedef season {
type string;
description
"The name of a sports season, including the type and the year, e.g,
'Champions League 2014/2015'.";
}
container sports {
config true;
list person {
key name;
leaf name { type string; }
leaf birthday { type yang:date-and-time; mandatory true; }
}
list team {
key name;
leaf name { type string; }
list player {
key "name season";
unique number;
leaf name { type leafref { path "/sports/person/name"; } }
leaf season { type season; }
leaf number { type uint16; mandatory true; }
leaf scores { type uint16; default 0; }
}
}
}
}
2.2.1.2.1 XML编码
下面的代码块显示了example-sports数据模型实例的XML表示:
<data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">
<sports xmlns="http://example.com/example-sports">
<person>
<name>Lionel Andrés Messi</name>
<birthday>1987-06-24T00:00:00-00:00</birthday>
</person>
<person>
<name>Cristiano Ronaldo</name>
<birthday>1985-02-05T00:00:00-00:00</birthday>
</person>
<team>
<name>FC Barcelona</name>
<player>
<name>Lionel Andrés Messi</name>
<season>Champions League 2014/2015</season>
<number>10</number>
<scores>43</scores>
</player>
</team>
<team>
<name>Real Madrid</name>
<player>
<name>Cristiano Ronaldo</name>
<season>Champions League 2014/2015</season>
<number>7</number>
<scores>48</scores>
</player>
</team>
</sports>
</data>
2.2.1.2.2 JSON编码
下面的代码块显示了example-sports数据模型实例的JSON表示:
{
"example-sports:sports": {
"person": [
{
"name": "Lionel Andrés Messi",
"birthday": "1987-06-24T00:00:00-00:00"
},
{
"name": "Cristiano Ronaldo",
"birthday": "1985-02-05T00:00:00-00:00"
}
],
"team": [
{
"name": "FC Barcelona",
"player": [
{
"name": "Lionel Andrés Messi",
"season": "Champions League 2014/2015",
"number": 10,
"scores": 43
}
]
},
{
"name": "Real Madrid",
"player": [
{
"name": "Cristiano Ronaldo",
"season": "Champions League 2014/2015",
"number": 7,
"scores": 48
}
]
}
]
}
}
2.2.2 操作
基本协议定义了以下操作:
操作 |
描述 |
<get> |
检索运行配置和设备状态信息 |
<get-config> |
检索指定配置数据存储的全部或部分。 |
<edit-config> |
通过创建、删除、合并或替换内容来编辑配置数据存储。 |
<copy-config> |
将整个配置数据存储复制到另一个配置数据存储中。 |
<delete-config> |
删除配置数据存储 |
<lock> |
锁定设备的整个配置数据存储。 |
<unlock> |
释放之前通过<锁>操作获得的配置数据存储锁。 |
<close-session> |
要求优雅地终止NETCONF会话 |
<kill-session> |
强制终止NETCONF会话 |
基本的NETCONF功能可以通过定义NETCONF能力来扩展。
在会话设置的能力交换部分,服务器和客户机之间会传达一个实现所支持的附加协议特性集。强制性协议特性不包括在能力交换中,因为它们是假定的。RFC 4741定义了一些可选的能力,包括:xpath和:validate。
请注意,RFC 6241废除了RFC 4741。
RFC 5277中发布了支持订阅和接收异步事件通知的能力。
该文档定义了<creat-subscription>操作,它可以创建实时和重播订阅。然后使用<notification>构造异步发送通知。它还定义了 :interleave 能力,当与基本 :notification 能力一起支持时,该能力有助于在订阅处于活动状态时处理其他 NETCONF 操作。
RFC 5717中定义了支持部分锁定运行中的配置的能力。
这允许多个会话在运行中的配置中编辑非重叠的子树。如果没有这个功能,唯一可用的锁定是整个配置。
RFC 6022中定义了监视NETCONF协议的功能。
该文档包含一个数据模型,包括有关NETCONF数据存储、会话、锁和统计的信息,便于管理NETCONF服务器。它还定义了NETCONF客户端发现NETCONF服务器支持的数据模型的方法,并定义了检索这些数据模型的<get-schema>操作。
2.2.3 消息
NETCONF消息层为编码提供了一个简单的、与传输无关的框架机制。
l RPC调用(<rpc>消息)。
l RPC结果(<rpc-reply>消息),以及
l 事件通知(<notification>消息)。
每个NETCONF消息都是一个格式良好的XML文档。一个RPC结果通过一个Message-id属性链接到一个RPC调用。NETCONF消息可以是管道式的,也就是说,一个客户端可以调用多个RPC,而不必先等待RPC结果消息。RPC消息在RFC 6241中定义,通知消息在RFC 5277中定义。
2.2.4 传输
l 安全壳上的NETCONF协议(SSH):RFC:6242
l 具有相互X.509认证的传输层安全(TLS)的NETCONF协议:RFC:7589。
2.3 NETCONF通信
(NETCONF通信示意图)
2.3.1 ncclient
ncclient 是一个用于 NETCONF 客户端的 Python 库。它的目的是提供一个直观的API,将NETCONF的XML编码性质合理地映射到Python结构和习惯中,并使编写网络管理脚本变得更容易。其他的主要特点是:
l 支持RFC 4741中定义的所有操作和功能。
l 请求管道化。
l 异步RPC请求。
l 除非真正需要,否则不使用XML。
l 可扩展性。可以轻松添加新的传输映射和能力/操作。
from ncclient import manager
# 使用来自ssh-agent或~/.ssh密钥的未加密密钥,并依赖known_hosts
with manager.connect_ssh("host", username="user") as m:
assert(":url" in m.server_capabilities)
with m.locked("running"):
m.copy_config(source="running", target="file:///new_checkpoint.conf")
m.copy_config(source="file:///old_checkpoint.conf", target="running")
从0.4版本开始,瞻博网络(Juniper)和思科(Cisco)的分支已经整合进来了。因此,我们引入了很多新的概念,分别简化了对瞻博网络和思科设备的管理。最大的变化是在连接参数中引入了设备处理程序。例如,要调用Juniper的函数和参数,就必须重写上面的device_params={'name':'junos'}。
from ncclient import manager
with manager.connect(host=host, port=830, username=user, hostkey_verify=False, device_params={'name':'junos'}) as m:
c = m.get_config(source='running').data_xml
with open("%s.xml" % host, 'w') as f:
f.write(c)
相应的是,对于思科Nexus来说,名称是nexus。
最新的pull request merge包含了对device_params中名称为huawei的华为设备的支持。
支持的设备处理程序:
l Juniper: device_params={'name':'junos'}。
l Cisco CSR:device_params={'name':'csr'}。
l Cisco Nexus: device_params={'name':'nexus'}。
l 华为:device_params={'name':'huawei'}。
3 RESTCONF
RESTCONF是另一个IETF标准,在RESTful接口的基础上实现了一些NETCONF功能。
运行RESTCONF代理的网络设备可以通过五个HTTP操作进行管理:
l GET:该方法检索资源的数据和元数据。除了操作资源外,所有资源类型都支持它。
l PATCH:该方法可以部分修改资源的数据和元数据,但操作资源除外。此方法可部分修改资源(相当于NETCONF的合并操作)。
l PUT:该方法创建或替换目标资源。。
l POST:该方法创建或替换目标资源。此方法创建一个数据资源或调用一个操作资源。
l DELETE:该方法删除目标资源。
RESTCONF是通过HTTP/HTTPS使用XML或JSON消息的NETCONF,但它缺少了几个关键的NETCONF组件,包括多个数据存储、提交或回滚以及配置锁定。
(网络管理系统案例)
(RESTCONF协议栈)
(RESTCONF的请求案例)
4 NETCONF与RESTCONF对比
1. RESTCONF支持XML或JSON作为编码。NetConf使用XML。
2. 通过NETCONF能力可以发现所有NETCONF服务器的信息,如NETCONF版本,数据存储,YANG模块,功能和偏差。YANG1.1要求NETCONF服务器用YANG模块 "inetf-yang-library"[RFC7895]来声明它实现的模块。通过RESTCONF,服务器使用 "inetf-yang-library "YANG模块,定义YANG模块库[RFC7895],报告它支持的每个YANG模块、偏差、功能。
3. 考虑到NETCONF的功能,自然的服务自动化流程是NETCONF <lock>操作(在运行的数据存储上),编辑候选配置数据存储中的配置,验证配置,然后是提交操作(将候选数据存储中的配置应用到运行的数据存储中),最后是解锁操作。这些事务都是针对多个设备,从编排器出发,实现网络范围内的事务,作为两阶段的提交事务。
RESTCONF不提供锁的概念,不提供候选配置和提交的概念:配置的变化是直接应用的。因此,RESTCONF不提供分布式事务,只提供设备间的配置。RESTCONF无法实现两阶段的提交事务。
这个两阶段提交主要是在跨网元配置服务的时候,所以在控制器和网元之间很重要。在编排器北向接口上,一个包含所有服务参数的RESTCONF请求是完全可以的, 该请求是原子的操作。
4. 三阶段事务,在NETCONF中可用,基本上是两相提交和确认提交。由于RESTCONF连两阶段提交都不支持,所以RESTCONF显然不支持三阶段事务。
5. NETCONF <get>操作获取运行中的配置和操作数据,NETCONF <get-config>操作用于从指定的数据存储中获取配置数据(如candidate)。通过RESTCONF,可以通过'content'查询参数为 "nonconfig "来检索非配置部分。其值可以是 "config"、"nonconfig "和 "all"。 其中 "all "相当于NETCONF <get>。在这方面,RESTCONF可以提供更细粒度的访问。
6. RESTCONF协议没有事务的概念。一个RESTCONF调用本身就是一个事务,因为它使用HTTP POST、PUT、PATCH和DELETE方法是用来编辑YANG数据模型所代表的数据资源。
7. RESTCONF在没有激活配置的情况下,缺乏任何验证的方式。然而,验证是隐含的,是RESTCONF调用的一部分,结果就是成功或失败。
8. 使用NETCONF,SSH会话是从NETCONF客户端到NETCONF服务器建立的,这意味着可能存在许多并发的SSH会话。RESTCONF是基于HTTPS的。
9. 最后,RESTCONF不提供<copy-config>的功能,NETCONF可以使用。
这里想强调工具的重要性。一般的自动化,特别是网络配置,意味着整个工具链的整合。而如果现有的工具链(例如,存储和计算)是以HTTP为中心的,那么RESTCONF方案可能是最好的方案。
(编程架构示意图)
(管理系统示意图)
5 参考
https://en.wikipedia.org/wiki/NETCONF
https://tools.ietf.org/html/rfc4741
https://tools.ietf.org/html/rfc5277
https://tools.ietf.org/html/rfc6022
https://tools.ietf.org/html/rfc5717
https://tools.ietf.org/html/rfc6241
https://tools.ietf.org/html/rfc5277
https://en.wikipedia.org/wiki/YANG
https://archive.nanog.org/sites/default/files/tuesday_tutorial_moberg_netconf_35.pdf
https://www.slideshare.net/tailfsystems/netconf-yang-tutorial
https://tools.ietf.org/id/draft-ietf-netmod-revised-datastores-08.html#rfc.section.4.1
https://www.ciscolive.com/c/dam/r/ciscolive/emea/docs/2016/pdf/BRKNMS-2032.pdf
https://www.ciscolive.com/c/dam/r/ciscolive/emea/docs/2016/pdf/BRKNMS-2032.pdf
https://www.enog.org/wp-content/uploads/presentations/enog-13/43-ODL-Netconf-Yang-tutorial.pdf
https://www.informit.com/articles/article.aspx?p=2979064&seqNum=4
https://www.coursehero.com/file/47948151/wk2-netopspdf/
https://www.fir3net.com/Networking/Protocols/an-introduction-to-netconf-yang.html
https://www.networkworld.com/article/2173842/understanding-netconf-and-yang.html
https://github.com/YangModels/yang
https://ncclient.readthedocs.io/
- 点赞
- 收藏
- 关注作者
评论(0)