NETCONF
网络配置协议NETCONF(Network Configuration Protocol)提供一套管理网络设备的机制,用户可以使用这套机制增加、修改、删除网络设备的配置,获取网络设备的配置和状态信息。通过NETCONF协议,网络设备可以提供规范的应用程序编程接口API(Application Programming Interface),应用程序可以直接使用这些API,向网络设备发送和获取配置。
NETCONF(Network Configuration Protocol)是基于可扩展标记语言XML(Extensible Markup Language)的网络配置和管理协议,使用简单的基于RPC(Remote Procedure Call)机制实现客户端和服务器之间通信。客户端可以是脚本或者网管上运行的一个应用程序。服务器是一个典型的网络设备。
NETCONF会话是网络管理员或网络配置应用程序与网络设备之间的逻辑连接。一台设备必须至少支持一个NETCONF会话,并且应该支持多个会话。可以在任何授权的会话期间更改全局配置属性,在所有会话中可见。特定于会话的属性仅影响更改它们的会话。
NETCONF协议框架
- 安全传输层(Secure Transport)提供了客户端和服务器之间的通信路径。
- 消息层(Messages)提供了一种简单的,独立于传输的成帧机制,用于对RPC和通知进行编码。
- 操作层(Operations)定义了一组基本协议操作。作为带有XML编码参数的RPC方法调用。
- 内容(Content)层由管理对象的数据模型定义,数据模型定义依赖NETCONF的实现情况。
Layer Example
+-------------+ +-----------------+ +----------------+
(4) | Content | | Configuration | | Notification |
| | | data | | data |
+-------------+ +-----------------+ +----------------+
| | |
+-------------+ +-----------------+ |
(3) | Operations | | <edit-config> | |
| | | | |
+-------------+ +-----------------+ |
| | |
+-------------+ +-----------------+ +----------------+
(2) | Messages | | <rpc>, | | <notification> |
| | | <rpc-reply> | | |
+-------------+ +-----------------+ +----------------+
| | |
+-------------+ +-----------------------------------------+
(1) | Secure | | SSH, TLS, BEEP/TLS, SOAP/HTTP/TLS, ... |
| Transport | | |
+-------------+ +-----------------------------------------+
NETCONF基本操作
<get>
检索运行配置和设备状态信息。
-
参数
filter:指定要检索的系统配置和状态数据部分。如果没有这个参数,则返回全部的设备配置及状态信息。
Positive Response:如果设备能够满足请求,则<rpc-reply>被发送。<data>包含适当的子集。
Negative Response:如果请求因为某些原因不完整,<rpc-reply>会包含<rpc-error>元素。
-
例子
<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> <rpc-reply message-id="101" xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"> <data> <top xmlns="http://example.com/schema/1.2/stats"> <interfaces> <interface> <ifName>eth0</ifName <ifInOctets>45621</ifInOctets> <ifOutOctets>774344</ifOutOctets> </interface> </interfaces> </top> </data> </rpc-reply>
<get-config>
查询全部或部分指定配置数据
参数:
- source:要查询的配置数据存储的名称
- filter
- Positive Response
- Negative Response
示例:查询running中接口配置
<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>
<rpc-reply message-id="101"
xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">
<data>
<top xmlns="http://example.com/schema/1.2/config">
<users>
<user>
<name>root</name>
<type>superuser</type>
<full-name>Charlie Root</full-name>
<company-info>
<dept>1</dept>
<id>1</id>
</company-info>
</user>
<!-- additional <user> elements appear here... -->
</users>
</top>
</data>
</rpc-reply>
<edit-config>
把全部或部分配置数据加载到指定的目标配置数据库。
操作支持多种加载配置方式,例如:支持加载本地文件、远程文件,支持在线编辑。如果NETCONF服务器支持URL能力,可以使用标识本地配置文件的参数替代参数。
属性:
-
operation:该属性标识执行操作的配置,并且可以出现在整个<config>子树的多个元素上。如果未指定“ operation”属性,则将配置合并到配置数据存储中。
operation具有以下值:
- merge:配置数据与<target>参数标识的配置数据存储区中的相应级别的配置合并。默认值。
- replace: 配置数据替换由标识的配置数据存储中的所有相关配置范围。
- create:当且仅当配置数据存储中不存在配置数据时,才将包含此属性的元素标识的配置数据添加到配置中。如果配置数据存在,则会返回,其中包含一个值“data-exists”。
- delete:仅当且仅当配置数据存储中当前存在配置数据时,才从配置中删除包含此属性的元素标识的配置数据。
- remove:如果配置数据存储中当前存在配置数据,则从包含配置的属性中删除包含此属性的元素标识的配置数据。
参数
-
target:待编辑的配置数据库。
-
default-operation:为操作设置默认操作。
- merge:参数中的配置数据与目标配置数据库中的配置合并。这是默认操作。
- replace:使用参数中的配置数据,完全替换目标配置数据库中的配置。
- none:除了执行operation属性指定的操作外,目标配置数据库中的配置数据不受中其他配置数据影响。如果参数中含有目标配置数据库中对应的数据层次上不存在的配置数据,则返回,值为“data-missing”,这样可以避免在执行指定操作时,无意中创建了冗余的元素。
-
error-option:用于设置一个实例配置出错后,后续实例配置的处理方式,缺省值为stop-on-error。
示例:正在运行的配置中,将名为“ Ethernet0 / 0”的接口上的MTU设置为1500
<rpc message-id="101"
xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">
<edit-config>
<target>
<running/>
</target>
<config>
<top xmlns="http://example.com/schema/1.2/config">
<interface>
<name>Ethernet0/0</name>
<mtu>1500</mtu>
</interface>
</top>
</config>
</edit-config>
</rpc>
<rpc-reply message-id="101"
xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">
<ok/>
</rpc-reply>
<copy-config>
使用另一个完整的配置数据存储库的内容创建或替换整个配置数据存储库。如果目标数据存储存在,则将其覆盖。否则,将创建一个新的。
参数:
- target:配置数据存储的名称,用作<copy-config>操作的目标。
- source:用作<copy-config>操作的源的配置数据存储的名称,或包含要复制的完整配置的<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>
<rpc-reply message-id="101"
xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">
<ok/>
</rpc-reply>
<delete-config>
删除配置数据存储。<running>配置数据存储区无法删除。
示例:
<rpc message-id="101"
xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">
<delete-config>
<target>
<startup />
</target>
</delete-config>
</rpc>
<rpc-reply message-id="101"
xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">
<ok/>
</rpc-reply>
<lock>
<lock>操作允许客户端锁定设备的整个配置数据存储系统。此类锁旨在缩短使用寿命,并使客户端可以进行更改,而不必担心与其他NETCONF客户端,非NETCONF客户端以及人工用户进行交互。
示例:
<rpc message-id="101"
xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">
<lock>
<target>
<running/>
</target>
</lock>
</rpc>
<rpc-reply message-id="101" xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">
<ok/> <!-- lock succeeded -->
</rpc-reply>
<unlock>
<unlock>操作用于释放先前通过<lock>操作获得的配置锁定。
如果满足以下任一条件,则<unlock>操作将不会成功:
- 指定的锁当前未处于活动状态。
- 发出<unlock>操作的会话与获得锁的会话不同。
示例:
<rpc message-id="101"
xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">
<unlock>
<target>
<running />
</target>
</unlock>
</rpc>
<rpc-reply message-id="101">
<ok />
</rpc-reply>
<close-session>
请求正常终止NETCONF会话。NETCONF服务器收到<close-session>请求时,将正常关闭该会话。服务器将释放与该会话关联的所有锁和资源,并优雅地关闭所有关联的连接。在<close-session>请求之后收到的任何NETCONF请求都将被忽略。
示例:
<rpc message-id="101"
xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">
<close-session />
</rpc>
<rpc-reply message-id="101"
xmlns="urn:ietf:arams:xml:ns:netconf:base:1.0">
<ok />
</rpc-reply>
<kill-session>
强制终止NETCONF会话。
示例:
<rpc message-id="101"
xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">
<kill-session>
<session-id> 4 </session-id>
</kill-session>
</rpc>
<rpc-reply message-id="101"
xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">
<ok />
</rpc-reply>