netconf协议详解

目录 什么是Netconf 为什么要提出Netconf 数据的类别 传统网络配置协议 Netconf配置协议 Netconf协议架构 安全传输层 消息层 操作层 内容层 Netconf配置设备流程 通过Python进行Netconf配置 Restconf 什么是Netconf NETCONF(Network Configuration Protocol)

目录

什么是Netconf

为什么要提出Netconf

数据的类别

传统网络配置协议

Netconf配置协议

Netconf协议架构

安全传输层

消息层

操作层

内容层

Netconf配置设备流程

通过Python进行Netconf配置

Restconf


什么是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
aaa
 local-user netconf password irreversible admin@123
 local-user netconf service-type ssh
 local-user netconf level 15
 quit

rsa local-key-pair create
y

ssh user netconf service-type snetconf
snetconf server enable
netconf
 protocol inbound ssh port 830
 quit

实验命令

from ncclient import manager
from ncclient import operations
import paramiko
import time

ip = "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 ssh
    def 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()

Restconf

Restconf和Netconf的对比

Netconf有事务机制,可以回滚;Restconf无状态,无事务机制,不可以回滚

Netconf主要运行在运营商;Restconf主要用在互联网厂商

Netconf需要通过客户端进行配置下发;Restconf通过Web就可以实现(HTTP协议)

Restconf和Netconf实现的作用是类似的

知秋君
上一篇 2024-07-11 21:48
下一篇 2024-07-11 21:12

相关推荐