云数据中心最基础的网络产品是VPC(VirtualPrivateCloud)。简单理解就是三层路由+若干个可定制IP地址的网络。一个VPC可以有多个子网,同一个子网内二层互通,不同子网之间三层互通。用户在云数据中心订购VPC产品时,类似于购买一台路由器和几台二层交换机连接服务器。分析传统网络中的网络功能通常同时从控制平面和数据转发平面入手。在传统的网络控制平面中,第二层是生成树协议,转发的基础是mac地址表;第三层是路由协议,转发的基础是路由表。数据包根据网络设备中的mac表和路由表进行转发。为了方便大家理解,我们也从控制和转发两个方面来分析VPC产品在SDN云数据中心的实现。在SDN控制平面上,比较常见的控制转发依据是openflow流表;数据转发平面为vxlan协议封装。下面我们来分析一下SDN云数据中心网络设备的流表是如何指导数据包转发和vlan/vxlan封装过程的,从而更好地理解SDN技术的原理。一、必须掌握的基础知识1、对流表的理解能力OpenFlow流表是SDN云数据中心转发常用的基础。要了解控制和转发机制,首先要有阅读流表的能力。一个流表由许多流表项组成,每个流表项就是一条转发规则。每个流表项由六部分组成:匹配字段、优先级、计数器、指令、超时时间和cookie。流表项中的两个关键内容是匹配字段和指令。匹配字段包括inport、报文的十二元组信息等。指令用于描述OpenFlow的处理,修改报文的动作集或触发流表的流水线处理。流表的匹配原则是“table0—table255”,先从table0开始匹配。同一张表按照优先级进行匹配,优先级高的优先匹配。需要特别说明的是,不同业务方案的流表格式存在一定差异,但本质上是相同的。掌握流表的六大要素和流表匹配的原则,就可以阅读和理解不同厂家的流表。以商业方案的两个流表项为例说明如下流表的含义:cookie=0x2000208,duration=231310.205s,table=160,n_packets=2879,n_bytes=282142,idle_age=0,hard_age=65534,优先级=90,ip,dl_dst=fa:16:3f:00:02:d1,nw_dst=192.168.1.4actions=mod_dl_dst:fa:16:3e:54:db:6a,mod_dl_src:fa:16:3e:2c:f0:e3,strip_vlan,output:3这是table160中一个优先级为90的流表项的内容,其匹配项为“IP数据包,目的MAC地址为fa:16:3f:00:02:d1,目的IP地址为192.168.1.4”,如果数据包的包头与流表中的匹配项完全匹配,则执行如下操作“将数据包的目的MAC地址修改为fa:16:3e:54:db:6a,修改sourceMAC地址为fa:16:3e:2c:f0:e3,去掉vlan标签,从交换机的3号端口转发数据包”。cookie=0x2000205,duration=168409.329s,table=200,n_packets=93326,n_bytes=23319603,idle_age=117,hard_age=65534,priority=90,dl_vlan=6,dl_dst=d4:94:e8:5b:4e:01,actions=strip_vlan,set_tunnel:0x4e5c(20060),load:0xa0005f5(10.0.5.245)->NXM_NX_TUN_IPV4_SRC[],load:0xa00032d(10.0.3.45)->NXM_NX_TUN_IPV4_DST[],output0:2这是表的优先级2流表项内容为90,其匹配项为“vlanid为6,目的MAC地址为d4:94:e8:5b:4e:01”。如果数据包的包头与流表匹配项完全匹配,则执行以下操作:“剥离vlan标签,将数据包封装到一个vxlan隧道中,vni为20060,隧道的源IP地址为10.0.5.245,隧道的目的IP地址为10.0.3.45,从交换机的端口2转发数据包”。下面给出常用的匹配字段和动作,供参考。2、具备对vxlan数据包的理解能力在网络运维中,经常会使用wireshark软件对数据包进行抓包分析,从而进一步分析网络转发平面的运行机制。SDN云数据中心的数据平面会用到vxlan隧道封装技术,因此需要了解vxlan数据封装格式,能够通过抓取的vxlan数据包进行网络分析。下面是来自wireshark的vlan数据包示例。这是一个ICMP(ping)数据包。Ethernet是以太网封装,src是源mac地址,dst是目的mac地址。互联网是IP层封装,src是源IP地址,dst是目的IP。让我们看一个vxlan数据包的wireshark示例。这也是一个ICMP(ping)包,比vlan包多了一层数据封装。.Vxlan隧道的源IP地址为10.0.3.45,目的IP地址为10.0.5.169,隧道的VNI标识为20022。原始数据包的源IP地址为114.114.114.114,目的IP地址为192.168.1.4。二、控制与转发的联动分析物理服务器上的虚拟交换机是SDN云数据中心中比较常用的网络设备。需要特别说明的是,在不同的商业方案中,流表内容和用户流量/vxlan映射关系存在一定差异。下面以商用虚拟交换机的流表和数据包为例,分析vpc产品的技术实现。1.同一子网虚拟机的流量交换:(1)控制平面:分别查看PM1和PM2虚拟交换机的流量表。PM1的虚拟交换机有如下流表:skb_priority(0),in_port(5),eth(src=fa:16:3e:79:b7:62,dst=fa:16:3e:eb:2b:1e),eth_type(0x0800),ipv4(src=192.168.1.3/255.255.255.255,dst=192.168.1.5/255.255.255.255,proto=1/0xff,tos=0/0x3,ttl=64/0,frag=no/0xff),数据包:7,字节:686,已用:0.883s,操作:设置(隧道(隧道(tun_id=0x31b3f5(3257333),src=0.0.0.0,dst=10.0.4.84,tos=0x0,ttl=64,flags(key))),6这个流表的含义是:流表的匹配域是“数据包来自虚拟交换机的5端口,源MAC地址(src=fa:16:3e:79:b7:62),目的mac地址(dst=fa:16:3e:eb:2b:1e),源IP地址(192.168.1.3),目的IP地址(192.168.1.5)",如果数据包完全匹配,执行的命令是“将数据包封装到VNI为3257333的vxlan隧道中,vxlan隧道的源IP为自己,目的IP为10.0.4.84,转发从端口6"。PM2的虚拟交换机有如下流表:skb_priority(0),tunnel(tun_id=0x31b3f5(3257333)/0xffffffffffffffff,src=10.0.4.119/255.255.255.255.255,dst=10.0.4.84/255.255.255.255,tos=0/0xff,ttl=64/0xff,flags(key)),in_port(6),skb_mark(0),eth(src=fa:16:3e:79:b7:62,dst=fa:16:3e:eb:2b:1e),eth_type(0x0800),ipv4(src=192.168.1.3/255.255.255.255,dst=192.168.1.5/255.255.255.255,proto=1/0xff,tos=0/0,ttl=64/0,frag=no/0xff),packets:30,bytes:2940,used:0.335s,actions:5这个流表的含义是:流表的匹配域是“vxlan数据包的VNI是3257333,vxlan源IP地址(10.0.4.119),vxlan目的IP地址(10.0.4.84),来自OVS端口6的数据包,原始数据包的源MAC地址(src=fa:16:3e:79:b7:62),目的mac地址(dst=fa:16:3e:eb:2b:1e),源IP地址(192.168.1.3),目的IP地址(192.168.1.5)",如果数据包完全匹配,命令被执行的是“解压数据包,一个d从端口5"转发出去。(2)转发平面:分别在PM1和PM2上OVS的tap1和bond1端口进行抓包分析,分析“数据包经过虚拟交换机后发生了哪些变化”。PM1的tap1的报文格式如下,为vlan格式:PM1的bond1的报文格式如下,为vxlan格式:PM2的bond1的报文格式如下,为vxlan格式:PM2的tap1格式如下,为vlan格式:通过分析以上四个节点的数据包,可以得到:PM1的虚拟交换机对来自VM1的数据包进行了vxlan隧道封装,VNI标识符是3257333。在underlay交换机上,数据包的转发是根据vxlan的隧道IP地址完成的,封装在隧道中的VM数据包内容处于无感知状态。PM2的虚拟交换机是对应完成的vxlan数据包的解封装过程,将数据包发送给VM2。2.跨子网虚拟机流量访问跨子网通信的控制转发联动原理,同一个子网的网络场景是一样的,只是流表的内容有些区别。跨子网的流量交互涉及网关关联处理,有原始数据包的MAC地址转换,vxlan隧道封装的VNI也会不同。以PM1的发送端为例,分析如下。PM1上的流表:skb_priority(0),in_port(21),eth(src=fa:16:3e:79:b7:62,dst=68:54:ed:00:00:36),eth_type(0x0800),ipv4(src=192.168.1.3,dst=192.168.8.74,proto=1,tos=0,ttl=64,frag=no),packets:277,bytes:27146,used:0.594s,actions:set(隧道(tun_id=0x389b3a(3709754),src=0.0.0.0,dst=10.0.4.129,tos=0x0,ttl=64,flags(key)),set(eth(src=68:54:ed:00:00:0c,dst=fa:16:3e:fc:4c:1f)),set(ipv4(src=192.168.1.3,dst=192.168.8.74,proto=1,tos=0,ttl=63,frag=no)),6这个流表的含义是:流表的匹配字段是“数据包来自虚拟交换机的21端口,源MAC地址(src=fa:16:3e:79:b7:62)、目的mac地址(dst=68:54:ed:00:00:36)、源IP地址(192.168.1.3)、目的IP地址(192.168.8.74)”,如果数据包完全匹配,则要执行的命令是“将数据包封装成vxlan隧道,VNI为3709754,vxlan隧道的源IP为自己,目的IP为10.0.4.129,并且原始数据包的源地址修改为(src=68:54:ed:00:00:0c),目的MAC地址为(fa:16:3e:fc:4c:1f),***为从端口6"转发。PM1上bond1的数据包:从抓包可以看出,VM1的数据包经过虚拟交换机后被封装成一个vni为3709754的vxlan数据包,与flow的actionset一致桌子。3、分析从前面的流表分析可以看出,承载业务的虚拟交换机不再依赖于传统的MAC表或路由表,而是根据SDN下发的精细流表完成数据包转发控制器。这就对控制器的性能和业务编排能力提出了更高的要求。从前面的数据包封装可以看出,数据中心业务域网络中出现underlay和overlay两种网络。vxlan数据包在underlay设备之间交换。租户虚拟机流量封装在vxlan数据包中,底层设备不可见。不同vxlan隧道的数据流量隔离,满足云数据中心租户隔离要求,允许IP地址冲突。
