Netconf协议讲解

news/2024/11/17 18:36:29/

目录

什么是Netconf

为什么要提出Netconf

数据的类别

传统网络配置协议

Netconf配置协议

Netconf协议架构

安全传输层

消息层

操作层

内容层

Netconf配置设备流程

通过Python进行Netconf配置


什么是Netconf

NETCONF(Network Configuration Protocol)网络配置协议,提供一套管理网络设备的机制。用户可以使用这套机制增加、修改、删除网络设备的配置,获取网络设备的配置和状态信息。

NETCONF有三个对象

NETCONF客户端、NETCONF服务器、NETCONF消息


为什么要提出Netconf

数据的类别

运行在设备上可获取的信息分为两类:配置数据和状态数据

配置数据可以写(例如配置IP地址,此数据就是配置数据)

状态数据是只读数据(例如接口的带宽利用率无法改变,只能读取,此数据就是状态数据)

传统网络配置协议

更改设备数据有多种方法,可以基于命令行也可以基于特定协议。命令行和SNMP是最经典的获取设备数据的方法

SNMP

SNMP基于UDP协议,无状态、无序、不可靠

SNMP用Set做配置时支持的配置比较少,只能做简单的配置,配置的限制太大

SNMP只是单个设备的管理,不支持网络级的配置和多设备配置协同

SNMP使用MIB进行描述数据的,不区分是状态数据还是配置数据

SNMP其实主要还是用于网络监控,不适合设备管理

CLI

各厂商定义的CLI各不相同,管理不方便

CLI配置脚本人类容易理解,但是设备解析起来比较复杂,很难实现自动化解析

无论配置自动化技术如何发展,本质仍然是使用CLI

Netconf配置协议

Netconf工作在SSH协议之上(通过SSH进行加密),可以下发配置给网路设备

Netconf有标准的数据模型,统一数据格式,可以使得所有厂商都可以识别

Netconf相比CLI设备识别会更快速,可以兼容不同的厂商

Netconf是面向业务的,支持网络级的配置和多设备配置协同

Netconf会区分状态数据和配置数据


Netconf协议架构

Netconf协议在概念上可以划分为4层:安全传输层、消息层、操作层、内容层

出错了才会发送notification

安全传输层

为客户端和服务器之间交互提供通讯路径

当前华为Netconf协议的安全传输层是基于SSH

消息层

提供的是RPC请求和回应机制,表示此消息是RPC请求还是RPC应答

RPC的框架与传输层独立,用于表示Netconf requests和response

设备之间的会话交互是有会话ID的

消息层的格式

<rpc>

用于封装从客户端到服务端的NETCONF请求(头部定义message-id标示序列)

<rpc-reply>

用户服务端回复<rpc>的response消息(头部message-id与<rpc>保持一致)

<rpc-error>在<rpc-reply>中被发送

一个<rpc-reply>可以包含多个<rpc-error> , 表示没有错误

<ok>在<rpc-reply>中被发送

表示没有数据返回

操作层

明确消息层中的内容是干嘛的(进行配置edit(删除、创建、修改等配置)、下载get等)

操作对象(Netconf有三个操作对象)

运行配置库(running)-dis cu可以查看

 命令配置成功,并且comit了,配置的命令就会存储在运行配置库中

 此配置库存放在内存中

候选配置库(candidate)

 命令配置成功,但是没有comit,配置的命令会就存储在候选配置库

启动配置库(startup)-dis save可以查看

 配置命令保存后,配置的命令就会存储在启动配置库中

 此配置库存放在Flash卡中

通过此三个配置库,可以灵活读取和编辑配置库、候选库与运行库,实现整体配置的下发、验证和回滚

Netconf定义的操作类型

 

操作类型和操作对象之间的关系

内容层

为设备配置数据的具体才足以内容,即下载或配置的具体内容(配置某个接口,下载某个文件)

建模语言

当前Netcon有两种建模语言:Schema和Yang

Schema

Schema是为了描述XML文档而定义的一套规则

Schema文件中定义了设备所有管理对象,以及管理对象的层次关系、读写属性和约束条件

Yang—主要使用的是Yang建模语言

YANG是专门为NETCONF协议设计的数据建模语言

用来为NETCONF协议设计可操作的配置数据、状态数据模型、远程调用(RPCs)模型和通知机制等

什么是Yang模型,Yang和Netconf的关系是什么

Yang是一个建模的语言,只有框架,没有具体的数据,用来描述Netconf的内容层的结构

NETCONF 1.0对模型语言没有要求,NETCONF1.1明确了与YANG结合,开始规范NETCONF内容格式。

虽然指定了标准的Yang,但是每个厂商都有自己私有的Yang,在使用Netconf配置时并未完全统一

设备里面会内置了很多的Yang模型,不同的Yang模型只表示内容层不一样,其他层是一样的

当前华为设备支持的内容层

Huawei-YANG     华为私有Yang

NETCONF Schema 

Openconfig-yang  谷歌牵头的Yang

IETF-Yang         标准的Yang


Netconf配置设备流程

Netconf如何对设备配置

向Yang建模文件中填充数据,将其转为XML格式下发到设备进行设备配置

因为Yang语言只定义了模型,没有数据,要生成数据就需要变为XML格式(<>)

即将数据填充到Yang模型中,将其转变为XML格式(Yang转XML)

XML类似于Html,是一种扩展的标记语言

为什么要转为XML语言

       因为很多设备是支持XML语言的

XML格式编码

XML是Netconf协议的编码格式

例子:通过Netconf下发Vlan配置(内容层为Huawei私有Yang)

其中merge是<config>中可选的“operation”属性中的一个操作

Operation包含的操作以及其作用

merge:(默认操作)

在数据库中修改存在或不存在的目标数据

如果目标数据不存在则创建,如果目标数据存在则修改

create

当且仅当配置数据库中不存在待创建的配置数据时,才能成功添加到配置数据库

如果配置数据存在,则会返回<rpc-error>(其中包含一个<error-tag>值“data-exists”)

delete

删除配置数据库中指定的配置数据记录

如果数据存在,则删除该数据,如果数据不存在,则返回<rpc-error>(其中包含一个<error-tag>值“data-missing”)

remove

删除配置数据库中指定的配置数据记录

如果数据存在,则删除该数据,如果数据不存在,则返回成功。

delete和remove有点不同,一般删除使用remove


通过Python进行Netconf配置

Python中ncclient模块主要就是用来下发Netconf配置的(代码若有不对请指正)

基本步骤

ssh要手工配置好

先通过Prami模块通过SSH登录上去,配置Netconf相关命令(开启设备Netconf)

然后在通过ncclient模块下发Netconf配置

Netconf.txt文件

sys im
aaalocal-user netconf password irreversible admin@123local-user netconf service-type sshlocal-user netconf level 15quitrsa local-key-pair create
yssh user netconf service-type snetconf
snetconf server enable
netconfprotocol inbound ssh port 830quit

实验命令

from ncclient import manager
from ncclient import operations
import paramiko
import timeip = "192.168.0.1"
ssh_user = "huawei"
ssh_password = "admin@123"netconf_port = '830'
netconf_user = 'netconf'
netconf_password = 'admin@123'
filename = r'netconf.txt'    #此文件夹存放的是关于Netconf的命令(设备开启Netconf相关操作)#声明类名为ssh,包含两个方法 ssh_connect()建立SSH连接,ssh_config发送配置
class ssh():def ssh_connect(ip,username,password):ssh = paramiko.client.SSHClient()ssh.set_missing_host_key_policy(paramiko.client.AutoAddPolicy)ssh.connect(hostname=ip,port=22,username=username,password=password)print(ip+"ssh登录成功")return sshdef ssh_config(filename,ip,username,password):a = ssh.ssh_config(ip,username,password)command = a.invoke_shell()command.send("N\n")command.send("screen-length 0 temporary \n")with open(filename) as cmd1:cmd = cmd1.readlines()for i in cmd:command.send(i)time.sleep(1)outup = command.recv(65535).decode('ascii')print(outup)a.ssh_close()#建立Netconf会话连接
def huawei_connect(ip,port,user,password):return manager.connect(ip = ip,port = port,username = user,password = password,hostkey_verify = False,device_params = {'name' : 'huaweiyang'},allow_agent = False,look_for_keys = False)
#Netconf配置文件 Yang为huawei-yang,XML格式
CREATE_INTERFACE = '''<config><ifm xmlns="urn:huawei:yang:huawei-ifm"> <interfaces> <interface> <name>100GE1/0/1</name><mtu>1500</mtu> </interface> </interfaces> </ifm></config>'''if __name__ == "__main__":ssh.ssh_config(filename,ip,ssh_user,ssh_password)m = huawei_connect(ip,netconf_port,netconf_user,netconf_password)m.edit_config(target="running",config=CREATE_INTERFACE)m.commit()


http://www.ppmy.cn/news/8404.html

相关文章

04 kafka 中一些常用的配置的使用

前言 呵呵 也是最近有一些 搭建 kafka 的环境的需求 然后 从新看了一下 一部分的配置情况, 这里 大致理一下 一些我这里比较关心的配置 那些配置关联了 kafka 服务器绑定服务 绑定 tcp 服务的配置来自于这里, 读取的是 config.dataPlaneListeners config.dataPlaneListen…

实战四十六:基于LightGBM的广告点击预测 代码+数据

配库: 1. 读取原始数据, 将时间信息分解为天和分钟 2. 特征工程 3. 五折交叉验证训练模型 4. 特征重要性 5. 做出最终预测

使用异步ORM SQLAlchemy提升web服务性能

介绍 对于一个web服务&#xff0c;性能的瓶颈最终基本上都会出现在数据库读取的这一步上&#xff0c;如果能够在数据库读取数据的这一段时间自动切换去处理其他请求的话&#xff0c;服务的性能会得到非常显著的提升&#xff0c;因此需要选择一个合适的异步驱动和工具包 SQLAl…

诞生两年+,三翼鸟的“场景”思维有进化吗?

出品 | 何玺 排版 | 叶媛 2020年9月&#xff0c;三翼鸟品牌正式发布。截止2022年12月&#xff0c;三翼鸟已经走过了2年多的历程。诞生两年&#xff0c;三翼鸟有什么样的发展&#xff0c;它倡导的“场景”思维有进化吗&#xff1f;我们一起来看看。 01 从三翼鸟的“全球首个场…

java接口的静态方法

目前java接口中已经支持定义静态方法 但需要注意一个点 我们先把代码写出来 我们创建一个包 下面创建一个接口 subInterface 接口参考代码如下 public interface subInterface {static void show2() {System.out.println("来自接口的静态方法");} }这里 我们就将…

串口通信协议

同步通信和异步通信 同步通信:需要时钟信号的约束&#xff0c;在时钟信号的驱动下两方进行数据交换&#xff0c;一般会选择在上升沿或者下降沿进行数据的采样&#xff0c;以及时钟极性和时钟相位【eg.SPI,IIC】。 异步通信:不需要时钟信号的同步&#xff0c;通过&#xff08;…

Go 并发

来自 《Go 语言从入门到实战》 的并发章节学习笔记&#xff0c;欢迎阅读斧正&#xff0c;感觉该专栏整体来说对有些后端编程经验的来说比无后端编程经验的人更友好。。 Thread VS Groutine 创建时默认 Stack 大小&#xff1a;前者默认 1M&#xff0c;Groutint 的 Stack 初始化…

uniCloud云开发----4、uniCloud云开发进阶使用方法

uniCloud云开发进阶使用方法前言1、云对象的importObject的创建和使用(1&#xff09;创建云对象&#xff08;2&#xff09;编辑云对象&#xff08;3&#xff09;在.vue文件中调用云对象&#xff08;4&#xff09;在.vue文件中调用方法2、客户端直接连接数据库(1)直接在客户端引…