OVS+KVM 虚拟环境测试

一. 基础介绍:

OVS+KVM 虚拟环境测试_第1张图片

ovs当前最新代码包主要包括以下模块和特性:
   ovs-vswitchd主要模块,实现switch的 daemon,包括一个支持流交换的Linux内核模块;
   ovsdb-server轻量级数据库服务器,提供ovs-vswitchd获取配置信息;
   ovs-vsctl查询和更新 ovs-vswitchd的配置;
   ovs-brcompatd让 ovs-vswitch替换 Linuxbridge,包括获取 bridgeioctls 的 Linux内核模块;
   ovs-dpctl用来配置 switch内核模块;一些 Scriptsand specs 辅助 OVS安装在 CitrixXenServer 上,作为默认switch;
  ovs-appctl发送命令消息,运行相关daemon;
   ovsdbmonitorGUI 工具,可以远程获取OVS数据库和 OpenFlow的流表。

此外,OVS也提供了支持 OpenFlow的特性实现,包括

  ovs-openflowd:一个简单的OpenFlow交换机;
  ovs-controller:一个简单的OpenFlow控制器;
  ovs-ofctl查询和控制 OpenFlow交换机和控制器;
  ovs-pki:OpenFlow 交换机创建和管理公钥框架;
  ovs-tcpundump:tcpdump的补丁,解析OpenFlow的消息;

二.openvswitch安装配置:

1.准备工作:

apt-get  install build-essential
apt-get  install openssl 

OnLinux you should ensure that /dev/urandom exists. To support TAP devices,you must also ensure that /dev/net/tun exists:

         ls -l /dev/urandom
         ls -l /dev/net/tun

2.下载openvswitch源文件,安装openvswitch
注意版本要适合操作系统内核:
OVS+KVM 虚拟环境测试_第2张图片

Openvswitch包下载地址:http://openvswitch.org/download/
安装:

tar-xzf openvswitch-2.1.3.tar.gz
cd openvswitch-2.1.3/

./configure --with-linux=/lib/modules/`uname -r`/build 
make && make install 
insmod datapath/linux/openvswitch.ko 
//加载openvswitch模块,第二次使用时cd  openvswitch-2.1.3,从此步骤开始启动OVS

如果出现无法加载.ko,提示unknownsymbol in module,两种情况:一是openvswitch版本与系统内核版本不一致;二是首先加载gre模块:modprobe gre,再insmod加载即可。
补充一下DataPath的概念,OpenFlow就是控制和数据转发分离,而控制端,就叫做ControllerPath,比如 floodlight等;负责转发数据的数据转发端,就叫做DataPath,也就是支持 OpenFlow的硬件或者软件交换机 Switch核模块已成功装入:

$ lsmod | grep openvswitch 
openvswitch            97934  0 

一旦你证实openvswitch.ko已成功装入到内核中,继续安装内核模块,如下所示。

$ sudo make modules_install 

3.初始化配置openvswitch

创建ovsdb数据库:

sudo mkdir -p /usr/local/etc/openvswitchsudo ovsdb-tool create /usr/local/etc/openvswitch/conf.db /usr/local/share/openvswitch/vswitch.ovsschema

配置启动ovsdb-server:

sudo ovsdb-server /usr/local/etc/openvswitch/conf.db --remote=punix:/usr/local/var/run/openvswitch/db.sock --pidfile --detach

初始化数据库:

sudo ovs-vsctl --no-wait init

启动 OpenvSwitch daemon,连接到同样的 Unixdomain socket 上:

sudo ovs-vswitchd --pidfile --detach

查看进程:

ps -ef |grep ovs

至此openvswitch安装配置结束。

三.KVM安装配置:

(1)安装软件包:

 sudo apt-get install qemu-kvm libvirt-bin virt-manager bridge-utils

其中:virt-manager为GUI管理窗口,bridge-utils:用于网络桥接。

(2)安装测试:
执行下面的命令看KVM是否安装成功:

    kvm-ok

输出信息:

 INFO:/dev/kvm exists
 KVMacceleration can be used
如果提示信息为:
INFO:KVM (vmx) is disabled by your BIOS(KVM [vmx]被你的BIOS禁用)
HINT:Enter your BIOS setup and enable Virtualization Technology (VT)
则需要进入的BIOS设置界面,启用虚拟化技术[VT],设置步骤为:
进入BIOS后,选择ADVANCED,然后至PROCESSOR CONFIGURATION进去找到,
INTEL(R) VIRTUALIZATION  TECHNOLOGY ,设置成ENABLE,保存退出。
验证KVM内核是否加载成功:
lsmod| grep kvm
输出为:
kvm_intel    47162   0
kvm          317577  1  kvm_intel
若KVM内核没加载执行下面命令加载:   
 $sudo modprobe kvm
 $sudo modprobe kvm-intel ( or kvm-amd )

(3)证实KVM正常运行:

  virsh-c qemu:///system list

将输出:
Id Name State
如果提示你没权限操作,则需要将当前操作账户添加进libvirtd组,命令为:
sudo usermod -G libvirtd -a zlk

(4)启动KVM GUI:

 virt-manager

在KVM中安装操作系统

(5)KVM使用:
kvm –help
看某个命令(img)的信息:
kvm-img –help

操作:

(virsh net-start default)
virsh list
virsh start host1
virsh shutdown host1
virsh destory host1

四.测试部分:

OVS+KVM 虚拟环境测试_第3张图片

1.启动OVS:

cd openvswitch-2.1.3
modprobe gre
insmod datapath/linux/openvswitch.ko
sudo ovsdb-server  /usr/local/etc/openvswitch/conf.db --remote=punix:/usr/local/var/run/openvswitch/db.sock --pidfile --detach
sudo ovs-vswitchd --pidfile --detach
ps -ef |grep ovs

2.启动KVM虚拟机:

virsh net-start default
virsh start host1
virsh start host2
ifconfig
virt-manager

注:
virbr0 是一种虚拟网络接口,这是由于安装和启用了 libvirt 服务后生成的,libvirt 在服务器(host)上生成一个 virtual network switch (virbr0),host 上所有的虚拟机(guests)通过这个 virbr0 连起来。默认情况下 virbr0 使用的是 NAT 模式(采用 IP Masquerade),所以这种情况下 guest 通过 host 才能访问外部。
我们需要删掉:

virsh net-destroy default

3.测试:

(1)按照拓扑结构创建vswitch:

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 eth0  //添加物理端口eth0

注:当把物理端口添加到虚拟交换机上之后,这些物理端口上原先的IP设置将失效(IP属于三层,而交换机工作在二层),无法与外界进行三层的互联。解决方法是设置internal的端口并添加路由:

sudo ifconfig br0 192.168.1.3 netmask 255.255.255.0
sudo route adddefault gw 192.168.1.1 br0

把和br0直连的路由器或防火墙的IP地址设置为默认网关,所有未知网络都发往路由器、防火墙等网络设备的接口192.168.1.1,因为路由器、防火墙有多个网段的路由条目,匹配到条目后就转发数据包!

 说明:VM1 ip:192.168.1.152
      VM2 ip :192.168.1.247
      物理端口eth0 ip:192.168.1.111
      外部host ip:192.168.1.110

(2)流规则测试:
OpenFlow是用于管理交换机流表的协议,ovs-ofctl则是OVS提供的命令行工具。在没有配置OpenFlow控制器的模式下,用户可以使用ovs-ofctl命令通过OpenFlow协议去连接OVS,创建、修改或删除OVS中的流表项,并对OVS的运行状况进行动态监控。OpenSwitch定义了一系列FlowTable,通过它来控制包的流向和结构。

查看datapath的信息:


ovs-dpctl show
system@ovs-system:
lookups: hit:927782 missed:164964 lost:0
flows: 2
masks: hit:1453718 total:2 hit/pkt:1.33
port 0: ovs-system (internal)
port 1: br0 (internal)
port 2: vnet0
port 3: vnet1
port 4: eth0

查看OpenvSwitch 中的端口信息。从输出结果中,可以获得交换机对应的datapath ID (dpid),以及每个端口的OpenFlow端口编号,端口名称,当前状态等等。

ovs-ofctl show br0
OFPT_FEATURES_REPLY (xid=0x2): dpid:00007824af39ff9a
n_tables:254, n_buffers:256
capabilities: FLOW_STATS TABLE_STATS PORT_STATS QUEUE_STATS ARP_MATCH_IP
actions: OUTPUT SET_VLAN_VID SET_VLAN_PCP STRIP_VLAN SET_DL_SRC SET_DL_DST SET_NW_SRC SET_NW_DST SET_NW_TOS SET_TP_SRC SET_TP_DST ENQUEUE
 1(vnet0): addr:fe:54:00:0f:88:00
     config:     0
     state:      0
     current:    10MB-FD COPPER
     speed: 10 Mbps now, 0 Mbps max
 2(vnet1): addr:fe:54:00:b7:26:a9
     config:     0
     state:      0
     current:    10MB-FD COPPER
     speed: 10 Mbps now, 0 Mbps max
 3(eth0): addr:78:24:af:39:ff:9a
     config:     0
     state:      0
     current:    1GB-FD AUTO_NEG
     advertised: 10MB-HD 10MB-FD 100MB-HD 100MB-FD 1GB-FD COPPER AUTO_NEG AUTO_PAUSE AUTO_PAUSE_ASYM
     supported:  10MB-HD 10MB-FD 100MB-HD 100MB-FD 1GB-HD 1GB-FD COPPER AUTO_NEG
     speed: 1000 Mbps now, 1000 Mbps max
 LOCAL(br0): addr:78:24:af:39:ff:9a
     config:     0
     state:      0
     speed: 0 Mbps now, 0 Mbps max
OFPT_GET_CONFIG_REPLY (xid=0x4): frags=normal miss_send_len=0

如果想获得网络接口的OpenFlow编号,也可以在OVS的数据库中查询

ovs-vsctl get Interface vnet0 ofport
4

重定向数据包:
添加新的 OpenFlow条目,重定向所有的ICMP数据包到端口vnet1:

ovs-ofctl add-flow br0 idle_timeout=0,dl_type=0x0800,nw_proto=1,actions=output:2

监听端口:

sudo tcpdump -n -i vnet1 icmp

操作:host192.168.1.110 ping 192.168.1.152
在端口 vnet1上监控数据,发现数据包已被转发到端口vnet1

修改目地ip和mac:

ovs-ofctl add-flow br0 actions=mod_nw_dst:192.168.1.3,mod_dl_dst:78:24:af:39:ff:9a,normal

查看br0上所有的流规则:

ovs-ofctl dump-flows br0

删除所有流规则

ovs-ofctl del-flows br0

添加规则

ovs-ofctl add-flow br0 actions=normal

注:

flow有很多syntax, 一半来说actions之前都是match的部分,常用的一般是

in_port: switch的端口
dl_src:  源mac地址
dl_dst:  目的mac地址
nw_src:  源IP
nw_dst:   目的ip
dl_type:  以太网协议类型 0x0806是arp packet 0x0800是ip packet
nw_proto: 协议类型,注意和dl_type区分,同时也需要和dl_type一起使用,比如dl_type是ip(0x0800),那么nw_proto=1就表示icmp packet
tp_src: tcp udp源端口
tp_dst: tcp udp目的端口
ip     Same as dl_type=0x0800.
icmp    Same as dl_type=0x0800,nw_proto=1.
tcp    Same as dl_type=0x0800,nw_proto=6.
udp     Same as dl_type=0x0800,nw_proto=17.
arp    Same as dl_type=0x0806.
rarp    Same as dl_type=0x8035.

actions:
output:port
controller(key=value) 送到controller作为packet-in 消息,括号内的key valuepair可以是:
reason=reason ,reason 可以是action,no_match,invalid_ttl
id=controller-id 默认是0,特殊的controller会有一个16位的id

mod_dl_src:mac
      Sets the source Ethernet address to mac.

mod_dl_dst:mac
      Sets the destination Ethernet address to mac.

mod_nw_src:ip
      Sets the IPv4 source address to ip.


mod_nw_dst:ip
      Sets the IPv4 destination address to ip.


mod_tp_src:port
     Sets the TCP or UDP source port to port.

mod_tp_dst:port
    Sets the TCP or UDP destination port to port.

“`
(3)Floodlight连接OpenvSwitch 并进行管理。

一方面,OpenFlow控制器可以通过OpenFlow协议连接到任何支持OpenFlow的交换机,控制器通过和交换机交换流表规则来控制数据流向。另一方面,OpenFlow控制器向用户提供的界面或者接口,用户可以通过界面对网络架构进行动态的修改,修改交换机的流表规则等等。Floodlight是一个基于Apache协议,使用Java开发的企业级OpenFlow控制器。

1.安装JDK,ant 。可以选择安装eclipse,但是它不是一定要用得到的。

   sudo apt-get install build-essential default-jdk ant python-deveclipse

2.在另外一台机器上,下载Floodlight源码并编译 .

        $ git clone git://github.com/floodlight/floodlight.git 
        $ cd floodlight/ 
        $ ant

3.运行Floodlight:

       $ java -jar target/floodlight.jar 

4.Floodlight运行并将调试信息打到屏幕上:

    ps -ef | grep floodlight

  在安装了 OVS交换机的节点上,配置OVS交换机br0,使用Floodlight作为控制器。默认情况下,Floodlight在端口6633上进行监听,我们使用ovs-vsctl命令配置OVS交换机使用TCP协议连接到Floodlight(IP地址为192.168.1.225,端口号6633)。对于一个OVS交换机来说,可以同时配置一个或者多个控制器:

$ovs-vsctl set-controller br0 tcp:192.168.1.111:6633

   当 OVS交换机连接到 Floodlight控制器后,理论上所有的流表规则应该交给控制器来建立。由于OVS交换机和控制器之间是通过网络通讯来传递数据的,所以网络连接失败会影响到Flow的建立。针对这种情况,OVS提供了两种处理模式:
   standlone:默认模式。如果 OVS交换机超过三次无法正常连接到OpenFlow控制器,OVS交换机自己会负责建立流表。在这种模式下,OVS和常见的 L2交换机相似。与此同时,OVS也会继续尝试连接控制器,一旦网络连接恢复,OVS会再次切换到使用控制器进行流表管理。
   secure:在 secure模式下,如果 OVS无法正常连接到 OpenFlow控制器,OVS会不停的尝试与控制器重新建立连接,而不会自己负责建立流表。 设置 OVS的连接模式为secure模式:

 $ ovs-vsctl set Bridge ovs-switch fail-mode=secure
   通过访问Floodlight提供的Web管理界http://192.168.1.111:8080/ui/index.html,我们可以查看Floodlight控制器的状态以及所有连接到Floodlight的交换机列表.

你可能感兴趣的:(SDN,floodlight篇)