NETCONF 学习
NETCONF (Network Configuration Protocal) 是一种网络管理协议,提供一套机制来添加、修改、删除网络设备配置。NETCONF 通过 RPC 层来操作,使用 XML 对配置数据以及协议消息进行编码。协议规范可以查看 RFC
NETCONF协议
多个配置数据库
- startup 设备启动时使用的配置。
- candidate 可以修改但不会立即生效,通过 commit 提交到 running。
- running 当前使用的配置。
协议层次
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 | | |
+-------------+ +-----------------------------------------+
安全传输层
规定其传输层必须使用带有安全加密的通信协议,例如 SSH, TLS 等。相比与其它也允许明文传输的协议来说其在协议层面就已经对数据安全做了第一道守护。由于 NETCONF 协议规定必须要支持 SSH,所以目前 SSH 是 NETCONF 使用最广泛的传输层协议。定义了数据的传输方式,NETCONF 并没有指定协议实现者在 C/S 之间使用什么传输协议,只是规定了一些传输协议必须满足的要求。
消息层
提供一种传输无关的消息封装格式,用于 RPC 通信。NETCONF 中定义了三种消息类型,分别是 hello, rpc 和 rpc-reply, notification。
操作层
定义了一系列用于网络设备管理的操作。 详情见RFC6241
操作名称 | 功能 |
---|---|
get | 获取所有配置 |
get-config | 获取某个数据库的配置 |
edit-config | 添加、修改、删除配置 |
copy-config | 创建或替换整个数据库的配置 |
delete-config | 删除某个数据库的配置(除了running) |
lock | 给某个数据库加锁 |
unlock | 释放锁 |
close-session | 关闭 NETCONF 会话 |
kill-session | 强制关闭 NETCONF 会话 |
内容层
协议本身没有对内容层的数据结构做任何的限定。而其规范则体现在其内容层需要使用Yang语言对其数据进行建模。
与其他南向接口对比
NETCONF | SNMP | CLI | |
---|---|---|---|
网络配置 | 强 | 弱 | 强 |
网络监控 | 中 | 强 | 弱 |
Telnet | 不支持 | 不支持 | 支持 |
SSH/TCP | 支持 | 不支持 | 不支持 |
SOAP | 支持 | 不支持 | 不支持 |
UDP | 不支持 | 支持 | 不支持 |
配置方式/操作 | 多 | 少 | 少 |
建模语言 | YANG/SMLDUMP | SML/SMLv2 | 无 |
编码语言 | XML | ASN.1 | 厂商特定 |
事务处理与并发处理 | 支持 | 无 | 支持 |
使用对象 | 配置应用 | 监控应用 | 用户 |
标准化程度 | 高 | 高 | 低 |
安全性 | 高 | 中 | 中 |
易开发性与扩展性 | 高 | 中 | 低 |
使用示例
Juniper NETCONF 功能启用
user@host# set system services netconf ssh
user@host# set system services netconf ssh port port-number
user@host# commit
使用 NETCONF Python 客户端 ncclient
安装 ncclient
pip install ncclient
获取 running config
from ncclient import manager
with manager.connect(host=host, port=830, username=user, password=password, hostkey_verify=False) as m:
c = m.get_config(source='running').data_xml
with open("%s.xml" % host, 'w') as f:
f.write(c)
获取 set 格式的配置
conn = manager.connect(host=host,
port=port,
username=user,
password=password,
timeout=60,
device_params={'name': 'junos'},
hostkey_verify=False)
result_text = conn.get_configuration(format='set')
获取 xml 格式的配置
result_text = conn.get_configuration(format='xml')
获取 json 格式的配置
result_text = conn.get_configuration(format='json')
修改配置
set 格式的配置
conn.lock()
location = []
location.append('set system location building "Main Campus, C"')
location.append('set system location floor 15')
location.append('set system location rack 1117')
load_config_result = conn.load_configuration(action='set', config=location)
validate_result = conn.validate()
compare_config_result = conn.compare_configuration()
conn.commit()
conn.unlock()
text 格式的配置
conn.lock()
location = """
system {
location {
building "Main Campus, E";
floor 15;
rack 1117;
}
}
"""
load_config_result = conn.load_configuration(format='text', config=location)
validate_result = conn.validate()
compare_config_result = conn.compare_configuration()
conn.commit()
conn.unlock()
参考
Network Configuration Protocol (NETCONF)
NETCONF协议详解
NETCONF&YANG 介绍
NETCONF
Prerequisites for Establishing an SSH Connection for NETCONF Sessions
ncclient Docs