CentOS7安装Open vSwitch 及 基础模块解释

转载自
https://www.jianshu.com/p/658332deac99
https://www.jianshu.com/p/4985e3da7725

基础模块

Open vSwitch是一个高质量的、多层虚拟交换机,使用开源Apache2.0许可协议,由Nicira Networks开发,主要实现代码为可移植的C代码。它的目的是让大规模网络自动化可以通过编程扩展,同时仍然支持标准的管理接口和协议(例如NetFlow, sFlow, SPAN, RSPAN, CLI, LACP, 802.1ag)。此外,它被设计位支持跨越多个物理服务器的分布式环境,类似于VMware的vNetwork分布式vswitch或Cisco Nexus 1000 V。Open vSwitch支持多种linux 虚拟化技术,包括Xen/XenServer, KVM和irtualBox。

Open vSwitch的官方定义:Open vSwitch是一个具有工业级质量的多层虚拟交换机。通过可编程扩展,可以实现大规模网络的自动化(配置、管理、维护)。它支持现有标准管理接口和协议(比如netFlow,sFlow,SPAN,RSPAN,CLI,LACP,802.1ag等,熟悉物理网络维护的管理员可以毫不费力地通过Open vSwitch转向虚拟网络管理)。

最新代码包主要包括以下模块和特性:

OVS模块

ovs-vswitchd :核心模块,实现交换功能的守护程序(daemon),和Linux内核模块一起,实现基于流的交换;
ovsdb-server :提供轻量级数据库查询服务。其保存了整个OVS的配置信息,包括接口,流表,VLAN等。ovs-vswitchd从其查询配置信息;
ovsdb-tool: 不通过ovs-server就能直接操控数据库
ovsdb-client: 直接通过ovs-server数据库操作
ovs-brcompatd :让 ovs-vswitch 替换 Linux bridge,包括获取 bridge ioctls 的 Linux 内核模块;
ovs-dpctl :dapapath control. 用来配置 switch 内核模块,可以控制转发规则;
ovs-vsctl :获取或者更改ovs-vswitchd的配置信息,此工具操作的时候会更新ovsdb-server数据库;
ovs-appctl :openvswitch apply control, 发送命令来运行相关 daemon(很少使用);
ovsdbmonitor GUI 工具,用于显示 OVS 数据库中的相关数据。

此外, OVS 也提供了支持 OpenFlow 的特性实现,包括
ovs-openflowd: 一个简单的 OpenFlow 交换机;(2.5.10好像没找到)
ovs-controller: 一个简单的 OpenFlow 控制器;(只有一个ovs-testcontroller)
ovs-ofctl :openvswitch openflow control,用来控制OVS作为OpenFlow交换机工作时的流表内容;
ovs-pki : OpenFlow 交换机创建和管理公钥框架;
ovs-tcpundump: 实现类似tcpdump 的抓包分析功能

基本概念

Packet (数据包)

网络转发的最小数据单元,每个包都来自某个端口,最终会被发往一个或多个目标端口,转发数据包的过程就是网络的唯一功能。

Bridge (网桥)

Open vSwitch中的一个网桥就是一台以太网交换机交换机,一个主机可以创建一个或者多个 Bridge 设备。

其功能是根据一定流规则,把从端口收到的数据包转发到另一个或多个端口。

Port (端口)

端口是收发数据包的单元,和物理以太网交换机的端口概念类似。Open vSwitch中,每个端口都属于一个特定的网桥。端口收到的数据包会经过流规则的处理,发往其他端口;也会把其他端口来的数据包发送出去。Open vSwitch支持的端口有以下几种:

  • Normal Port: 用户可以把操作系统中的网卡绑定到Open vSwitch上,Open vSwitch会生成一个普通端口处理这块网卡进出的数据包。

  • Internal Port: 当设置端口类型为internal,Open vSwitch会创建一快虚拟网卡,此端口收到的所有数据包都会交给这块网卡,网卡发出的包会通过这个端口交给Open vSwitch。
    当Open vSwitch创建一个新网桥时,默认会创建一个与网桥同名的Internal Port

  • Patch Port: 当机器中有多个Open vSwitch网桥时,可以使用Patch Port把两个网桥连起来。Patch Port总是成对出现,分别连接在两个网桥上,在两个网桥之间交换数据。

  • Tunnel Port: 隧道端口是一种虚拟端口,支持使用gre或vxlan等隧道技术与位于网络上其他位置的远程端口通讯。

Interface (iface/接口)

它是连接到 Port 的网络接口设备。Open vSwitch通过Interface与外部交换数据包。在通常情况下,Port 和 Interface 是一对一的关系, 只有在配置 Port 为 bond 模式后,Port 和 Interface 才是一对多的关系。一个接口就是操作系统的一块网卡,这块网卡可能是Open vSwitch生成的虚拟网卡,也可能是物理网卡挂载在Open vSwitch上,也可能是操作系统的虚拟网卡(TUN/TAP)挂载在Open vSwitch上。

Flow (流)

流定义了端口之间数据包的交换规则。每条流分为匹配和动作两部分,匹配部分选择哪些数据包需要可以通过这条流处理,动作决定这些匹配到的数据包如何转发。流描述了一个网桥上,端口到端口的转发规则。比如我可以定义这样一条流:

当数据包来自端口A,则发往端口B

来自端口A 就是匹配部分,发往端口B 就是动作部分。

流的定义可能非常复杂,比如:

当数据包来自端口A,并且其源MAC是aa:aa:aa:aa:aa:aa,并且其拥有vlan tag为a,并且其源IP是a.a.a.a,并且其协议是TCP,其TCP源端口号为a,则修改其源IP为b.b.b.b,发往端口B

Datapath

由于流可能非常复杂,对每个进来的数据包都去尝试匹配所有流,效率会非常低,所以有了datapath。Datapath对流进行缓存,把流的执行结果保存起来,当下次遇到匹配到同一条流的数据包,直接通过datapath处理。考虑到转发效率,datapath完全是在内核态实现的,并且默认的超时时间非常短,好像是3秒。

再重新看一下上面的模块图,datapath是不是可以视作一个交换机,或者说一个桥的实体模块? 因为传统交换机缓存MAC地址并根据MAC地址进行数据包的转发,而Datapath缓存Flow(流)并根据流进行数据包的转发。

Controller

OpenFlow 控制器。OVS 可以同时接受一个或者多个基于 OpenFlow 的控制器的管理。

Flow table

每个 datapath 都和一个"flow table"关联,当 datapath 接收到数据之后, OVS 会在 flow table 中查找可以匹配的 flow,执行对应的操作, 例如转发数据到另外的端口。

二层交换机基本功能

  • MAC 地址学习:当交换机从它的某个端口收到数据帧时,它将端口的 ID 和帧的源 MAC 地址保存到它的内部MAC表中。这样,当将来它收到一个要转发到该 MAC 地址的帧时,它就知道直接从该端口转发出去了。
  • 数据帧转发:交换机在将从某个端口收到数据帧,再将其从某个端口转发出去之前,它会做一些逻辑判断:
    如果帧的目的 MAC 地址是广播或者多播地址的话,将其从交换机的所有端口(除了传入端口)上转发。
    如果帧的目的MAC地址在它的内部MAC表中能找到对应的输出端口的话(MAC 地址学习过程中保存的),将其从该端口上转发出去。
    对其它情况,将其从交换机的所有端口(除了传入端口)上转发。
  • 加 VLAN 标签/去 VLAN 标签:
    帧接收:从 trunk port 上收到的数据帧必须是加了标签的。从 access port 上收到的数据帧必须是没有加标签的,否则该帧将会被抛弃。
    帧处理:根据上述转发流程决定其发出的端口。
    帧发出:从 trunk port 发出的帧是加了标签的。从 access port 上发出的帧必须是没加标签的。

CentOS7下安装Open vSwitch(构建RPM安装包)

要关闭Selinux或设置为Permissive

安装依赖包

yum -y install wget openssl-devel gcc make python-devel openssl-devel kernel-devel graphviz kernel-debug-devel autoconf automake rpm-build redhat-rpm-config libtool python-twisted-core python-zope-interface PyQt4 desktop-file-utils libcap-ng-devel groff checkpolicy selinux-policy-devel

下载Open VSwitch软件包到本地

http://www.openvswitch.org/download/

wget https://www.openvswitch.org/releases/openvswitch-2.5.10.tar.gz

一般来说 很有可能连接被拒绝无法下载,只能通过网页下载再上传到CentOS7上

预处理

mkdir -p ~/rpmbuild/SOURCES
cp openvswitch-2.5.10.tar.gz ~/rpmbuild/SOURCES/ 
cd ~/rpmbuild/SOURCES
tar -zxvf openvswitch-2.5.10.tar.gz

构建RPM包

cd ~/rpmbuild/SOURCES
rpmbuild -bb --nocheck openvswitch-2.5.10/rhel/openvswitch-fedora.spec

安装

yum -y localinstall ~/rpmbuild/RPMS/x86_64/openvswitch-2.5.10-1.el7.x86_64.rpm 

查看OVS工具版本状态

ovs-vsctl -V

可能需手动创建 目录

mkdir /var/run/openvswitch

开启Open VSwitch服务并设置开机自启动

systemctl enable openvswitch
systemctl start openvswitch

检查服务是否启动

systemctl is-active openvswitch

安装版本OVS-2.12.0

CentOS7内核升级到kernel-3.10.0-1160.2.2.el7.x86_64后,OVS2.5.10构建RPM安装包时可能会出错。
linux内核版本kernel-3.10.0-1127.19.1.el7.x86_64 成功构建
linux内核版本kernel-3.10.0-1160.2.2.el7.x86_64 构建失败 报错

In file included from lib/netlink-conntrack.c:26:0:
/usr/include/linux/netfilter/nf_conntrack_sctp.h:25:2: error: unknown type name 'u8'
  u8 last_dir;
  ^
/usr/include/linux/netfilter/nf_conntrack_sctp.h:26:2: error: unknown type name 'u8'
  u8 flags;
  ^

emmmm,原因不明。(不要随便升级 yum -y upgrade)
最重要的好像是内核版本+headers 如果内核+headers是1127 版本即使工具包kernel-devel+kernel-debug-devel是1160 依然可以安装成功

因此建议改为较新的OVS版本 如2.12.0

安装依赖包

yum -y groupinstall "Development Tools"
yum -y install wget openssl-devel unbound-devel selinux-policy-devel python-sphinx python-six

下载压缩包到 本地

wget https://www.openvswitch.org/releases/openvswitch-2.12.0.tar.gz

预处理

mkdir -p ~/rpmbuild/SOURCES
cp openvswitch-2.12.0.tar.gz ~/rpmbuild/SOURCES/
cd ~/rpmbuild/SOURCES
tar -zxvf openvswitch-2.12.0.tar.gz
sed 's/openvswitch-kmod, //g' openvswitch-2.12.0/rhel/openvswitch.spec > openvswitch-2.12.0/rhel/openvswitch_no_kmod.spec

构建安装包

rpmbuild -bb --without check ~/rpmbuild/SOURCES/openvswitch-2.12.0/rhel/openvswitch_no_kmod.spec

安装

yum -y localinstall ~/rpmbuild/RPMS/x86_64/openvswitch-2.12.0-1.x86_64.rpm
systemctl enable openvswitch
systemctl start openvswitch

检查服务是否启动

systemctl is-active openvswitch

在已经安装低版本OVS后,如2.5.10。
可以直接安装高版本如2.12.0
安装完成需重启OpenVSwitch后 OVS服务替换为2.12.0 版本

systemctl restart openvswitch

原数据都会得到保留

OVS 卸载。

卸载前保证 OVS上设置的网桥全部删除。

可直接使用命令 卸载。使用ssh连接,最好保证卸载OVS后ssh 还能连上,不然网络会中途断掉,连接失败,卸载也会终止。

yum -y remove openvswitch
  • 3
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值