OVS那些事儿之VXLAN隧道协议

上篇文章介绍了Open vSwitch 的基本功能,这篇将介绍OVS 实现的隧道协议GRE 和 VXLAN。首先,我们再看看OVS 的datapath 。

数据路径(datapath)

OVS的核心组件包括 ovsdb-server,ovs-vswitchd,ovs kernel module。
OVS那些事儿之VXLAN隧道协议_第1张图片

内核模块实现了多个数据路径(datapath) (类似于网桥),每个数据路径都可以有多个 vports (类似于桥内的端口)。每个数据路径也通过关联流表(flow table)来设置操作,而这些流表中的流都是用户空间在报文头和元数据的基础上映射的关键信息,一般的操作都是将数据包转发到另一个vport。

当一个数据包到达一个vport,内核模块所做的处理是提取其流的关键信息并在流表中查找这些关键信息。当有一个匹配的流时它执行对应的操作。如果没有匹配,它会将数据包送到用户空间的处理队列中(作为处理的一部分,用户空间可能会设置一个流用于以后遇到相同类型的数据包可以在内核中执行操作)

OVS那些事儿之VXLAN隧道协议_第2张图片

前面的实验比较简单,后面隧道协议的使用,需要查看官方的功能兼容列表。

这里提到 Open vSwitch 在不同的平台支持不同的数据路径。不同的数据路径支持不同的功能集合。

目前之前4种数据路径:

  • Linux upstream:通过上游Linux 内核自带的内核模块实现的datapath。由于openvswitch 功能已经引入内核,可以根据不同发行版Linux 的内核版本查看支持的功能。
  • Linux OVS tree:通过OVS 源代码生成的内核模块实现的。
  • Userspace: 也称为DPDK,dpif-netdev 或者dummy datapath。这是NetBSD,FreeBSD 和Mac OSX 仅支持的数据路径。
  • Hyper-V:Windows 平台的数据路径。

下面是不同的数据路径可以实现的功能。
OVS那些事儿之VXLAN隧道协议_第3张图片

Linux OVS tree

这里使用CentOS 7.2 原生的内核 3.10 版本,要实现GRE和VXLAN,则需要使用 Linux OVS tree 数据路径。实验中需要重新打包Open vSwitch。重新安装的过程如下:

删除原来的ovs 配置,卸载openvswitch

ovs-vsctl del-br br0
systemctl stop openvswitch
yum remove –y openvswitch 

安装新的依赖包

yum install rpm-build autoconf automake libtool systemd-units openssl openssl-devel python python-twisted-core python-zope-interface python-six desktop-file-utils groff graphviz procps-ng  libcap-ng libcap-ng-devel  dpdk-devel PyQt4  selinux-policy-devel

重新打包

rpmbuild -ba  -D "kversion 3.10.0-327.28.3.el7.x86_64"  ~/rpmbuild/SOURCES/openvswitch-2.5.0/rhel/openvswitch-kmod-fedora.spec
rpmbuild -ba  -D "kversion 3.10.0-327.28.3.el7.x86_64"  ~/rpmbuild/SOURCES/openvswitch-2.5.0/rhel/openvswitch-fedora.spec

安装新包

OVS那些事儿之VXLAN隧道协议_第4张图片

cd /home/ovs/rpmbuild/RPMS/x86_64/
yum localinstall –y *
systemctl enable openvswitch

更新kernel openvswitch模块,参考redhat文档。

mv /lib/modules/3.10.0-327.28.3.el7.x86_64/kernel/extra/openvswitch/* /lib/modules/`uname -r`/updates/
depmod –av

创建开机自动加载openvswitch 内核模块

cat /etc/sysconfig/modules/openvswicth.modules 
modprobe openvswitch
modprobe vport-geneve
modprobe vport-gre
modprobe vport-lisp
modprobe vport-stt
modprobe vport-vxlan

修改权限

chmod 755 /etc/sysconfig/modules/openvswicth.modules

重启,查看模块信息,确实已经加载了新版本

modinfo openvswitch

OVS那些事儿之VXLAN隧道协议_第5张图片

这里,我们可以验证新的OVS 内核版本。接下来介绍GRE 。

GRE 概念

GRE (Generic Routing Encapsulation,通用路由封装协议)对某些网络层协议(如:IP,IPX,AppleTalk等)的数据报文进行封装,使这些被封装的数据报文能够在另一个网络层协议(如IP)中传输。GRE协议实际上是一种封装协议,它提供了将一种协议的报文封装在另一种协议报文中的机制,使报文能够在异种网络中传输。异种报文传输的通道称为tunnel(隧道)。相关RFC标准,1701,1702,2637,2784,2890。

OVS那些事儿之VXLAN隧道协议_第6张图片

GRE 实验配置

实验拓扑如下:
OVS那些事儿之VXLAN隧道协议_第7张图片

配置IP (host11 为例)

ifconfig eno33554968 10.0.2.11/24

创建br 和 port

ovs-vsctl add-br br0
ovs-vsctl add-port br0 tap0  -- set interface tap0 type=internal
ovs-vsctl add-port br0 tap1  -- set interface tap1 type=internal
ovs-vsctl add-port br0 gre0 -- set interface gre0 type=gre options:remote_ip=10.0.0.12

查看配置

ovs-vsctl show

OVS那些事儿之VXLAN隧道协议_第8张图片

配置虚拟机,使用tap0 和 tap1

OVS那些事儿之VXLAN隧道协议_第9张图片

从host1 的vm1 (10.0.1.11) ping host1 上面的vm2 (10.0.1.12),可以正常平通。
从host1 的vm1 (10.0.1.11) ping host2 上面的vm21 (10.0.1.21),可以正常平通。

抓包分析,我们可以看到GRE 的封装。

tcpdump -i eno33554968  -w /tmp/gre-20160917.pcap

OVS那些事儿之VXLAN隧道协议_第10张图片

可以看到underlay 和overlay 不同的IP。

至此完成GRE 网络的验证。需要注意不要将eno33554968 加入br0。

VXLAN 概念

Virtual eXtensible Local Area Network(VXLAN),是一种网络虚拟化技术,主要解决VLAN 在多租户的云环境下扩展性。是一个将L2 封装在L3 的一种overlay 网络。采用类似VLAN的封装技术,将L2 的以太网帧封装在L4 的UDP报文中,默认使用UDP 4789端口。在两个物理或者虚拟交换机直接中断VXLAN 隧道的端点,成为VXLAN endpoint 或者VTEP。相关RFC标准7348。

VXLAN 网络结构
OVS那些事儿之VXLAN隧道协议_第11张图片

通过SDN控制器可简化网络操作维护。

  • 控制器(Controller)控制器是OpenFlow协议的控制面服务器,所有的路径计算与管理都由独立的控制器完成。
  • 转发器:OpenFlow协议的转发平面设备,只处理数据转发任务。
  • OpenFlow协议:OpenFlow协议是SDN中的重要协议,是控制器和转发器的通信
    通道。控制器通过OpenFlow协议将信息下发给转发器。
  • OpenFlow流表:OpenFlow流表用来指导转发器进行报文转发。转发器根据流表中的匹配项对报文进行匹配,匹配上则执行相应的动作。如,流表的匹配域是源MAC地址,动作是向某个端口转发,则转发器根据这个流表,对匹配这个MAC地址的报文进行向某个端口转发的动作。控制器通过下发流表直接控制转发器的转发行为,实现控制器对转发器的控制。

在控制器上配置VXLAN,通过OpenFlow协议将VXLAN信息下发给转发器。

  • NVE(Network Virtrualization Edge网络虚拟边缘节点):是实现网络虚拟化的功能实体,VM里的报文经过NVE封装后,NVE之间就可以在基于L3的网络基础上建立起L2虚拟网络。网络设备实体以及服务器实体上的VSwitch都可以作为NVE。
  • VTEP:为VXLAN隧道的端点,封装在NVE中,用于VXLAN报文的封装和解封装。VTEP与物理网络相连,分配的地址为物理网络IP地址。VXLAN报文中源IP地址为本节点的VTEP地址,VXLAN报文中目的IP地址为对端节点的VTEP地址,一对VTEP地址就对应着一个VXLAN隧道。
  • VNI(VXLAN Network Identifier):VXLAN网络标识VNI类似VLAN ID,用于区分VXLAN段,不同VXLAN段的虚拟机不能直接二层相互通信。一个VNI表示一个租户,即使多个终端用户属于同一个VNI,也表示一个租户。VNI由24比特组成,支持多达16M((2^24-1)/1024^2)的租户。
  • VAP(Virtual Access Point):虚拟接入点VAP统一为二层子接口,用于接入数据报文。为二层子接口配置不同的流封装,可实现不同的数据报文接入不同的二层子接口。

VXLAN 报文

OVS那些事儿之VXLAN隧道协议_第12张图片

  • VXLAN头封装
    Flags:8比特,取值为00001000。
    VNI:VXLAN网络标识,24比特,用于区分VXLAN段。
    Reserved:24比特和8比特,必须设置为0。
  • 外层UDP头封装
    目的UDP端口号是4789。源端口号是内层以太报文头通过哈希算法计算后的值。
  • 外层IP头封装
    源IP地址为发送报文的虚拟机所属VTEP的IP地址;目的IP地址是目的虚拟机所属
    VTEP的IP地址。
  • 外层Ethernet头封装
    SA:发送报文的虚拟机所属VTEP的MAC地址。
    DA:目的虚拟机所属VTEP上路由表中直连的下一跳MAC地址。
    VLAN Type:可选字段,当报文中携带VLAN Tag时,该字段取值为0x8100。
    Ethernet Type:以太报文类型,IP协议报文该字段取值为0x0800。

VXLAN 配置

vxlan的配置比较类似gre , 这里我们只需要将gre0 删除,添加vxlan0 端口。

ovs-vsctl del-port gre0
ovs-vsctl add-port br0 vxlan0 -- set interface vxlan0 type=vxlan options:remote_ip=10.0.2.12 options:key=100 

查看配置

OVS那些事儿之VXLAN隧道协议_第13张图片

从host1 的vm1 (10.0.1.11) ping host2 上面的vm21 (10.0.1.21),可以正常平通。
抓包分析,我们可以看到VXLAN 的封装。包括underlay 和overlay 不同的IP,以及VNI。

OVS那些事儿之VXLAN隧道协议_第14张图片

至此完成VXLAN的配置和验证。

小结

GRE 和 VXLAN 两个隧道协议是SDN 网络或者云计算平台的主流隧道协议。OVS 可以支持 GRE,VXLAN,STT 和 Geneve 等多种隧道协议。

你可能感兴趣的:(Virtualization)