简介

根据SDN的实现深度,可将其分为狭义SDN与广义SDN。其中,狭义SDN是指基于OpenFlow协议,将转发面和控制面完全分离的革命性SDN。广义SDN是指数据包转发依然基于现有设备上的协议,但将网络的部分控制功能上移到控制端,是一种既能利用现有网络设备,又能获取SDN部分优点的演进型SDN。


广义SDN因其高效、颠覆性,受到学术界及创业公司的关注。而对于传统设备厂商和运营商来说,不太可能短时间内,大范围地将现有设备替换为OpenFlow设备。因此,对于传统运营商来说,演进型SDN的研究部署同样迫切。


中国科技网是由中科院计算机网络中心负责运营的,学术性、非盈利性互联网基础设施。在全国部署上百个骨干、接入节点,同时拥有多条通往美国、日本和韩国等国际出口,是中国主要的互联网运营商之一。


科技网中网络设备的提供厂商较多,比如Cisco、Juniper、华为和华三。当前用独立分散的方式对网络设备进行管理,比如,当路由器执行新的防火墙或路由规则时,需要SSH登陆路由器进行手动配置。网络设备多而杂,这样的人工配置方式耗费人力,且易出错。利用广义SDN的思想,对网络设备进行统一自动管理是科技网在自动化运维方面的尝试。


目前,我们基于ONOS控制器进行二次开发,对juniper测试路由器进行集中控制,执行防火墙限速等功能。ONOS中主要通过NETCONF协议远程读取、修改网络设备配置,所以我们也基于NETCONF协议来实现对Juniper路由器的管理。主要工作分为如下几部分。


1 在ONOS中开发juniper路由器的简单driver,链接路由器。

2 进一步在driver中添加所需功能,比如实现XML文件解析,利用NETCONF协议下发相关XML文件,执行基本配置读改、设置防火墙限速等动作。

3 在命令行下发模块(cli)中,开发新的执行命令,使得用户可在命令行中执行2的动作。

4 由三台juniper测试路由器,组成测试demo,验证相关功能。


相关实现代码已开源:https://github.com/CNICCSTNET/OpenJuniperDriver

下面对上诉工作进行详细介绍。



前期准备


ONOS中基于NETCONF协议对路由器配置进行远程控制,由于之前对NETCONF协议不太熟悉,首先学习了NETCONF协议,并用分别用NETCONF协议的Python函数库(ncclient),和juniper的NETCONF Java Toolkit实现了简单读取和修改路由器配置的小程序。升级路由器,使其支持NETCONF协议。同时学习juniper路由器的配置命令,弄清实现不同命令时NETCONF协议下发的XML文件。 相关的学习链接如下:

NETCONF RFC6241:https://tools.ietf.org/html/rfc6241


ncclient:https://pypi.python.org/pypi/ncclient


NETCONF Java Toolkit:http://www.juniper.net/techpubs/en_US/junos14.2/information-products/pathway-pages/netconf-java-toolkit/netconf-java-toolkit.html#overview



一 、Driver初步实现,链接路由器

1.1 新建juniper APP


ONOS需要不同的Driver来对不同设备厂商的设备进行控制,在ONOS中开发driver的步骤跟实现一个普通APP的过程相识。具体可参见ONOS的wiki或者毛健炜同学的博客:

https://wiki.onosproject.org/display/ONOS/Creating+and+deploying+an+ONOS+application


http://maojianwei.github.io/2015/11/24/ONOS-in-Practice-for-Share-one-Project-Set-up-Debug-Hot-Deployment/



1.2 修改pom.xml等文件


建好名字为juniper的APP后,将其移动到onos/drivers/目录下,并修改onos/drivers/juniper目录下的pom.xml文件:

ONOS中Juniper路由器Driver开发简介_java

同时修改onos/drivers/下的pom.xml文件,添加juniper module,使得编译drivers模块时,也编译juniper的driver:

ONOS中Juniper路由器Driver开发简介_java_02

在drivers/juniper/src/ 目录下,新建resources文件夹,并新建一个juniper-drivers.xml文件,用于存储juniper驱动的相关调用关系。目前是空的,在后面实现具体修改路由器配置时,可添加ONOS中api接口和具体实现的对应关系。

ONOS中Juniper路由器Driver开发简介_java_03

新生成一个导入juniper-drivers.xml文件的java文件JuniperDriverLoader.java,放在onos/drivers/juniper目录下:

ONOS中Juniper路由器Driver开发简介_java_04


1.3 编译并启动drivers


在drivers目录下,执行mvn clean install编译后,重启ONOS。执行如下命令,启动相关的drivers APP:

ONOS中Juniper路由器Driver开发简介_java_05

若APP启动成功,则执行drivers命令。可以看到我们的juniper 及 NETCONF的driver都启动成功:

ONOS中Juniper路由器Driver开发简介_java_06

ONOS中Juniper路由器Driver开发简介_java_07


1.4 链接路由器


在tools/test/configs目录下,生成netconf-cfg-juniper.json文件,作为链接juniper路由器时的读入文件。此文件定义了接入设备的名称,调用的driver,及用于NETCONF协议登陆的用户名和密码,路由器的IP和通信端口号。其中,830是NETCONF协议的固定通信端口号。

ONOS中Juniper路由器Driver开发简介_java_08

我们的juniper driver继承了NETCONF driver,调用NETCONF协议(onos/protocols/netconf)中的方法实现和路由器的通信。ONOS为利用NETCONF driver,链接远程路由器实现了相关命令onos-netcfg。我们也可以通过此命令,将juniper路由器和ONOS中的juniper driver相链。

ONOS中Juniper路由器Driver开发简介_java_09

ONOS中NETCONF相关的wiki链接:https://wiki.onosproject.org/display/ONOS/NETCONF

链接路由器成功后,在ONOS中执行devices命令,可查看到此路由器已经通过NETCONF协议和控制器相连。

ONOS中Juniper路由器Driver开发简介_java_10

至此,我们juniper的driver开发已初步完成,通过此driver,成功将路由器和ONOS控制器链接。下面我们将在此driver上,增加用于解析NETCONF协议中XML文件的类,并通过下发相关XML文件,实现读取并修改juniper路由器的功能。