分享交流
合作共赢!

KVM基础使用方法总结【六】——OpenVSwitch网络虚拟机化技术

一、简介

OpenVSwitch简称OVS,基于C语言开发,具有众多特性,如:802.1q, trunk,access, NIC bonding, NetFlow,SFlow,QoS配置及策略,GRE,VxLan,OPenFlow等。OVS的主要组成部分如下:

  • ovs-vswitchd: OVS daemon守护进程,实现数据报文交换功能,和Linux内核兼容模块一同实现了基于流的交换技术;
  • ovsdb-server: 轻量级的数据库服务,主要保存了整个OVS的配置信息,例如接口、交换信息和VLAN等等;ovs-vswithd的交换功能基于此数据库实现;
  • ovs-vsctl: 用于获取或更改ovs-vswitchd的配置信息,其修改操作会保存至ovsdb-server中;

二、复杂虚拟网络演示目的和准备

1.演示目的

基于ovs,演示vlan、grp、vxlan技术的实现方式,其中两台虚拟机模拟物理计算机,分别为node01和node02,实现计算功能,master01实现控制功能,node03实现互联网访问功能。

2.演示准备

1.基础准备

四台虚拟机,master01,node01,node02,node03,其中node01和node02均开启虚拟化功能:Intel的VT-x/EPT或AMD-V/RVI(V),添加一块网卡,并进行如下配置:

master01同样开启虚拟化功能,添加一块类型为桥接模式的网卡即网络适配器,默认网络适配器改为仅主机模式,测试机仅主机模式网关为192.168.141.1,做配置如下:

主机名ip地址(ens33)ip地址(ens38)GATEWAY网关网卡模式
master01192.168.241.10192.168.10.105192.168.241.1仅主机+桥接
node01192.168.241.2
192.168.10.1
192.168.241.10仅主机+VMnet2
node02192.168.241.3
192.168.10.2
192.168.241.10 仅主机+VMnet2

2.系统配置准备(master01)

1.打开master01的路由核心转发功能并使其生效

[root@master01 network-scripts]# more /proc/sys/net/ipv4/ip_forward  # 查看路由转发功能,0表示未开启
0
[root@master01 network-scripts]# vim /etc/sysctl.d/ipv4_forward.conf # 添加选项:net.ipv4.ip_forward = 1
[root@master01 network-scripts]# sysctl -p /etc/sysctl.d/ipv4_forward.conf # 使配置生效
net.ipv4.ip_forward = 1
[root@master01 network-scripts]# more /proc/sys/net/ipv4/ip_forward # 查看路由转发功能,1表示已开启
1

2.master01添加iptables路由规则

[root@master01 network-scripts]# iptables -t nat -A POSTROUTING -s 192.168.241.0/24 -j SNAT --to-source 192.168.0.105

iptables永久生效:

保存规则:]# iptables-save >/etc/iptables-script
恢复规则:]# iptables-restore>/etc/iptables-script
开机自动恢复规则,把恢复命令添加到启动脚本:
]# echo '/sbin/iptables-restore /etc/iptables-script' >>/etc/rc.d/rc.local
]# chmod +x /etc/rc.d/rc.local

3.系统配置准备(node01和node02)

1.node01和node02关闭防火墙

[root@node01 ~]# systemctl stop firewalld
[root@node01 ~]# systemctl disable firewalld
Removed symlink /etc/systemd/system/multi-user.target.wants/firewalld.service.
Removed symlink /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service.

2.在node01和node02测试路由转发是否成功

ping测试master01的网桥的网关地址,如下表示路由转发成功。

[root@node01 ~]# ping 192.168.0.1
PING 192.168.0.1 (192.168.0.1) 56(84) bytes of data.
64 bytes from 192.168.0.1: icmp_seq=1 ttl=63 time=2.68 ms

3.安装后续使用工具

[root@node01 ~]# yum install -y tigervnc tcpdump dnsmasq

4.node01和node02配置openstack yum源

[root@node02 ~]# vim /etc/yum.repos.d/openstack.repo 
[centotack-rocky]
name=openstack-rocky
baseurl=https://mirrors.aliyun.com/centos/7/cloud/x86_64/openstack-rocky/
enabled=1
gpgcheck=0
[qume-kvm]
name=qemu-kvm
baseurl= https://mirrors.aliyun.com/centos/7/virt/x86_64/kvm-common/
enabled=1
gpgcheck=0

5.node01和node02安装并启动openvswitch

[root@node02 ~]# yum install -y openvswitch
[root@node02 ~]# systemctl start openvswitch

6.node01和node02添加网桥设备

[root@node01 ~]# ovs-vsctl add-br br-in
[root@node01 ~]# ovs-vsctl show
6aee2bc0-a784-4be7-82c7-c2d7c7a1e2fa
Bridge br-in
Port br-in
Interface br-in
type: internal
ovs_version: "2.11.0"

补充:ovs-vsctl常用命令

  • show: 查看ovsdb配置内容;
  • add-br NAME: 添加桥设备;
  • list-br: 显示所有已定义的BRIDGE;
  • del-br BRIDGE: 删除
  • add-port BRIDGE PORT: 将PORT添加至指定的桥;
  • del-port [BRIDGE] PORT: 从指定BRIDGE移除指定的PORT;
  • list-ports BRIDGE: 显示指定BRIDEG上已添加的所有端口;
  • list TBL [REC]: 列出某个表(如Interface,port)的信息;
  • ovs-vsctl find Port name=”NAME”: 查找名称为NAME的Port信息;

7.node01和node02安装qemu-kvm并基于cirros启动虚拟机

[root@node01 opt]# yum install qemu-kvm -y
[root@node01 opt]# ln -sv /usr/libexec/qemu-kvm /usr/bin/
‘/usr/bin/qemu-kvm’ -> ‘/usr/libexec/qemu-kvm’

8.node01和node02分别编写启动和停止脚本如下:

编写/etc/qemu_ifdown脚本:

#!/bin/bash
#
bridge=br-in

if [ -n "$1" ]; then
ip link set $1 down
sleep 1
ovs-vsctl del-port $bridge $1
[ $? -eq 0 ] && exit 0 || exit 1
else
echo "Error: no port sepcified."
exit 2
fi

编写/etc/qemu_ifup脚本:

#!/bin/bash
#
bridge=br-in

if [ -n "$1" ]; then
ip link set $1 up
sleep 1
ovs-vsctl add-port $bridge $1
[ $? -eq 0 ] && exit 0 || exit 1
else
echo "Error: no port sepcified."
exit 2
fi

8.添加执行权限:

[root@node01 ~]# chmod +x /etc/qemu-ifup /etc/qemu-ifdown

三、Vlan使用演示

1.同Vlan

1.node01上分别创建两台虚拟机并使其在后台运行:

[root@node01 ~]# qemu-kvm -name "vm01" -m 128 -smp 1 -drive file=/opt/cirros-0.5.1-i386-disk.img,media=disk,if=virtio -net nic,model=virtio,macaddr=52:54:00:00:00:01 -net tap,ifname=vif0.0,script=/etc/qemu-ifup,downscript=/etc/qemu-ifdown -daemonize

[root@node01 ~]# qemu-kvm -name "vm02" -m 128 -smp 1 -drive file=/opt/cirros-0.5.1-x86_64-disk.img,media=disk,if=virtio -net nic,model=virtio,macaddr=52:54:00:00:00:02 -net tap,ifname=vif1.0,script=/etc/qemu-ifup,downscript=/etc/qemu-ifdown -daemonize

2.vnc连接虚拟机:

 vnc连入虚拟机后分别给两台虚拟机配置IP地址:

[root@node01 ~]# ifconfig eth0 10.0.3.1 netmask 255.255.255.0 up
[root@node01 ~]# ifconfig eth0 10.0.3.2 netmask 255.255.255.0 up

3.验证同一vlan

此时两台虚拟机处于同一个vlan可以相互访问,验证了同一个vlan虚拟机可以相互访问。

2.不同VLan

1.同一个网段不同vlan不能相互访问

[root@node01 ~]# ovs-vsctl set port vif0.0 tag=10  # 设置不同的vlan
[root@node01 ~]# ovs-vsctl list port  # 查看port的tag值

2.跨交换机实现同一个vlan相互通信

2.1 添加一个新网桥设备:

[root@node01 ~]# ovs-vsctl add-br br-test

2.2 在node01上启动第3个虚拟机:

[root@node01 ~]# qemu-kvm -name "vm03" -m 128 -smp 1 -drive file=/opt/vm03.img,media=disk,if=virtio -net nic,model=virtio,macaddr=52:54:00:00:00:03 -net tap,ifname=vif2.0,script=/etc/qemu-ifup,downscript=/etc/qemu-ifdown -daemonize

2.3 创建一对网卡设备并激活

[root@node01 ~]# ip link add s0 type veth peer name s1
[root@node01 ~]# ip link show
[root@node01 ~]# ifconfig s0 up
[root@node01 ~]# ifconfig s1 up

2.4 将两个虚拟机交换机进行关联

[root@node01 ~]# ovs-vsctl add-port br-in s0
[root@node01 ~]# ovs-vsctl add-port br-test s1

2.5 配置vif2.0的tag值为10,使其与虚拟机交换机的br-in桥上的两个虚拟网络设备为同一个vlan

[root@node01 ~]# ovs-vsctl set port vif2.0 tag=10
# 删除tag值
[root@node01 ~]# ovs-vsctl remove port vif2.0 tag 10 

2.6 验证不同vlan

由于vif2.0和vif0.0/vif1.0的tag值不同,即不在同一个vlan,故不能相互通信。

四、GRE隧道协议演示

Generic Routing Encapsulation,简称通用路由封装,是一种隧道技术,可以在报文发送端和接收端实现报文的封装和解封。

1.分别在node01和node02上创建网桥br-in

[root@node01 ~]# ovs-vsctl add-br br-in
[root@node02 ~]# ovs-vsctl list-br
br-in

2.分别创建qemu-ifdown和qemu-ifup脚本放置/etc目录

[root@node01 opt]# scp /etc/{qemu-ifdown,qemu-ifup} root@192.168.241.3:/etc/  # 复制node01的脚本到node02

3.安装dnsmasq使新建的虚拟机自动分配IP地址

1.在node01上创建网络名称空间

[root@node01 opt]# ip netns add r0

2.在node01创建一对虚拟网卡并使其激活

[root@node01 opt]# ip link add sif0 type veth peer name rif0
[root@node01 opt]# ip link set sif0 up
[root@node01 opt]# ip link set rif0 up
此内容查看价格3.99立即购买

8.测试GRE协议【一】

目的:node01和node02上的虚拟机可以相互访问。

# ping 10.0.4.201
PING 10.0.4.201 (10.0.4.201): 56 data bytes
64 bytes from 10.0.4.201: seq=0 ttl=64 time=1.607 ms
64 bytes from 10.0.4.201: seq=1 ttl=64 time=3.153 ms
64 bytes from 10.0.4.201: seq=2 ttl=64 time=3.477 ms

如上,node01和node02上通过qemu-kvm创建的两台虚拟机可以相互通信;通信详细信息可以通过抓包查看如下:

[root@node01 ~]# tcpdump -i ens38 -nn
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on ens38, link-type EN10MB (Ethernet), capture size 262144 bytes
23:32:26.013583 IP 192.168.10.1 > 192.168.10.2: GREv0, length 102: IP 10.0.4.200 > 10.0.4.201: ICMP echo request, id 47360, seq 198, length 64
23:32:26.015519 IP 192.168.10.2 > 192.168.10.1: GREv0, length 102: IP 10.0.4.201 > 10.0.4.200: ICMP echo reply, id 47360, seq 198, length 64
23:32:27.014862 IP 192.168.10.1 > 192.168.10.2: GREv0, length 102: IP 10.0.4.200 > 10.0.4.201: ICMP echo request, id 47360, seq 199, length 64
23:32:27.015907 IP 192.168.10.2 > 192.168.10.1: GREv0, length 102: IP 10.0.4.201 > 10.0.4.200: ICMP echo reply, id 47360, seq 199, length 64
23:32:28.016060 IP 192.168.10.1 > 192.168.10.2: GREv0, length 102: IP 10.0.4.200 > 10.0.4.201: ICMP echo request, id 47360, seq 200, length 64
23:32:28.017508 IP 192.168.10.2 > 192.168.10.1: GREv0, length 102: IP 10.0.4.201 > 10.0.4.200: ICMP echo reply, id 47360, seq 200, length 64

说明:

192.168.10.1和192.168.10.2通过GRE隧道建立联系,10.0.4.200和10.0.4.201可以相互访问。

9.测试GRE协议【二】

目的:仅允许vm01和vm03通信,vm02和vm04通信。

1.分别在node01和node02上创建虚拟机vm03和vm04

[root@node01 ~]# qemu-kvm -name "vm02" -m 256 -smp 2 -drive file=/opt/vm02.img,media=disk -net nic,model=virtio,macaddr=52:54:00:00:00:02 -net tap,ifname=vif1.0,script=/etc/qemu-ifup,downscript=/etc/qemu-ifdown -vnc *:0 -daemonize

[root@node02 opt]# qemu-kvm -name "vm04" -m 256 -smp 2 -drive file=/opt/vm04.img,media=disk -net nic,model=virtio,macaddr=52:54:00:00:00:04 -net tap,ifname=vif1.0,script=/etc/qemu-ifup,downscript=/etc/qemu-ifdown -vnc *:0 -daemonize

此时vm01(10.0.4.200), vm02(10.0.4.202), vm03(10.0.4.201), vm04(10.0.4.203)通过GRE协议可以相互通信.

2.分别配置vm01和vm03为同一个vlan,vm02和vm04为同一个vlan

[root@node01 ~]# ovs-vsctl set port vif0.0 tag=10 -- set port vif1.0 tag=20
[root@node02 ~]# ovs-vsctl set port vif0.0 tag=10 -- set port vif1.0 tag=20
移除此配置:
[root@node01 ~]# ovs-vsctl remove port vif0.0 tag 10 -- remove port vif1.0 tag 20
[root@node02 ~]# ovs-vsctl remove port vif0.0 tag 10 -- remove port vif1.0 tag 20

此时通过ping命令即可测试出预期的结果。

五、VXLan使用演示

类似于GRE协议:

[root@node01 ~]# ovs-vsctl add-port br-in gre1 -- set interface gre1 type=vxlan options:remote_ip=192.168.10.2
[root@node02 ~]# ovs-vsctl add-port br-in gre1 -- set interface gre1 type=vxlan options:remote_ip=192.168.10.1

提示:

cirros的下载使用请参考琼杰笔记文档:

KVM基础使用方法总结【五】——cirros启动加速【亲测可用】

赞(1) 打赏
未经允许不得转载:琼杰笔记 » KVM基础使用方法总结【六】——OpenVSwitch网络虚拟机化技术

评论 抢沙发

评论前必须登录!

 

分享交流,合作共赢!

联系我们加入QQ群

觉得文章有用就打赏一下文章作者

非常感谢你的打赏,我们将继续给力更多优质内容,让我们一起创建更加美好的网络世界!

支付宝扫一扫打赏

微信扫一扫打赏

登录

找回密码

注册