复杂的虚拟化网络需要使用的技术:
netns
OpenVSwitch -- OVS
这里就OVS进行学习
OVS —— OpenVSwitch:
Open vSwitch(简称OVS)是一个用C语言开发的多层虚拟交换机,现在基本上已经成为了开源SDN( Software Defined Networking,软件定义网络)基础设施层的事实标准。基于C语言研发,支持以下特性(就是一个高级的三层交换机):
- 802.1q, trunk, access
- NIC bonding
- NetFlow, sFlow
- QoS配置及策略
- GRE, VxLAN,
- OpenFlow
OVS的组成部分:
ovs-vswitched :核心组件,OVS的守护进程daemon, 实现数据报文交换功能,和Linux内核兼容模块一同实现了基于流的交换技术;
ovsdb-server :轻量级的数据库服务,ovs的数据库服务,主要保存了整个OVS的配置信息,例如接口、交换和VLAN等等;ovs-vswithed的交换功能基于此库实现;
ovs-dpctl :是 ovs 提供的一个底层管理工具,主要用于直接管理和调试 Datapath(数据路径)。它直接与内核模块(如 openvswitch.ko)或用户态数据路径交互。
ovs-vsctl :用于获取或更改ovs-vswitchd的配置信息,其修改操作会保存至ovsdb-server中;
ovs-appctl :是 ovs提供的一个运行时管理工具,主要用于向正在运行的 OVS 守护进程(如 ovs-vswitchd、ovsdb-server)发送命令,以查询内部状态、调试问题或动态调整行为。
ovsdbmonitor :是ovs生态系统中提供的一个图形用户界面(GUI)工具,主要用于直观地监控和查看 OVS 数据库(OVSDB)中的配置信息以及 OpenFlow 流表状态。
ovs-controller :通常指代两种不同的概念:一是 OVS 早期版本中包含的一个简易参考控制器程序,二是泛指任何通过 OpenFlow 协议控制 OVS 交换机的SDN 控制器软件。
ovs-ofctl :是 ovs 提供的一个核心命令行工具,专门用于通过 OpenFlow 协议与 OVS 交换机(ovs-vswitchd)进行交互。它主要用于管理、调试和监控 OpenFlow 流表(Flow Table),是 SDN(软件定义网络)环境中控制数据转发行为的关键工具。
ovs-pki :是ovs提供的一个脚本工具,用于简化 PKI(公钥基础设施)的创建和管理,主要目的是为 OVS 组件(如 ovs-vswitchd 和 ovsdb-server)生成用于 SSL/TLS 加密通信所需的证书和密钥。
| 特性 | ovs-dpctl | ovs-ofctl | ovs-vsctl |
| 操作层面 | 内核态/数据平面 (Datapath) | 控制平面 (OpenFlow) | 配置数据库 (OVSDB) |
| 主要用途 | 调试内核流表、查看硬件卸载、Conntrack | 下发/查看 OpenFlow 流表规则 | 创建网桥、端口、VLAN、控制器配置 |
| 流表内容 | 实际执行的“缓存”流或高速流,包含内核特定字段 | 期望匹配的 OpenFlow 规则,逻辑性强 | 不涉及流表,只涉及配置结构 |
| 持久性 | 临时性,重启或超时后消失 | 依赖于控制器或静态配置,较持久 | 持久化存储在数据库中 |
| 典型场景 | 为什么这个包没通?、"流是否被硬件加速?" | 我想让匹配A的包去端口B | 我要新建一个 |
编辑:/etc/sysctl.conf
net.ipv4.ip_forward=1 #开启内核转发功能
openvswitch的安装:
在网上找了很久也没找到安装源,于是自己动手做了一个rpm包:
先到官网下载:https://www.openvswitch.org/releases/openvswitch-2.12.4.tar.gz
下载到/root目录中
mkdir -p rpmbuild/SOURCES
cp openvswitch-2.12.4.tar.gz rpmbuild/SOURCES/
cd rpmbuild/SOURCES/
tar xf openvswitch-2.12.4.tar.gz
rpmbuild -bb --nocheck openvswitch-2.12.4/rhel/openvswitch.spec
会提示缺省依赖包,安装依赖包:
yum install selinux-policy-devel python-sphinx unbound-devel
最后会生产rpm包,保存在RPMS中:

拷贝openvswitch-2.12.4-1.x86_64.rpm到需要安装的机器上,执行安装:
yum install openvswitch-2.12.4-1.x86_64.rpm

启动:Service openvswitch start

ovs-vsctl命令的使用:使用ovs-vsctl --help
show: ovsdb配置内容查看
add-br NAME:添加桥设备;
list-br: 显示所有已定义BRIDGE
del-br BRIDGE: 删除桥
add-port BRIDGE PORT: 将PORT添加至指定的BRIDGE
list-ports BRIDGE: 显示指定BRIDGE上已经添加的所有PORT
del-port [BRIDGE] PORT: 从指定BRIDGE移除指定的PORT
增加一个网桥/交换机brin0:
ovs-vsctl add-br brin0

删除一个网桥/交换机
ovs-vsctl del-br brin0
测试向网桥中添加一个port:
先增加一个veth设备:ip link add veth1.0 type veth peer name veth1.1
ovs-vsctl add-port veth1.0

移除端口port:
ovs-vsctl del-port brin0 veth1.0
显示网桥上的接口interface:
ovs-vsctl list-ifaces brin0

以上信息都是保存在ovsdb数据库中的,可以显示数据库的相关信息:
ovs-vsctl list TBL [REC]
其中的TBL代表表名,数据库中的表在ovs-vsctl --help中可以看到,如Interface、Port、Bridge等
ovs-vsctl list Bridge #显示bridge的信息:

当前主机中有一个bridge,名字叫brin0,包含了两个port
ovs-vsctl list port #显示port信息

可以看到,port表中有两条记录,其UUID分别对应于bridge表中的ports记录的uuid,每个port中又包含一个interface。
就是一个关系型数据库。可以包含类似数据库的增删改查操作
ovs-vsctl find port name=‘veth1.1’ #根据name在port表中查找相关记录

测试两台物理宿主机中虚拟机的联通性:逻辑拓扑图

一、单宿主机中虚拟机间连通性配置测试
1)添加ovs网桥brh10,br代表网桥,h1代表宿主机h1,0代表0号网桥
ovs-vsctl add-br brh10

2)配置虚拟机启动脚本,并启动两台虚拟机:
虚拟机启动时的脚本:/etc/qemu-ifup

虚拟机关闭时的脚本:/etc/qemu-ifdown

启动虚拟机vm1:
qemu-kvm -name "vm1" -m 128 -smp 1 -drive file=/images/kvm/cirros-0.3.6-x86_64-disk-vm1.img,media=disk,if=virtio -net nic,model=virtio,macaddr=52:54:00:01:00:01 -net tap,ifname=vif1.0,script=/etc/qemu-ifup,downscript=/etc/qemu-ifdown -bios /usr/share/qemu-kvm/bios.bin -vnc 192.168.147.140:0
启动虚拟机vm2:
qemu-kvm -name "vm2" -m 128 -smp 1 -drive file=/images/kvm/cirros-0.3.6-x86_64-disk-vm2.img,media=disk,if=virtio -net nic,model=virtio,macaddr=52:54:00:01:00:02 -net tap,ifname=vif2.0,script=/etc/qemu-ifup,downscript=/etc/qemu-ifdown -bios /usr/share/qemu-kvm/bios.bin -vnc 192.168.147.140:1
启动虚拟机后的宿主机中网络接口:

网桥brh10中的接口情况:

端口信息:

端口默认的tag都为空
3)配置vm1和vm2虚拟机的IP,分别为10.0.1.1/24和10.0.1.2/24


两台虚拟机之间是联通的。
默认接口添加到ovs桥上时,tag为空时,其默认是使用几号VLAN呢?以前学习过的交换机中,所有的端口一开始默认都属于VLAN1。也就默认是在一个VLAN1局域网中,又因为同IP网段,相互之间是联通的。ovs的网桥,其端口默认是不是属于VLAN1?还是没有启动VLAN,依然是Ethernet II帧?
4)设置vif1.0和vif2.0处于相同的VLAN中,即tag设置为相同的VLAN中,假设为10
ovs-vsctl set port vif1.0 tag=10

此时vm1与vm2不通了:

ovs-vsctl set port vif2.0 tag=10
此时vm1与vm2联通,都处于VLAN10中。
5)增加第二台网桥brh11,启动第三台虚拟机vm5,配置其IP为10.0.1.5/24
ovs-vsctl add-br brh11
ip link set brh11 up

qemu-kvm -name "vm5" -m 128 -smp 1 -drive file=/images/kvm/cirros-0.3.6-x86_64-disk-vm5.img,media=disk,if=virtio -net nic,model=virtio,macaddr=52:54:00:01:00:05 -net tap,ifname=vif3.0,script=/etc/qemu-ifup1,downscript=/etc/qemu-ifdown1 -bios /usr/share/qemu-kvm/bios.bin -vnc 192.168.147.140:2

vm5虚拟机与vm1和vm2是隔离的,不能互通,因为两台网桥是隔离的。
6)创建veth设备,将其两端加入到两个网桥中:
ip link add vbr10 type veth peer name vbr11
ip link set vbr10 up
ip link set vbr11 up
ovs-vsctl add-port brh10 vbr10
ovs-vsctl add-port brh11 vbr11


此时vm5还是无法ping通vm1和vm2,因为vm5没有配置VLAN,而vm1和vm2在VLAN10中。
配置vif3.0接口到VLAN10中:
ovs-vsctl set port vif3.0 tag=10
此时vm5与vm1和vm2互通了,他们处于不同交换机的同一个VLAN中,并且两台交换机使用veth设备连接。
此时,在vbr10或vbr11上抓包:

此时的物理帧格式为802.1Q帧了。也就是连接两台交换机的veth设备,其接口自动为trunk类型。
二、两台宿主机中的虚拟机间的通信测试
7)在第二台宿主机h2中,创建ovs网桥brh20,启动vm3和vm4虚拟机
ovs-vsctl add-br brh20
qemu-kvm -name "vm3" -m 128 -smp 1 -drive file=/images/kvm/cirros-0.3.6-x86_64-disk-vm3.img,media=disk,if=virtio -net nic,model=virtio,macaddr=52:54:00:02:00:01 -net tap,ifname=vif1.0,script=/etc/qemu-ifup,downscript=/etc/qemu-ifdown -bios /usr/share/qemu-kvm/bios.bin -vnc 192.168.147.137:0
qemu-kvm -name "vm4" -m 128 -smp 1 -drive file=/images/kvm/cirros-0.3.6-x86_64-disk-vm4.img,media=disk,if=virtio -net nic,model=virtio,macaddr=52:54:00:02:00:02 -net tap,ifname=vif2.0,script=/etc/qemu-ifup,downscript=/etc/qemu-ifdown -bios /usr/share/qemu-kvm/bios.bin -vnc 192.168.147.137:1
配置vm3和vm4虚拟机IP分别为10.0.1.3/24 和10.0.1.4/24
此时vm3与vm4是联通的。
8)两台宿主机,如果在同一个机房,可以通过都链接到同一个外部803.1Q交换机中,就可以使用配置相同VLAN实现两台宿主机中虚拟机的通信。
在两台宿主机相隔甚远时,可能要基于其他技术实现相互连接,其中一种技术,即为GRE技术。
GRE —— Generic Routing Encapsulation:通用路由封装,是一种隧道技术,实现点对点通信。
测试实验因为没有外部交换机,使用GRE技术实现宿主机之间的链接。两台宿主机的两个网卡ens37:192.168.61.133和ens36:192.168.61.128做GRE隧道,不能加入虚拟网桥中。
需要配置虚拟网桥借助GRE隧道进行通信,方法是,在网桥上添加端口
在宿主机h1上
ovs-vsctl add-port brh10 gre0


添加的接口出现错误提示,但是接口添加上去了。
ovs-vsctl set interface gre0 type=gre options:remote_ip=192.168.61.133

修改接口类型并给出选项后,接口正常,也就是在添加接口时需要同时给出接口类型、选项等信息:
ovs-vsctl add-port brh10 gre0 -- set interface gre0 type=gre options:remote_ip=192.168.61.128


gre隧道自动使用了ens37接口:

在宿主机h2上同样增加gre端口:
ovs-vsctl add-port brh20 gre0 -- set interface gre0 type=gre options:remote_ip=192.168.61.133


9)将vm3对应的端口vif1.0的VLAN设置为10:
ovs-vsctl set port vif1.0 tag=10
此时vm3能够与vm1、vm2和vm5通信,与vm4不通,因为除了vm4,其他虚拟机都在VLAN10中。
10)在h1中添加名称空间r0,创建veth设备,将r0与brh10连接,在r0中运行dnsmasq,为VLAN10中的虚拟机提供dhcp服务。
ip netns add r0 #添加名称空间r0
ip link add vinb type veth peer name vinr #添加veth设备对,vinb连接到网桥brh10,vinr连接名称空间r0
ip link set vinb up
ip link set vinr up
ip link set vinr netns r0 #将vinr添加到名称空间r0中
ovs-vsctl add-port brh10 vinb #将vinb链接到网桥brh10
ip netns exec r0 ifconfig vinr 10.0.1.254/24 up #配置名称空间r0中的vinr接口的IP地址
ovs-vsctl set port vinb tag=10 # 配置brh10网桥中vinb端口,配置到VLAN10中
ip netns exec r0 dnsmasq --interface=vinr --bind-interfaces --dhcp-range=10.0.1.50,10.0.1.60,12h --dhcp-option=3,10.0.1.254 #在r0中启动dnsmasq,提供dhcp服务


跨宿主机获取,在vm3上执行cirros-dhcpc up eth0:

测试使用vxlan隧道。
上面的实验,两台宿主机之间的通信使用的是GRE隧道,现在测试使用vxlan隧道。
ovs-vsctl del-port gre0 #两台宿主机上执行删除gre0端口
ovs-vsctl add-port brh10 vx0 -- set interface vx0 type=vxlan options:remote_ip=192.168.61.128
ovs-vsctl add-port brh20 vx0 -- set interface vx0 type=vxlan options:remote_ip=192.168.61.133


OVS的术语解释
Bridge:网桥,一个Bridge代表一个以太网交换机(Switch),一台主机中可以创建一个或多个Bridge,Bridge可以根据一定的规则,把某一个端口接收到的数据报文转发到另一个或多个端口上,也可以修改或者丢弃数据报文。
在我的观念中,一直感觉叫做交换机更形象,之所以叫做网桥,是因为在Linux内核网络栈的传统命名中,这类二层转发虚拟设备一直被称为“网桥”,这是一种习惯延续。
Port:端口,它和TCP里面的端口不是同样的概念,它更像是物理交换机上面的插口,可以接水晶头的那种。Port隶属于Bridge,必须先添加了Bridge才能在Bridge上添加Port。Port有以下几种类型:
Normal: 用户可以把操作系统中已有的网卡添加到Open vSwitch上,Open vSwitch会自动生成一个同名的Port,并处理这张网卡进和出的数据报文。
需要注意的是这种方式添加的Port不支持分配IP地址,如果之前网卡上配置的有IP,挂载到OVS上面之后将不可访问。此类型的Port常用于VLAN模式的多台物理主机相连的那个口,交换机一端属于Trunk模式。
Internal: 当Port的类型是Internal时,OVS会自动创建一个虚拟网卡(Interface),此端口收到的数据报文都会转发给这块网卡,从这块网卡发出的数据报文也会通过Port交给OVS处理。当OVS创建一个新的网桥时,会自动创建一个与网桥同名的Internal Port,同时也会创建一个与网桥同名的Interface,因此可以通过ip命令在操作系统中查看到这张虚拟网卡,但是状态是down的。
Patch: Patch Port和veth pair功能相同,总是成双成对的出现,在其中一端收到的数据报文会被转发到另一个Patch Port上,就像是一根网线一样。Patch Port常用于连接两个Bridge,这样两个网桥就和一个网桥一样了。
Tunnel: OVS 支持 GRE、VXLAN、STT、Geneve和IPsec隧道协议,这些隧道协议就是overlay网络的基础协议,通过对物理网络做的一层封装和扩展,解决了二层网络数量不足的问题,最大限度的减少对底层物理网络拓扑的依赖性,同时也最大限度的增加了对网络的控制。
Interface:(iface/接口)接口是OVS与操作系统交换数据报文的组件,一个接口即是操作系统上的一块网卡,这个网卡可能是OVS生成的虚拟网卡,也有可能是挂载在OVS上的物理网卡,操作系统上的虚拟网卡(TUN/TAP)也可以被挂载在OVS上。
Controller:OpenFlow控制器,OVS可以接收一个或者多个OpenFlow控制器的管理,功能主要是下发流表,控制转发规则。
Flow:流表是OVS进行数据转发的核心功能,定义了端口之间转发数据报文的规则,一条流表规则主要分为匹配和动作两部分,匹配部分决定哪些数据报文需要被处理,动作决定了匹配到的数据报文该如何处理。

2200

被折叠的 条评论
为什么被折叠?



