《实战录》导语
云端卫士的新栏目《实战录》将会定期分享一些我们的工程师伙伴们在产品研发的过程中总结的实践经验,希望对于热爱技术且关注安全领域的受众有所裨益。本期分享人为云端卫士安全能力工程师刘小龙,将带来SDN controller Ryu的分享。
什么是SDN
随着云计算、大数据等业务的兴起,对网络的改造需求越来越迫切,底层网络资源如何能更好的为上层业务及应用服务,做到资源的灵活调度和按需交付至关重要。那么,SDN这样新型的网络架构就应运而生。
SDN(Software Defined Networking,软件定义网络)是一种新型的基于软件的网络架构及技术,其最大的特点在于松耦合的控制平面和数据平面,支持集中化的网络状态控制,实现底层网络设施对上层应用的透明。它具有灵活的软件编程能力,使得网络的自动化管理和控制能力获得了空前的提升,能够有效的解决当前网络系统所面临的资源规模扩展有限、组网灵活性差、难以快速满足业务需求等问题。
SDN具有三大特性:集中控制、开放接口、网络虚拟化。在SDN架构中包含应用层、控制层、转发层。其中控制层尤为重要,SDN控制器由于人的大脑一样,进行总体管控。
什么是Ryu
在当今市场,SDN控制器五花八门,各种各样。不同的控制器有不同的优点和特性。其中Open daylight、ONOS、Floodlight、ryu等控制器比较典型,被业界广泛应用。
尤其是Ryu因其架构简单,部署方便,便于扩展得以广泛应用,尤其适用于中小型网络架构的流量调度和控制。
Ryu是日本NTT公司主导开发的开源项目,其字面意思是日语中“Flow”的意思。Ryu调度目标是提供一个拥有逻辑上集中控制能力的SDN操作系统,该系统具有设计完备的API接口,使网络应用者能够便捷的创建新的管理和控制应用。Ryu用python语言编写,完全遵守Apache许可证,能够支持v1.0、v1.2、v1.3等多个版本的openflow协议。
Ryu控制器中包含了大量的库函数和组件供SDN的应用的开发。其中库函数是Ryu针对SDN控制器需求抽取的一些共性功能。这些库函数可以在组件中被直接调用,而组件之间的关系是相互独立的。Ryu提供的库函数和组件如下图:
Netconf、OF-conf、Sflow等库函数主要实现对Openflow 交换机的控制功能。在几个重要的组件中,OF-wire主要实现对openflow不同协议版本的支持,Topology主要实现对拓扑图构建,已经链路状态的跟踪,OF REST主要提供REST API 共用户配置openflow 交换机。VRRP组件用于在openflow交换机上添加VRRP能力,有效的改善网络的可靠性。另外可以和openstack云计算平台整合,使用户可以按需调度和使用控制其网络。
Ryu架构
1 总体框架
Ryu SDN framework主要提供控制能力,通过北向接口的Rest API为SDN apps提供服务,供SDN apps调度和控制流量和网络。通过南向接口的Openflow等协议控制openflow交换机,完成流量交互。其中Ryu SDN framework起到了承上启下的作用,是那北向接口的控制和交换中枢。
下图是对上图的每层结构包含内容的细化。
2 框架细化
SDN apps
该层大致分为三类,第一类是oprator,通过RESTful management进行对SDN frame work进行控制和管理。第二类是OpenStack cloud or chestration,通过REST API for Quantum进行和openstack结合,进行网络的管理和控制。第三类是User apps,通过User-defined API via REST or RPC进行对SDN framework的控制和管理。
Ryu SDN framework
这一层是Ryu框架层,主要包含OF REST,topology, discovery,filewall等组件。主要用于SDN控制器的核心功能实现,包含流表下发,拓扑发现等功能。
OpenFlow switch
这一层主要包含支持openflow协议的交换机,包含软件交换机和物理交换机,软件交换机包括ovs等。硬件交换机包括盛科SDN交换机等。
3 工作流程
上图是对Ryu工作过程的详细描述:
RYU APPS 是上层APP应用,通过SERVICE_BRICK(python中字典结构)进行事件的分发和传递。
SERVICE_BRICK是通过RYU APPS注册到其中的响应事件的回调函数进行事件的路由,分发任务。
OFPHandler 是RyuAPP一个最基础的子类,该类主要完成hello handler,switch features handler,port state handler,echo handler等openflow协议的协商工作。
OFPHandler会实例化一个OpenflowController一个对象,该对象有几个交换机相连就实例化几个Datapath对象,一个Datapath对应于一个Openflow switch。
Datapath通过python高并发框架eventlet中的stream sever创建socket于openflow交换机进行通信。
环境搭建
1 环境拓扑
Ryu做为控制器,OVS做为交换机,Ryu控制器控制两个OVS交换机。
Ryu通过6653端口和OVS进行连接。
每个OVS连接了2个HOST。
2 OVS 部署
2.1 源码下载
Openvswitch包下载地址:
http://openvswitch.org/download/
命令:wget
http://openvswitch.org/releases/openvswitch-2.5.0.tar.gz
主要用来解压缩包,为安装提供先天条件。
命令行:tar -xvf openvswitch-2.5.0.tar.gz
2.2 解压安装
命令行:
cd openvswitch-2.5.0/
./configure --with-linux=/lib/modules/`uname -r`/build
make && make install
Insmod datapath/linux/openvswitch.ko
说明:
在insmod 内核模块的时候,可以提示insmod内核模块失败,失败的原因如下:
通过查看modinfo信息,可以知道openvswitch.ko
依赖nf_conntrack,nf_defrag_ipv6,libcrc32c,gre,nf_defrag_ipv4,需要把这些模块insmod后,才能insmod openvswitch.ko模块。
2.3 配置文件
OVS安装成功,如果要使用ovs,必须配置ovs的数据库文件。
命令:
mkdir -p /usr/local/etc/openvswitch
ovsdb-tool create
/usr/local/etc/openvswitch/conf.db
/usr/local/share/openvswitch/vswitch.ovsschema
2.4 启动数据库
命令行:
# ovsdb-server
--remote=punix:/usr/local/var/run/openvswitch/db.sock
--remote=db:Open_vSwitch,Open_vSwitch,manager_options
--private-key=db:Open_vSwitch,SSL,private_key
--certificate=db:Open_vSwitch,SSL,certificate
--bootstrap-ca-cert=db:Open_vSwitch,SSL,ca_cert --pidfile --detach
说明:
-- remote=punix:/usr/local/var/run/openvswitch/db.sock
表示指定一个锁文件
-- remote=db:Open_vSwitch,Open_vSwitch,manager_options
表示指定数据库类型和表
-- private-key=db:Open_vSwitch,SSL,private_key
表示使用ssl进行安全连接
-- certificate=db:Open_vSwitch,SSL,certificate
表示指定openssl的证书
-- bootstrap-ca-cert=db:Open_vSwitch,SSL,ca_cert
表示指定ca证书
-- pidfile
表示创建pid 文件
-- detach
表示后台运行
通过ps命令查看是否启动成功:
2.5 数据库初始化
命令行:# ovs-vsctl --no-wait init
说明:
初始化一次就行
2.6 OVS deamon启动
命令行: # ovs-vswitchd --pidfile --detach
通过ps命令查看是否成功启动:
2.7 OVS创建网桥
OVS安装运行后,需要创建网桥,才能进行工作。
命令行:ovs-vsctl add-br br0
查看网桥信息:
3 docker 部署
3.1 安装docker
命令行:yum install docker
执行上述命令后,发现报如下错误:
然后执行如下命令:yum remove
lvm2-7:2.02.105-14.el7.x86_64
接着再次执行:yum install docker
3.2 启动docker服务
命令行:
systemctl start docker.service
systemctl enable docker.service
3.3 下载镜像到本地
命令行: docker pull centos
3.4 创建docker
命令行: docker run -i -t centos /bin/bash
由于进入创建的docker下载的官方centos7镜像不包含ifconfig、netstat等工具,需要进行下载:
命令行:yum install net-tools.x86_64(在docker中执行)
可以通过保存这个镜像到本地。
3.5 修改本地镜像
命令行:docker commit -m "centos 添加net工具" c2beb728796d centos/net
3.6 网络设置
创建无网络类型的docker 0
命令行:docker run --net=none --privileged=true -i -t centos/net
为容器添加网卡eth0
命令行:ovs-docker add-port br0 eth0 851ea099e0c0
为eth0网卡配置IP
命令行: ifconfig eth0 172.16.1.1/24
创建无网络类型的docker 1
命令行:docker run --net=none --privileged=true -i -t centos/net
为容器添加网卡eth1
命令行:ovs-docker add-port br0 eth1 0c6ef7091e77
为eth1网卡配置IP
命令行: ifconfig eth1 172.16.1.2/24
测试docker 0和docker 1的连通性
查看ovs网桥的端口情况
命令行:ovs-vsctl show
Ens3网口加入网桥
命令行: ovs-vsctl add-port br0 ens3
配置网桥的IP和路由
命令行:
ifconfig ens3 0.0.0.0
ifconfig br0 192.168.6.240/24
route add -net 0.0.0.0/0 gw 192.168.6.1 dev br0
连接控制器Ryu
命令行: ovs-vsctl set-controller br0 tcp:192.168.6.246:6653
4 Ryu部署
4.1 源码下载
?
命令行: git clone
git://github.com/osrg/ryu.git
4.2 安装依赖包
命令行:
pip install python-eventlet
pip install python-routes
pip install python-webob
pip install python-paramiko
cd ryu
sudo pip install -r tools/pip-requires
4.3 安装Ryu
命令行:python setup.py install
运行app
通过运行app目录下的simple_switch.py,主要用于二层交换, 实现二层交换功能。
命令行:ryu-manager simple_switch.py --verbose
运行后,通过docker host1 可以ping通docker host2
原因是因为运行了二层交换功能的app,实现二层交换。
如果ryu运行不加载二层交换app,运行后,通过docker host1 不能ping同docker host2。
总结
Ryu的结构简洁,层次分明。由于时间问题,还没有进行更多场景的app测试和性能测试,有机会后面会有更详尽的补充。
通过上面的描述,可见可以通过Ryu搭建自己的SDN 控制器,通过编写自己的app来满足自己特定的需求。但是Ryu也有自己的缺点,主要表现在对集群不支持,没有支持多级流表等方面。