基于SDN架构的VXLAN网络探索与实验研究
2022-04-21王飞
王飞
摘要:近年来,随着数据中心的不断发展,实现了数据中心计算和存储资源的虚拟化和按需分配,但网络虚拟化一直受各种因素的限制,SDN技术的出现,为有效整合现有数据中心网络资源提供很好的解决方式。本文通过软件仿真,对数据中心VXLAN的构建、openflow流表的下发机制进行实验和验证,实现了SDN网络集中规划管理、控制面和数据面分离、网络软件化和网络可编程等特性,为省级数据中心网络架构升级转型提供实践经验。
如今,数据中心计算和存储资源的虚拟化和按需分配,已基本满足各种软硬件资源池化和信息系统整合重构的要求,充分保障业务系统的连续性。但随着数据中心的不断发展壮大,网络资源的有效整合利用一直被各种因素制约和限制,值得关注。
一、数据中心网络资源利用存在的问题
(一)虚拟化环境下网络配置的复杂度极大提升
随着数据中心计算及存储资源不断虚拟化,形成多个虚拟网络共享底层物理网络资源的情况;一方面物理层的故障将会影响虚拟网络的可用性,导致网络服务中断;另一方面不同业务系统间虚拟网络的增加,安全策略的不同,也进一步增加了网络配置的复杂度,导致网络运维极其困难。
(二)虚拟化环境下大二层网络不断膨胀
在虚拟化环境下,网络虚拟机通过bridge方式接入,使得大二层网络节点不断增加;同时,为了实现虚拟机在不同物理服务器的自由迁移,将使得VLAN无法隔离广播域、大二层网络的不断膨胀。以上两种情况,导致整个数据中心被分割成相互独立的多个业务网络,极大限制了虚拟机迁移的范围和用户网络的扩展性;同时不断的网络冗余将带来广播包过多、交换机转发表溢出、生成树算法导致带宽利用率低等问题。
(三)多租户网络隔离难以很好的实现
在目前云计算环境下,由于各业务系统共用一套核心交换机、路由器、防火墙等设备,数据中心存在大二层互通的需求, 为了让大二层可以连通且区分不同租户,通常采用VLAN技术,其4k的理论数值远不能满足当前用户的需求。同时,在传统网络基础上,很难既满足云数据中心对IP地址、VLAN、安全等网络策略统一规划,又实现各系统间的有效隔离,并支持其个性化要求。
二、SDN技术与网络虚拟化
SDN(Software Defined Network)软件定义网络,是网络虚拟化的一种实现方式。SDN技术的核心技术OpenFlow通过将网络设备的控制面与数据面分离,从而实现集中管控和开放可编程,可实现灵活、快速、高效网络配置。
网络虚拟化则是云计算和SDN发展到一定阶段的产物。网络虚拟化简单来讲是指把逻辑网络从底层的物理网络分离开来。当前,网络虚拟化主要基于Overlay技术实现,Overlay是一种将(业务的)二层网络构架在(传统网络的)三层/四层报文中进行传递的网络技术。该技术实际上是一种隧道封装技术,主要有VXLAN、NVGRE、STT这三种技术。VXLAN是目前主流的Overlay技术,将二层报文封装到udp报文中,扩大二层网络的范围,将不同数据中心置于同一个大二层网络,满足多数据中心虚拟机迁移和多租户隔离的需求。
SDN集中控制管理的方式,非常适合用于管理VXLAN多租户、跨域的虚拟网络。本文通过实验,模拟利用SDN控制器实现对整个网络的统一管理、规划和控制,理解SDN控制平面和转发平面分离的模式与openflow协议,检验网络软件化和网络可编程化,进一步掌握SDN的openflow和VXLAN技术原理,为省级数据中心网络架构升级转型提供实践经验。
三、基于SDN架构的VXLAN网络实验探索
本文采用虚拟环境模拟两个数据中心(DC)和SDN控制器,实现两个数据中心之间VXLAN隧道的建立,不同数据中心同一租户主机通过VXLAN实现基于三层网络的二层连接,并隔离不同的租户;通过SDN控制器下发网络的VXLAN配置和open vswitch(ovs)的openflow流表,利用流表项控制数据的转发。
(一)总体规划
实验采用三台虚拟机,两台模拟数据中心(dc1、dc2),使用mininet构建网络拓扑,每个dc包括一台ovs交换机和两台主机,两台主机分属不同的租户;第三台虚拟机安装OpenDaylight(odl)做为SDN控制器。三台虚拟机分别安装于不同的物理机,为模拟真实的网络环境,通过路由器实现虚拟机之间三层网络连通。
(二)实现步骤
1.构建网络拓扑。启动三台虚拟机,测试虚拟机之间的网络连通性,三台虚拟机分属不同的网段,通过路由器实现三层互联,拓扑采用Python代码预先定义,通过Mininet调用来构建。数据中心一(dc1)的拓扑定义文件(dc1.py)主要配置内容如下:
#添加主机和交换机
leftHost=self.addHost('hosta1',ip="192.168.200.1/24",mac="00:00:00:00:aa:01")
rightHost=self.addHost('hostb1',ip="192.168.200.3/24",mac="00:00:00:00:bb:01")
leftSwitch = self.addSwitch( 's1' )
# 增加連接
self.addLink( leftHost, leftSwitch )
self.addLink( rightHost, leftSwitch )
#在dc1虚拟机操作系统命令行输入以下命令:
sudo mn --custom dc1.py --topo mytopo
--controller=remote,ip=10.160.141.35,protocols=OpenFlow13
dc1的网络拓扑构建完成后,按同样方法构建dc2网络,dc2.py的对应参数根据网络地址规划做相应调整。
启动控制器,安装必要的组件(feature):
$> feature:install odl-l2switch-all odl-restconf-all odl-nsf-all odl-mdsal-apidocs
$> feature:install odl-ovsdb-southbound-impl odl-ovsdb-southbound-impl-rest odl-openflowplugin-all-li
将ovs openflow版本设为1.3并将交换机设为被动监听控制器模式,在dc1和dc2上mininet提示符下执行:
mininet> sh ovs-vsctl set bridge s1 protocols=OpenFlow13
mininet> sh ovs-vsctl set-manager ptcp:6640
2.配置VXLAN隧道。采用SDN集中控制的理念,利用odl的restconf南向API接口,通过控制器ovsdb模块实现VXLAN的配置,配置命令如下:
#将vswitch注册到odl:
http请求方法:PUT;
URL:http://10.160.141.35:8181/restconf/config/network-topology:network-topology/topology/ovsdb:1
#請求body json使用ODL的YANG UI构造,主要参数:
"topology-id": "ovsdb:1",
"node-id": "mininet1",
"remote-ip": "192.168.101.1",
"remote-port": "6640"
#创建VXLan隧道:
http请求方法:PUT;
URL:http://10.160.141.35:8181/restconf/config/network-topology:network-topology/topology/ovsdb:1/node/mininet1%2Fbridge%2Fs1/termination-point/vxlanport
#请求body json使用ODL的YANG UI构造,主要参数:
"tp-id": "vxlanport",
"ovsdb:name": "vxlanport",
"ovsdb:interface-type": "ovsdb:interface-type-vxlan",
"option": "key",
"option": "remote_ip",
"ovsdb:ofport": "10",
"ovsdb:ofport_request": "10"
以上是针对dc1的配置,dc2的配置应修改相应的参数值。在mininet命令行执行以下命令,检查vtep是否添加成功:
mininet> sh ovs-vsctl -- --columns=name,ofport list Interface
3.下发openflow流表。上述步骤完成后,基于三层网络的overlay已搭建完成,但此时ovs交换机中还没有流表项,需要控制器下发流表才能完成数据的转发。在下发流表前进行ping测试,实验中4台host互不连通。实验中主要用到流表的匹配字段(match)和指令(instruction)字段,匹配字段类似acl,根据数据包入端口和包头信息匹配符合条件的数据包,并按指令处理、转发、丢弃、设置值或转到下一流表。交换机S1流表项设计如下:
table=0,in_port=1,actions=set_field:100->tun_id,resubmit(,1)
table=0,in_port=2,actions=set_field:200->tun_id,resubmit(,1)
table=0,actions=resubmit(,1)
table=1,tun_id=100,dl_dst=00:00:00:00:aa:01,actions=output:1
table=1,tun_id=200,dl_dst=00:00:00:00:bb:01,actions=output:2
table=1,tun_id=100,dl_dst=00:00:00:00:aa:02,actions=output:10
table=1,tun_id=200,dl_dst=00:00:00:00:bb:02,actions=output:10
table=1,tun_id=100,arp,nw_dst=192.168.200.1,actions=output:1
table=1,tun_id=200,arp,nw_dst=192.168.200.3,actions=output:2
table=1,tun_id=100,arp,nw_dst=192.168.200.2,actions=output:10
table=1,tun_id=200,arp,nw_dst=192.168.200.4,actions=output:10
table=1,priority=10,actions=drop
流表table0根据入端口为数据包设置不同的VNI,并跳转到流表table1;流表table1根据VNI、目的MAC地址决定数据包转发的出端口;对于arp请求,根据VNI和目的IP地址决定数据包转发的出端口。dc2的交换机S2流表根据实际的mac和ip作相应调整。
将以上流表内容保存到名为flows的文本文件,可在mininet下用下述命令下发流表到交换机:
mininet> sh ovs-ofctl add-flows –O openflow13 s1 'flows'
为验证odl流表下发功能,我们使用odl的restconf API,通过控制器来完成流表下发,以第一条流表为例:
http请求方法:PUT;
URL:http://10.160.141.35:8181/restconf/config/opendaylight-inventory:nodes/node/openflow:1/flow-node-inventory:table/0/flow/1
Json请求body:略
流表需要转换为符合API要求的json请求body,可通过odl的YANG ui界面,输入流表项参数后逐条生成,共12条。API调用可使用多种方法实现,如在命令行使用curl命令、使用odl的YANG ui界面、Chrome浏览器安装postman插件、使用编程调用API等。使用用前三种方法,每次只能下发一条流表规则;使用编程调用API,则可实现批量下发,这也體现了SDN网络可编程控制的特点。
在mininet命令行执行以下命令,检查流表是否下发成功:
Mininet> sh ovs-ofctl dump-flows -O openflow13 s1
4.连通测试。测试dc1与dc2同一租户主机网络连通性:
mininet> hosta1 ping 192.168.200.2
PING 192.168.200.2 (192.168.200.2) 56(84) bytes of data.
64 bytes from 192.168.200.2: icmp_seq=1 ttl=64 time=3.55 ms
mininet> hostb1 ping 192.168.200.4
PING 192.168.200.4 (192.168.200.4) 56(84) bytes of data.
64 bytes from 192.168.200.4: icmp_seq=1 ttl=64 time=3.08 ms
测试不同租户主机网络连通性:
mininet> hosta1 ping 192.168.200.4
PING 192.168.200.4 (192.168.200.4) 56(84) bytes of data.
From 192.168.200.1 icmp_seq=1 Destination Host Unreachable
mininet> hostb1 ping 192.168.200.2
PING 192.168.200.2 (192.168.200.2) 56(84) bytes of data.
From 192.168.200.3 icmp_seq=1 Destination Host Unreachable
主机则被隔离,达到了实验预期的目标。
验证分析:由于VXLAN是L2 over L4的封装,以udp报文传输,因此仅抓取dc1(192.168.101.1)与dc2(192.168.102.1)之间往来的udp数据包,对实验结果(如图2)进行验证和分析。
从192.168.101.1到192.168.102.1的udp数据包,目的端口已显示为VXLAN,将其数据载荷部分(data)按VXLAN解码(如图3):
data部分被解析为VXLAN数据包,VNI值为100,是租户A两台主机之间的icmp报文。租户B主机的报文显示VNI值为200,源地址为192.168.200.3,目的地址为192.168.200.4(如图4)。
分析可知,数据包进入交换机后,按流表规则加上VNI,并发送到vtep;vtep被封装成udp报文,通过传统三层网络发送到对端vtep,去除udp报头后按流表规则发送到目的端口。对于同租户的两台主机,虽然位于两个数据中心,但处于同一个虚拟的大二层,其连接是透明的,可以直接互通。
四、小结
通过模拟省级人民银行真实网络环境,旨在对相关原理和技术有更深入的理解和更直观的认识,为省级数据中心网络架构升级转型提供实践经验。
通过实验,探索了openflow流表的设计应用,加深了对openflow规范的理解;VXLAN的构建、openflow流表的下发均由控制器完成,从而将控制面和数据面分离在不同的设备中,使OpenFlow 控制器可同时控制多台OpenFlow交换机。实践了SDN网络集中规划管理、控制面和数据转发面分离、网络软件化和网络可编程等特性。下一步将依托实验结果,探索双活技术的实现,将省级数据中心主中心双活的两台存储之一迁移至同城转接中心,将两数据中心系统融合为一个统一的虚拟化集群,实现两中心应用级高可用。
参考文献:
[1] 魏娜,基于SDN和VXLAN相结合的数据中心构建.科技创新导报.2019年9期
[2] 王颖,庞志鹏,基于SDN的云数据中心网络[J].通讯世界,2017(16): 3-4.
[3] 陈锐,谢人超,黄韬,等.基于SDN的CDN技术研究[J].电信技术,2014,(6).18-21.
[4] 卢志刚,姜政伟,刘宝旭.一种基于VXLAN的虚拟网络访问控制方法[J].计算机工程,2014,(8).86-90,95.doi:10.3969/j.issn.1000-3428.2014.08.016.
作者单位:中国人民银行天门市支行