NETCONF 学习

·
Tech netconf August 22, 2019

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

  • KVM 安装 Win 10 虚拟机
  • Coming soon
取消回复

说点什么?
Title
安全传输层
消息层
操作层
内容层
Juniper NETCONF 功能启用
使用 NETCONF Python 客户端 ncclient
安装 ncclient
获取 running config
修改配置

© 2023 Coo's Note. Using Typecho & Moricolor.