上篇文章介绍了Open vSwitch 的基本功能,这篇将介绍OVS 实现的隧道协议GRE 和 VXLAN。首先,我们再看看OVS 的datapath 。
OVS的核心组件包括 ovsdb-server,ovs-vswitchd,ovs kernel module。
内核模块实现了多个数据路径(datapath) (类似于网桥),每个数据路径都可以有多个 vports (类似于桥内的端口)。每个数据路径也通过关联流表(flow table)来设置操作,而这些流表中的流都是用户空间在报文头和元数据的基础上映射的关键信息,一般的操作都是将数据包转发到另一个vport。
当一个数据包到达一个vport,内核模块所做的处理是提取其流的关键信息并在流表中查找这些关键信息。当有一个匹配的流时它执行对应的操作。如果没有匹配,它会将数据包送到用户空间的处理队列中(作为处理的一部分,用户空间可能会设置一个流用于以后遇到相同类型的数据包可以在内核中执行操作)
前面的实验比较简单,后面隧道协议的使用,需要查看官方的功能兼容列表。
这里提到 Open vSwitch 在不同的平台支持不同的数据路径。不同的数据路径支持不同的功能集合。
目前之前4种数据路径:
这里使用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
安装新包
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 内核版本。接下来介绍GRE 。
GRE (Generic Routing Encapsulation,通用路由封装协议)对某些网络层协议(如:IP,IPX,AppleTalk等)的数据报文进行封装,使这些被封装的数据报文能够在另一个网络层协议(如IP)中传输。GRE协议实际上是一种封装协议,它提供了将一种协议的报文封装在另一种协议报文中的机制,使报文能够在异种网络中传输。异种报文传输的通道称为tunnel(隧道)。相关RFC标准,1701,1702,2637,2784,2890。
配置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
配置虚拟机,使用tap0 和 tap1
从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
可以看到underlay 和overlay 不同的IP。
至此完成GRE 网络的验证。需要注意不要将eno33554968 加入br0。
Virtual eXtensible Local Area Network(VXLAN),是一种网络虚拟化技术,主要解决VLAN 在多租户的云环境下扩展性。是一个将L2 封装在L3 的一种overlay 网络。采用类似VLAN的封装技术,将L2 的以太网帧封装在L4 的UDP报文中,默认使用UDP 4789端口。在两个物理或者虚拟交换机直接中断VXLAN 隧道的端点,成为VXLAN endpoint 或者VTEP。相关RFC标准7348。
通过SDN控制器可简化网络操作维护。
在控制器上配置VXLAN,通过OpenFlow协议将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
查看配置
从host1 的vm1 (10.0.1.11) ping host2 上面的vm21 (10.0.1.21),可以正常平通。
抓包分析,我们可以看到VXLAN 的封装。包括underlay 和overlay 不同的IP,以及VNI。
至此完成VXLAN的配置和验证。
GRE 和 VXLAN 两个隧道协议是SDN 网络或者云计算平台的主流隧道协议。OVS 可以支持 GRE,VXLAN,STT 和 Geneve 等多种隧道协议。