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的消息;
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
注意版本要适合操作系统内核:
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安装配置结束。
(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
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的交换机列表.