一、简介
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网关 | 网卡模式 |
master01 | 192.168.241.10 | 192.168.10.105 | 192.168.241.1 | 仅主机+桥接 |
node01 | 192.168.241.2 | 192.168.10.1 | 192.168.241.10 | 仅主机+VMnet2 |
node02 | 192.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
您暂时无权查看此隐藏内容!
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的下载使用请参考琼杰笔记文档:
评论前必须登录!
注册