使用OpenvSwitch + KVM搭建SDN网络、完整流程

环境
ubuntu 16.04
open-vswitch 2.5.10
kvm 2.5.0

一、首先安装ovs

可以参考这篇文章ovs安装,亲测可用,

ovs基本命令:

英文比较好的可以阅读open vswitch文档

配置环境变量		export PATH=$PATH:/usr/local/share/openvswitch/scripts
启动				ovs-ctl start
添加网桥			ovs-vsctl add-br br01(名称)
添加端口			ovs-vsctl add-port br01 ens33(网卡)
删除网桥			ovs-vsctl del-br br01
删除网桥接口		ovs-vsctl del-port br01 ens33(接口名) 
查看所有网桥		ovs-vsctl show
查看某个网桥信息	ovs-ofctl show br01

二、安装KVM

推荐一篇文章,写的非常详细,新手也能搞定,KVM安装和使用

可以根据自己的需求来建虚拟机,我这里是建了2台虚拟机,
在这里插入图片描述

三、使用ovs搭建虚拟交换机,并连接两台kvm虚拟机。

1、启动ovs
切换root用户
配置环境变量	export PATH=$PATH:/usr/local/share/openvswitch/scripts
启动			ovs-ctl start
2、启动KVM虚拟机

我这里是两台

virsh start 虚拟机名称1
virsh start 虚拟机名称2

使用vnc连接端口,
启动虚拟机后,主机上使用ifconfig可以看到有两个虚拟网卡接口,分别对应两个虚拟机。
在这里插入图片描述

3、配置ovs交换机

使用 ifconfig 命令可以看到 有个 virbr0 的虚拟网络接口,这里需要把他删掉,命令如下:

virsh net-destroy default

粗浅的解释一下:
1、virbr0 是一种虚拟网络接口,这是由于安装和启用了 libvirt 服务后生成的,libvirt 在服务器(host)上生成一个 virtual network switch (virbr0),host 上所有的虚拟机(guests)通过这个 virbr0 连起来。
默认情况下 virbr0 使用的是 NAT 模式(采用 IP Masquerade),所以这种情况下 guest 通过 host 才能访问外部。
2、virbr0 是 KVM 默认创建的一个 Bridge,其作用是为连接其上的虚机网卡提供 NAT 访问外网的功能。
3、virbr0 默认分配了一个IP 192.168.122.1,并为连接其上的其他虚拟网卡提供 DHCP 服务。
总之这里不需要,需要把他删除。

(1)使用ovs构建交换机

ovs-vsctl add-br br0   //创建桥br0
ovs-vsctl add-port br0 vnet0  //添加VM1虚拟端口vnet0
ovs-vsctl add-port br0 vnet1  //添加VM2虚拟端口vnet1
ovs-vsctl add-port br0 ens33  //添加物理端口ens33   ens33是网卡名

注意:这里所有网络连接会断掉,如果你是使用Xshell连接的也会断掉。
:当网卡加入网桥之后,网卡就是交换机上的一个端口,交换机作为二层设备,其端口是不可能有IP地址的,所以本机的IP地址失效。所以ssh连接什么的都会失效。
网桥创建成功后会默认带一个与网桥同名的port,并且这个port的类型是比较特殊的Internal。
可以将原网卡IP 设置到此处。顺便可以添加一个默认路由,原默认路由失效了,会导致无法访问外网。

Internal 类型可以看做每个OVS交换机有个可以用来处理数据报的本地端口,可以为这个网络设备配置 IP 地址。当创建ovs网桥时会自带一个同名的端口,该端口就是类型为Internal 端口。解决的思路就是Internal类型的port会生成一个虚拟网卡,将绑定到网桥的网卡的IP地址转移到该虚拟网卡上,然后配置路由即可。

ifconfig ens33 0
ifconfig br0 192.168.1.141	 # 这里的ip可以是新的也可是ens33上的原ip
route add default gw 192.168.1.1 br0

此时查看ovs信息应该是下面样子
在这里插入图片描述
测试一下能否联网
在这里插入图片描述
现在博主的所有机器的ip情况如下,读者的应该类似:

VM1: 192.168.1.167
VM2: 192.168.1.225
br0: 192.168.1.141
外部host:192.168.1.182

这样整个SDN网络就初步搭建完成了,

4、测试SDN网络

首先要编写openflow规则,写入到br0交换机的规则表中,下面教你写一个简单的规则。

简单的ovs添加openflow规则

# ovs 添加openflow规则
ovs-ofctl add-flow XXXXXXXXXXXXXXXXX
table = 0			添加到表0,共有0-253个表,默认0
in_port=port		流量进入的端口或编号 in_port=vnet0/0
dl_type=0x0800		以太网协议类型 0x0800/ip:ipv4 、0x086dd/ipv6:ipv6 
					0x0806/arp:ARP数据包、0x8035/rarp: RARP数据包
dl_src=x:x:x:x:x:x		源mac
dl_dst=x:x:x:x:x:x		目的mac
nw_src=ip			源ip
nw_dst=ip			目的IP
nw_proto			网络层协议

actions			动作
	normal		正常转发
	output:port	定向某交换机端口
	drop		丢弃
	mod_dl_src	更改源mac
	mod_dl_dst	更改目的mac
	all		在所有交换机物理端口上输出数据包,而不是在接受数据包的端口上
	mod_nw_src:ip	将ipv4源地址设置为ip
	mod_nw_dst:ip	将ipv4目的地址设置为ip


查看交换机端口编号

ovs-ofctl show br0

交换机端口编号信息:
在这里插入图片描述

首先要清楚自己机器的配置信息,这样就能更清楚地写openflow规则:

机器      	IP      		端口编号   	网卡端口
VM1  	192.168.1.167			1		vnet0
VM2  	192.168.1.225			2		vnet1
外部主机 192.168.1.182		   -

添加重定向数据包规则:
添加新的 OpenFlow规则,重定向VM2(端口2,vnet1)的ICMP数据包到VM1(端口1,vnet0):
这里的ICMP就是ping的会话信息,

# 把端口2(VM2)的ping信息转发到端口1(VM1)
ovs-ofctl add-flow br0 idle_timeout=0,dl_type=0x0800,nw_proto=1,in_port=2,actions=output:1

命令拆解(同上)

ovs-ofctl add-flow br0 idle_timeout=0,
dl_type=0x0800, nw_proto=1,		# icmp
in_port=2,			# 端口为2
actions=output:1	# 转发到端口1

查看规则

ovs-ofctl dump-flows br0

结果如图:
在这里插入图片描述

监听端口

tcpdump -n -i vnet0 icmp

操作:在外部主机(192.168.1.182)上 ping 192.168.1.225
在网卡端口 vnet0上监控数据,发现数据包已被转发到端口vnet0
在这里插入图片描述
这里只是一个十分简单的一个小测试,自己可以根据需求进行复杂的规则和操作。


参考
https://blog.csdn.net/qq_15437629/article/details/45766235
https://blog.csdn.net/dandanfengyun/article/details/108345872

  • 5
    点赞
  • 34
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值