前言
由于现在所做的产品功能NETCONF是基础,每次DEVICE 不在线,就会重新了解一遍 netconf过程,以便查找原因。今儿总算抽个时间整理一下了。
基于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
NETCONF Call Home支持两种安全传输网络配置协议分别是Secure Shell(SSH)和传输层安全(TLS)。
NETCONF协议的绑定到SSH在RFC6242中定义。 NETCONF协议的绑定到TLS在RFC7589中定义。 SSH协议在RFC4253中定义,TLS协议是在RFC5246中定义。SSH和TLS协议都是TCP协议之上的协议。
流程如下:
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后,只要保证控制器在公网就行了。