定义
SDN全称为Software Defined Network,软件定义网络。在云计算中,让网络实现多种功能,包括:软件编排、开放API、构建云平台租户组网、支持云原生。使整个计算网络垂直开放,能够有效解决网络资源规模扩展受限、组网灵活性差的问题。
应用场景
租户网络tenant network
不同租户间的资源相互隔离,每个租户独享私有网络,一个租户可以在自己的私有网络内创建多个子网。租户可以创建虚拟路由器vrouter,将虚拟网络virtual network和外部网络external network连接起来。
跨数据中心网络
在传统大二层网络中,采用SDN技术,可以将分布在不同数据中心的资源,跨中心整合在同一个网络内。多用于跨数据中心业务容灾,或用于跨数据中心灵活调配资源。
网络虚拟化
通过SDN的可编程方式,可以在很短的时间内,实现交换机、路由器、防火墙、QoS、负载均衡等网络设备的整合。
平面划分
把行驶路线作为对比:由于乘客只关心目的站点的到达,所以只需记住乘坐某某交通工具即可,不关心具体路线、交通状况等其他因素。城市的公路、辅路、高架桥等基础设施为underlay网络;公交车的具体行驶路线为overlay网络。
underlay网络
物理网络,由交换机、路由器等设备组成,负责传递数据包,使用路由协议确定ip地址的连接。
overlay网络
虚拟网络,使用网络虚拟化技术,在物理基础设施之上构建的逻辑。
OpenFlow
在Open Networking Foundation SDN方案中,OpenFlow充当南北向接口,使控制平面control plane、数据平面data plane交互的协议。
流
Flow就是具有相同特征的数据包集合。例如,源mac地址1、目的mac地址2的所有数据包集合就可以视为一条流,可见流具有方向性。
流表
Flow Table由若干条流表项Flow Entry组成,用于指导OF交换机对收到的数据包进行转发,相当于统一了二层的mac地址表、三层的路由表。
流表项
匹配域Match Fields:定义以及匹配流表的依据,拥有多个可选字段,例如可以根据源ip地址、目的ip地址来定义一条流;
指令Instructions:处理流的动作,最普遍的动作集Action Set(添加、修改、清空);
优先级Priority:流表项的优先匹配程度;
计数器Counters:统计该条流的信息;
生存时间Timeouts:流表项的有效存活时间;
Cookie:控制器设置的、用来过滤被动作集Action Set影响的流表项;
过程对比
传统网络
二层:生成arp表,数据包成功匹配,则基于目的mac地址转发,失败则向除入端口外其他所有端口转发;
三层:分布式路由协议,数据包成功匹配相应的路由规则,则基于目的ip地址转发,失败则丢弃;
结论:采用基于数据包独立转发的模式,设备不知道具体路径,发送给大致知晓的其他设备。
SDN
控制层:SDN控制器构建流表;
数据层:OF交换机先向SDN控制器查询流表,再转发数据包,匹配成功则基于匹配域(比如源地址、目的地址)转发;匹配失败时,则问询SDN控制器;
结论:基于流进行转发的,对相同特征的数据包集合采用同样的处理,设备知晓最佳路径。
调用过程
1、OF交换机接收ip数据包;
2、OF交换机解析数据包头部并查询流表,由于流表为空,向控制器询问;
3、OF交换机向控制器发送Packet-In消息;
4、控制器计算主机1到主机2的路由;
5、控制器下发由FlowMod消息承载的流表信息,OF交换机加载流表;
6、控制器发送Packet-Out消息,指示OF交换机按照流表转发IP数据包;
7、OF交换机转发数据包;
EVPN
evpn运行在控制面,负责虚拟网络的管理和控制,支持多租户隔离。
二层arp表:EVPN通过BGP学习、分发mac地址,使得不同数据中心的设备能够了解对端的mac地址及其对应的VTEP,从而实现跨数据中心的二层通信;
三层路由表:EVPN通过BGP学习、分发不同数据中心之间的ip前缀、下一跳,从而实现跨数据中心的三层通信;
路由类型
Type-2路由:用于通告mac地址。每个 Type-2 路由包含一个mac地址、一个vtep的ip地址,用于指示该mac地址所在的vtep;
Type-3路由:用于租户隔离,直接通告二层vlan信息,并不直接携带隧道的相关信息,但配合Type-2路由,间接实现vxlan隧道的建立和维护;
Type-5 路由:用于通告三层ip前缀信息。每个Type-5路由包含一个ip前缀和下一跳ip地址,用于指示路由信息。
VXLAN
vxlan运行在数据面,负责把基于mac地址的二层数据包封装成udp包,在三层传输,使vm、pod可以在不同的物理数据中心之间迁移,而不需要改变其二层网络配置。
概念
VTEP
隧道端点Tunnel Endpoints,运行vxlan的边缘设备,可以是网络设备、服务器、虚拟机、pod,是隧道的起点和终点,负责数据包的封装和解封装。
VNI
网络标识符Network Identifier,可以将一个VNI对应一个租户身份,容量空间总共有2^24=1600万个实例。
BD
桥域Bridge Domain,类似传统网络中采用vlan划分广播域。VNI与BD一一对应,一个BD就表示着一个桥域,同一个BD内的主机就可以进行二层互通。
BDIF
桥域接口Bridge Domain Interface,作为某BD的网关,提供三层转发接口。如果数据包从某二层广播域出去,必须经过BDIF。
NVE
网络虚拟化边缘节点Network Virtualization Edge,是实现网络虚拟化功能的物理设备。在三层网络建立的基础上,实现二层网络。
结构
VTEP将运行在overlay的内层原始二层数据包(绿色),先添加vxlan包头(黄色),然后添加上外层UDP数据包头(蓝色),在underlay网络传输,到达目的VTEP,收到数据包后,依次剥离外层的ip包头、UDP包头,通过vxlan的VNI发送给对应的BD桥域,接收原始二层数据包。
这样在VXLAN的网络之间,只需要根据Outer MAC Header和Outer IP Header进行转发,利用UDP Source Port进行负载分担,这一过程就与转发普通的IP报文完全相同。
报文转发过程举例
VTEP是在虚拟机所在服务器的Hypervisor中vSwitch所构建的,表示VXLAN隧道的入口和出口。
1、VM1发送数据报文给VM2,SIP、SMAC为IP1、MAC1,DIP、DMAC为IP2、MAC2;
2、在VM1所处的vSwitch完成VXLAN封装,内层SIP、DIP为IP1、IP2,外层SIP、DIP为VTEP1 IP、VTEP2 IP;
3、报文根据外层DIP发到VM2的vSwitch并解封装VXLAN头部,随后根据内层DIP发往VM2;
抓包举例
可以看出:overlay的数据包通过VXLAN建立隧道后 ,从underlay网络的10.2.12.18传递到10.2.12.10,从而实现192.168.0.102、192.168.0.108的跨设备二层打通。
应用与实践
以openstack为例,通常使用linux bridge+flat或vlan实现传统网络,openvswitch+vxlan实现SDN网络。实现租户网络self-service netwrok的组网。
虚拟网络的三层通信,关于ml2的typer driver、mechanism driver以及l2 agent的组合实现参考
供应商网络provider network:vlan101
租户网络1:vxlan vni 101
租户网络2:vxlan vni 102
虚拟路由器:连接以上三个网络,并作为租户网络的网关;
南北向流量-三层通信
实例接口(1)通过veth对将数据包转发到安全组网桥实例端口(2);
安全组网桥上的安全组规则(3)处理数据包的防火墙和连接跟踪;
安全组网桥OVS端口(4)通过veth对将数据包转发到OVS集成网桥安全组端口(5);
OVS集成网桥为数据包添加内部VLAN标记;
OVS集成桥为内部隧道ID交换内部VLAN标记;
OVS集成桥接补丁端口(6)将分组转发到OVS隧道桥接补丁端口(7);
OVS隧道桥(8)使用VNI 101封装;
物理接口(9)经由overlay(10)将分组转发到网络节点;
物理接口(11)将分组转发到OVS隧道桥(12);
OVS隧道网桥解包并为其添加内部隧道ID;
OVS隧道网桥为内部VLAN标记交换内部隧道ID;
OVS隧道桥接补丁端口(13)将分组转发到OVS集成桥接补丁端口(14);
接入self-service network(15)的OVS集成桥接端口移除内部VLAN标记,再将分组转发到vrouter namespace中的self-service network网关(16);
虚拟路由器将数据包转发到提供商网络的OVS集成桥接端口(18);
OVS集成网桥将内部VLAN标记添加到数据包;
OVS集成桥接int-br-provider补丁端口(19)将数据包转发到OVS提供程序桥接phy-br-provider补丁端口(20);
OVS供应桥将内部VLAN标记与实际VLAN标记101交换;
OVS供应桥的端口(21)将分组转发到物理网络接口(22);
最后通过underlay基础设施将数据包转发到Internet(23);
逆向过程:
underlay基础设施(1)将分组转发到供应商物理网络接口(2);
供应商物理网络接口将数据包转发到OVS供应桥的网络端口(3);
OVS供应桥将实际VLAN标记101与内部VLAN标记交换;
OVS供应桥的桥接phy-br-provider端口(4)将数据包转发到OVS集成桥的桥接int-br-provider端口(5);
供应商网络(6)的OVS集成桥接端口删除内部VLAN标记,并将数据包转发到路由器命名空间中的提供商网络接口(6);
虚拟路由器将数据包转发到self-service network的OVS集成网桥端口(9);
OVS集成网桥为数据包添加内部VLAN标记;
OVS集成桥为内部隧道ID交换内部VLAN标记;
OVS集成桥接patch-tun补丁端口(10)将数据包转发到OVS隧道桥接patch-int补丁端口(11);
OVS隧道桥(12)使用VNI 101包裹分组;
物理接口(13)经由overlay(14)将分组转发到网络节点;
接入overlay的物理接口(15)将分组转发到OVS隧道桥(16);
OVS隧道网桥解包并为其添加内部隧道ID;
OVS隧道网桥为内部VLAN标记交换内部隧道ID;
OVS隧道桥接patch-int补丁端口(17)将数据包转发到OVS集成桥接patch-tun补丁端口(18);
OVS集成桥从数据包中删除内部VLAN标记;
OVS集成桥安全组端口(19)通过veth对将数据包转发到安全组桥OVS端口(20);
安全组网桥上的安全组规则(21)处理数据包的防火墙和连接跟踪;
安全组桥接实例端口(22)经由veth对将分组转发到实例接口(23);
东西流量-二层通信
实例1接口(1)通过veth对将数据包转发到安全组网桥实例端口(2);
安全组网桥上的安全组规则(3)处理数据包的防火墙和连接跟踪;
安全组网桥OVS端口(4)通过veth对将数据包转发到OVS集成网桥安全组端口(5);
OVS集成网桥为数据包添加内部VLAN标记;
OVS集成桥为内部隧道ID交换内部VLAN标记;
OVS集成桥接补丁端口(6)将数据包转发到OVS隧道桥接补丁端口(7);
OVS隧道桥(8)使用VNI 101包裹分组;
用于覆盖网络的底层物理接口(9)经由覆盖网络(10)将分组转发到计算节点2;
接入overlay的物理接口(11)将分组转发到OVS隧道桥(12);
OVS隧道网桥解包并为其添加内部隧道ID;
OVS隧道网桥为内部VLAN标记交换内部隧道ID;
OVS隧道桥接patch-int补丁端口(13)将分组转发到OVS集成桥接patch-tun补丁端口(14);
OVS集成桥从数据包中删除内部VLAN标记;
OVS集成桥安全组端口(15)通过veth对将数据包转发到安全组网桥OVS端口(16);
安全组网桥上的安全组规则(17)处理数据包的防火墙和连接跟踪;
安全组桥接实例端口(18)经由veth对将分组转发到实例2接口(19);
实例1接口(1)通过veth对将数据包转发到安全组网桥实例端口(2);
安全组网桥上的安全组规则(3)处理数据包的防火墙和连接跟踪;
安全组网桥OVS端口(4)通过veth对将数据包转发到OVS集成网桥安全组端口(5);
OVS集成网桥为数据包添加内部VLAN标记;
OVS集成桥为内部隧道ID交换内部VLAN标记;
OVS集成桥接补丁端口(6)将数据包转发到OVS隧道桥接补丁端口(7);
OVS隧道桥(8)使用VNI 101包裹分组;
物理接口(9)经由overlay(10)将分组转发到网络节点;
物理接口 (11) 将数据包转发到OVS隧道桥 (12);
OVS隧道网桥解包数据包并向其添加内部隧道ID;
OVS隧道网桥将内部隧道ID交换为内部VLAN标记;
OVS隧道桥接patch-int补丁端口 (13) 将数据包转发到OVS集成桥接patch-tun补丁端口 (14);
self-service network 1 (15) 的OVS集成网桥端口删除内部 VLAN 标记并将数据包转发到vrouter namespce中的自服务网关1 (16);
路由器通过self-service network 2接口 (17) 将数据包发送到self-service network 2的网关2;
路由器将数据包转发到self-service network 2 (18) 的OVS集成网桥端口;
OVS集成网桥将内部VLAN标记添加到数据包;
OVS集成网桥将内部VLAN标记交换为内部隧道ID;
从OVS集成桥接patch-tun补丁端口(19)开始为逆向过程;
ovs操作
# 显示当前OVS的配置信息
ovs-vsctl show
# 创建一个新的网桥
ovs-vsctl add-br <bridge-name>
# 删除指定的网桥
ovs-vsctl del-br <bridge-name>
# 在指定的网桥上添加一个新的端口
ovs-vsctl add-port <bridge-name> <port-name>
# 在指定的网桥上删除一个端口
ovs-vsctl del-port <bridge-name> <port-name>
# 设置控制器的地址和端口
ovs-vsctl set-controller <bridge-name> tcp:<controller-ip>:<controller-port>
# 显示指定网桥的OpenFlow交换机信息
ovs-ofctl show <bridge-name>
# 显示指定网桥的流表信息
ovs-ofctl dump-flows <bridge-name>
# 向指定网桥的流表添加一条规则
ovs-ofctl add-flow <bridge-name> <flow-rule>
# 删除指定网桥的所有流表规则
ovs-ofctl del-flows <bridge-name>
# 显示数据通路datapath的信息
ovs-appctl dpctl/show
# 显示流表信息
ovs-appctl dpctl/dump-flows
# 显示指定绑定接口的信息
ovs-appctl bond/show <bond-name>
# 设置指定模块的日志级别
ovs-appctl vlog/set <module>:<level>