netconf简介

article/2025/11/10 5:08:08

简介
根据rfc6241 Network Configuration Protocol (NETCONF)介绍,netconf协议提供一种简单的机制,通过该机制网络设备进行管理。协议可以是设备对外提供一套完整并且规范的配置接口,管理者可以通过这些标准接口对设备进行配置操作。
netconf也是采用的服务端、客户端模式,与其他管理协议稍有区别的是,被管理设备是netconf服务端,管理者是netconf客户端(通常叫控制器),控制器与被管理设备建立的是长连接,实际上连接是由ssh、tls、soap或https等建立,当控制器想通过netconf协议对设备进行配置时,首先要建立ssh、tls、soap或https安全连接,这些安全连接建立后,netconf在这些安全连接基础上再建立netconf会话,所以netconf协议的连接是灵活的、安全的。
Netconf协议由yang语言建立配置模型,由xml语言封装数据,通过ssh、tls、soap或者https等通道传递数据。也就是说,设备将yang模型定义好并且在设备上实现,控制器根据设备定义的yang模型,按照yang模型中定义的配置格式,将要下发的数据用xml语言封装,发送给设备,设备对xml格式数据进行解析,更改设备配置。
Netconf基于yang模型进行建模,yang模型限定了格式,但是不限定内容,格式的限定保证控制器与网络设备配置模型的同步,内容的不限定保证了上层控制工具可以对业务的“编程式”下发。

yang模型
yang语言的定义主要在rfc6020和rfc7950中,其中rfc6020是第一版yang模型定义,版本是1,rfc7950解决了rfc6020的一些模糊和缺陷,版本是1.1,它新增加和修改了一些语法的定义,而且其中有一小部分修改是rfc6020向后不兼容的。
rfc对一些通用的网络配置定义了一些标准yang模型,比如ietf-interface.yang、ietf-vxlan.yang、ietf-ip.yang,这些yang模型是持续更新的,他们依赖的yang模型也是持续更新的,不一定最新版本的yang模型就一定是最好的,要根据自己设备的支持情况以及后续可能的基本扩展选择yang模型,像华三、华为厉害的就自己设计和定义。
yang也是一门语言,有自己的语法,具体的语法还是需要详细阅读rfc的定义好好研究,可以将设备按模块分别定义成一个yang文件,将这些yang文件汇聚在一起,就构成了一个设备的配置模型树,每一个yang模型都是这个配置树的一个树枝,每个树枝下有具体的配置项,yang语法相对简单,理解起来比较容易,以下是个人对yang模型中的关键字结合c语言的一些理解,仅供参考。
container
container student {

    leaf name{type string;}Leaf age{type uint32;}

}
类似于:
struct student {

    char *name;int age;

};
leaf

最底层节点,具体的配置项。

list
可以理解成c语言中实现的一个链表。
list student {

    key "name";leaf name{type string;}leaf age{type uint32;}

}
类似于:
list相当于:
struct list {

    struct list *next;

};
student相当于:
struct student {

    char *name;int age;

};
list相当于c语言中定义的一个结构体链表,与c语言不同,list关键字两步并成一步,在声明链表的同时直接将链表中每个个体的数据结构也直接定义出来,实际上这个list可以说是抽象的一个list,在控制器中获取到的数据是这样的:

   <name>张三<name/><age>18<age/>

   <name>李四<name/><age>22<age/>


这两条数据就抽象成了一个list student,student包含name和age两个属性,也就是说每个student都有name和age。
list下定义了很多leaf,将其中的一个或多个leaf指定为key,key是检索条件,用来确定你要操作list中的哪个节点,key是必须下发的,不然设备不知道下发的这些属性是要配置哪个节点。就好比给某个接口配置ip地址,那么一定要下发接口名,不然不知道给哪个接口配置ip地址。
leaf-list
相当于c预言的字符串数组或者int数组。
leaf-list subjetc {

    type string;

}
类似于:
char *subject[SIZE];
但是它与list的区别是leaf-list是同一类型的leaf的一个集合,它是最底层的leaf,没有子节点,而list不是最底层的,它下面是可以继续定义leaf子节点的,举例来说,list就好比一个学生,它有年龄、姓名、学习哪些科目,leaf-list就是“学习哪些科目”,将这些科目统一定义成一个leaf-list,用xml表示就是:

   <name>张三<name/><age>22<age/><subject>语文<subject/><subject>数学<subject/>

   <name>李四<name/><age>22<age/><subject>政治<subject/><subject>历史<subject/><subject>地理<subject/>


简单的说student是一个list,它有name、age、subject三个属性,subject是一个leaf-list,每一个数据都是一个leaf。
augment
扩展是将augment定义的内容扩展到另外一个yang文件的某个结构下。也就是说你可以在a.yang中定义一些新的container、list、leaf,将这些新的定义通过augment关键字扩展到另外一个已经定义好并且开发完不想再修改yang文件的b.yang中。
比如a.yang定义如下,并且代码层面已经开发完成与控制器联调也已经完成:
container student {

    leaf name{type string;}leaf age {type uint32;}leaf class {type string;}

}
但是,在二期项目中发现不够用,还需要增加一个新的属性,但是由于各种原因不想修改a.yang这个文件,那么可以在b.yang中使用augment(其中std是a的prefix,见rfc中对import的说明):
augment "/std: student " {

    leaf evening_study {type boolean; }

}
设备加载好a.yang和b.yang后数据模型如下:
container student {

    leaf name {type string;}leaf age  {type uint32;}leaf class {type string;}leaf evening_study {type boolean;}

}
但是,需要注意的是,在配置下发的时候,需要对扩展的属性添加命名空间。比如a.yang的命名空间是“a”,b.yang的命名空间是“b”,那么下发时需要指定命名空间:

   <name>张三<name/><class>高三< class /><evening_study nc:namespace=”b”>true< evening_study />

< student />
when
条件定义
augment "/std: student " {

   when "class=’高三’“;leaf evening_study {type boolean; }

}
when是对上一层的限定,也就是说当下发的配置中class属性的值只有是“高三”时,student这个大结构体中才有evening_study这条属性,才可以对这条属性进行配置。
mandatory true
限定某个属性必须下发,限定范围同when一样,在哪个属性的大括号内,就限定哪个属性。
config false
限定属性是只能查询不可配置的,限定范围同when一样,在哪个属性的大括号内就限定哪个属性。

xml
xml语言是非常通用的一种语言格式,w3school中有很好的教学示例。rfc6241中定义了netconf用到的xml相关定义,比如editOperationType:
-->










控制器将要下发的配置,根据yang模型的定义,封装成xml格式,下发到netconf设备,具体的格式,随便去华为官网上,搜索netconf,把那款产品的配置手册下载下来,应有尽有!

CloudEngine 16800系列交换机 产品文档
基于ssh的netconf会话
Netconf会话实际上比较简单,但是在建立netconf会话之前需要为netconf会话准备一条安全的通道,可以是ssh、tls、https、soap。下面以ssh为例简单介绍下netconf会话的建立过程。
主动连接
Netconf服务端主要分为两个部分,一般是两个进程:sshd进程和netconfd进程,sshd进程监听830端口,控制器是ssh客户端,就像使用ssh客户端登录到主机一样,控制器向sshd的830端口发起连接,输入用户名和密码认证成功后,建立ssh tunnel,sshd启动netconf-subsystem进程,subsystem进程是netconf模块提供给sshd进程的,它的内部实现是将ssh tunnel读到的消息直接写给netconf进程,从netconf读到的消息直接写到ssh tunnel,发给控制器,如图所示:


上面这一堆,仅仅是建立了一条安全通道,这时候可以说控制器可以将消息发到netconfd进程,netconfd进程也可以将消息发送到控制器了,将中间的ssh这一堆抽象成一个socket连接即可(所以说这个连接是安全的,因为是ssh安全协议),这时候控制器和netconfd进程互发netconf协议的hello消息,开始正式建立netconf会话,这就是之所以说netconf会话是建立在ssh会话之上的。
这种连接方式,都是由控制器主动向netconf设备发起连接,要求netconf设备必须在公网上,控制器能够找的到被管理设备才行,但是一些终端设备必然是在nat后的,所以netconf还有另外一种连接方式,解决终端在nat时控制器无法找到终端的问题,那就是callhome连接。
callhome连接
rfc8071对callhome有着详细的描述,这里不再赘述,callhome总体流程图如rfc8071所示:


rfc8071的描述很清晰, netconf服务端和客户端必须同时支持callhome,以ssh为例,简单说下callhome方式建立会话过程:
1, 首先设备向控制器发起一个tcp连接,即设备侧创建一个socket,向控制器的callhome服务监听发起connect。这里要分清客户端和服务端,对于callhome协议,设备侧是客户端,控制器是服务端,所以设备向控制器主动先发起tcp连接,当connect成功后,设备是ssh服务端,控制器是ssh客户端。
2, tcp连接建立成功后,控制器利用并且必须只用这个连接,向设备侧发送ssh报文,发起ssh会话。
3, ssh会话建立后,与上面的主动连接就完全相同了,开始建立netconf会话。
以上三步可以看出,其实callhome方式上线与主动建立连接方式上线的唯一区别就是,tcp连接是由谁率先发起的,主动建立连接是控制器主动向netconf设备发起的tcp连接,这时设备要在公网上,不能在nat后,而callhome上线,是netconf设备主动向控制器先发起tcp连接,连接建立后,后面的流程与主动建立连接是一样的,但是,callhome的上线时,netconf设备可以在nat后,只要保证控制器在公网就行了。


http://chatgpt.dhexx.cn/article/Ar0vbVXv.shtml

相关文章

五、南向接口协议(四)——NetConf协议

文章目录 1 什么是NetConf协议2 NetConf协议的其他特点3 NETCONF协议框架3.1 NETCONF传输层3.2 NETCONF消息层&#xff08;采用RPC协议&#xff09;3.3 NETCONF操作层&#xff08;NETCONF核心&#xff09;3.4 NETCONF内容层 4 操作举例4.1 <get-config>4.2 <edit-conf…

Netconf网络配置协议讲解

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

netconf协议

最近项目中要用到netconf协议也和设备之间进行连接&#xff0c;学习一下netconf协议并且记录下来 一&#xff1a;什么是netconf netconf协议也可以叫做网络配置协议&#xff0c;它提供了一套管理网络设备的机制&#xff0c;用户可以使用这套机制增加&#xff0c;修改&#xff0…

neq的问题

最近做一个项目&#xff0c;用的tp5&#xff0c;刚开始上手&#xff0c;就给我出现了一个莫名其妙的问题&#xff1b; 也不算是错误&#xff0c;看代码 我根据这个条件去用select查询数据库的数据&#xff0c;然后居然只给我返回一条数据&#xff0c;我以为是我的查询语句写错…

php条件判断结构一个嵌套,thinkphp:html中的if condition 嵌套写法、条件判断的各种情况(eq、neq、gt、lt、or、and) - 猫扑天空...

伪代码 术语符号 大于 gt 小于 lt 等于 eq 不等于 neq 或者 or 并且 and 变量start_time代表的含义是活动的开始时间,变量start_time代表的含义是活动的结束时间。两个变量都是时间戳的格式。下面就将显示状态一列的数据&#xff0c;各种情况下的判断条件列举出来。 等于 eq 进…

前端模板标签eq与neq的使用,以及管理系统模块权限控制

1&#xff09;方法一&#xff1a; 在超级管理员登录情况下显示 1.当前登录用户只能修改自己 2.超级管理员admin拥有查看普通用户和删除其他用户的权限&#xff0c;但删除不了自己 {volist name"userList" id"user" empty"$empty"}<tr><…

2022-03-11 工作记录--PHP-eq(表示等于)、 neq(表示不等于)

PHP-eq&#xff08;表示等于&#xff09;、 neq&#xff08;表示不等于&#xff09;

mysql neq什么意思_【知识科普】标准中的Eqv、Idt和Neq分别代表什么?

对于接触标准化的工作者&#xff0c;每日避免不了和各种各样类别的标准打交道。除了标准的分类&#xff0c;分级、层次等问题&#xff0c;一些特殊的英文字符&#xff0c;也许让很多标准化人员产生困惑&#xff0c;接下来&#xff0c;请允许小编花一些时间&#xff0c;跟您详细…

Flyway针对多数据源配置实战方案

Flyway针对多数据源配置实战方案 介绍 这篇文章主要介绍Flyway、Druid和多数据源结合起来如何配置和使用的方案。网上一些文章似乎都没有达到一开始我自己琢磨想要的程度&#xff0c;还是自己琢磨和调试出来了一套方案&#xff0c;欢迎大家斧正。 引入pom文件 首先引入对应…

Flyway学习和使用

1、什么是Flyway Flyway is an open-source database migration tool. It strongly favors simplicity and convention over configuration. It is based around just 7 basic commands: Migrate, Clean, Info, Validate, Undo, Baseline and Repair. Flyway是一款开源的数据…

flyway baseline-version

背景 使用flyway进行数据库版本控制。 问题 flyway配置 # 当迁移发现数据库非空且存在没有元数据的表时&#xff0c;自动执行基准迁移&#xff0c;新建schema_version表baseline-on-migrate: true# 开始执行基准迁移时对现有的schema的版本打标签&#xff0c;默认值为1basel…

Ruoyi集成flyway后启动报错的解决方法

ruoyi系列框架是开源中非常好的源码平台&#xff0c;使用宽松的开源协议进行源代码的开放。不管是单体版、前后端分离甚至是微服务架构&#xff0c;均提供了相应的代码。基于ruoyi可以做自己的后台系统&#xff0c;也可以学习很多技术的集成。 而flyway是java里面的数据库脚本…

快速掌握和使用Flyway

什么是Flyway? 转载&#xff1a;https://blog.waterstrong.me/flyway-in-practice/ Flyway is an open-source database migration tool. It strongly favors simplicity and convention over configuration. Flyway是一款开源的数据库版本管理工具&#xff0c;它更倾向于规约…

flyway使用说明

Flyway是一款数据库迁移&#xff08;migration&#xff09;工具。简单点说&#xff0c;就是在你部署应用的时候&#xff0c;帮你执行数据库脚本的工具。Flyway支持SQL和Java两种类型的脚本&#xff0c;你可以将脚本打包到应用程序中&#xff0c;在应用程序启动时&#xff0c;由…

Flyway 入门教程

目录 一、简单介绍 二、Flyway使用场景 三、Flyway工作原理 四、Flyway如何校验文件 五、使用Flyway 5.1 引入依赖 5.2 添加配置 5.2.1 SpringBoot配置 5.2.2 SpringMVC配置 5.3 脚本准备 六、使用Maven插件 七、特别说明 一、简单介绍 Flyway 是一款开源的数据库…

SpringBoot引入Flyway,及Flyway简单了解

Flyway 中的常用概念 Flyway 中的概念可查阅 官方文档&#xff0c;这里挑选一些重要的进行简单介绍。 Schema History Table Flyway 对数据库进行版本控制的方式&#xff0c;是在指定数据库中创建一张表&#xff0c;即 Schema History Table&#xff08;默认为 flyway_schem…

Flyway详解以及Springboot集成Flyway

Flayway是一款数据库版本控制管理工具&#xff0c;&#xff0c;支持数据库版本自动升级&#xff0c;Migrations可以写成sql脚本&#xff0c;也可以写在java代码里&#xff1b;不仅支持Command Line和java api &#xff0c;也支持Build构建工具和Spring boot&#xff0c;也可以在…

spring-cloud集成数据库版本迁移工具flyway

spring-cloud集成数据库版本迁移工具flyway Flyway实现数据库版本同步有两种方式&#xff0c;一种就是直接导包&#xff0c;通过配置文件使用&#xff0c;还有一种就是自定义的方式。一 、依赖配置文件 1 flyway实现sql初始化 1.1 首先需要添加依赖 <!--mysql数据库版本…

Flyway 数据库版本控制

背景 在我们日常产品发布的过程中&#xff0c;代码的版本控制可以使用git、svn工具实现。对于数据库每当发布时会出现手动执行sql脚本进行升级数据库&#xff0c;中间经常出现一些漏写、错写情况&#xff0c;对数据库的版本与代码的版本不匹配&#xff0c;导致上线后出现数据库…

FlyWay入门教程

文章目录 Flyway1. 概述2. 工作原理与基本概念工作原理概述基本概念**[Migration(迁移)](https://flywaydb.org/documentation/concepts/migrations#naming)** 3. 安装和基本使用命令行安装使用命令 Java APISpring Boot Flyway Flyway by Redgate • 数据库迁移变得简单。 ---…