OpenvSwitch + OpenFlow:Let’s get start(翻译自国外某大牛)

2024-06-16 01:32

本文主要是介绍OpenvSwitch + OpenFlow:Let’s get start(翻译自国外某大牛),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

OpenvSwitch + OpenFlow:Let’s get start

Fedora完成OpenvSwitch+OpenFLow部署所需要的用户空间工具、必备的内核模块都应经包含在Fedora的发布版中了。我在弄清楚这些包的时候花了很多时间,现在,这里有介绍了如何使用这些组件的信息。

*注:下文中简称OpenvSwitchOVS

1、简介:

自从2.4版本以来,OVS对于内核中网桥模块来说是可选择的。OVS比标准的网桥模块有非常大的改进。这些改进都会在OpenvSwitch.org这个网站中进行了详细的阐述。然而在这些增强的功能中,有一项便是:支持OpenFlow协议。

 

从概念上来讲,交换机功能可以分成两个部分:控制层和数据层。而控制层是交换机处理发现、路由、通路计算,与其他交换机通信等功能的核心。控制层创建一个转发流表,数据层根据这些流表以线路速度处理进入交换机的数据包。OpenFlow协议可以将将交换机的控制层分离到控制器中,并且用软件定义整个网络的行为(也被称为SDN)。

 

与这种(OpenFlow)设置相区别,现有的交换机使用专有的下层工具/协议来进行管理。OpenFlow成为一种可以开放的标准,它可以不为下层绑定专有的工具而统一的标准管理来自不同供应商的交换机。

2、安装:

Fedora中,OVS的实现分为两个部分:OVS内核模块(数据层data pane)和用户空间工具(控制层control pane)。由于输入的数据包要尽快处理,OVS的数据层被推送到内核空间。

为了使用OVS进行网络的虚拟化时,OVS服务必须启动,并且命令行工具必须已经正确的配置,OVS是架在网桥上的。在Fedora中,虚拟交换机工作在两种模式下:独立主机和OpenFlow模式。

这篇文章首先会重点介绍如何在独立主机和OpenFlow两种模式下建立可以连接到OVS网桥的虚拟机。

在这之前,先安装一下OVStunctl包:

$yum install openvswitch 

3、桥接:

3.1、独立主机模式

如题,在这种模式下虚拟交换机处理所有自身的交换/转发功能。为虚拟交换机搭建网桥:

$service openvswitch start

使用标准tunctl命令行工具创建一个虚拟网卡设备:

$tunctl -t tap0 -u root

使用如下的命令停止网络管路服务,关闭em0接口,清空em1接口(em1接口是虚拟机使用的接入物理网络的网卡)上所有的IP地址。

$service NetworkManager stop

$ip add flush em1

$ifconfig down em1

运行如下命令创建一个虚拟交换机网桥,并命名为”ovs-switch”:

$ovs-vsctl add-br ovs-switch ##(创建一个”ovs-switch”网桥)

$ovs-vsctl add-port ovs-switch tap0 ##(为网桥添加虚拟网卡设备接口)

$ovs-vsctk add-port ovs-switch em1 ##(为网桥添加em1接口)

$ifconfig tap0 promisc up ##(在混杂模式下启动接口)

$ifconfig em1 promisc up

这些命令创建了一个新的网桥并添加了一个虚拟网卡设备并为网桥添加了一个本地网络端口(em1),在混杂模式下设置这些端口会建立虚拟机到物理网络之间的数据转发通路,反之亦然。设置OVS交换机DHCP接口的IP地址:

$dhclient ovs-switch

现在,你可以使用如下命令启动你虚拟机:

$/usr/bin/qemu-kvm -smp 2,cores=2 -net tap,ifname=tap0,script=no 

-net nic,model=rt18139,macaddr=52:54:00:45:67:30 -m 2048M

 ~/mutiqueue/fedora.img

*注:上面三行命令为一条命令,行与行之间为空格隔开

虚拟管理台还不支持OVS,所以目前还没有用来启动虚拟机的OVS虚拟控制台。

3.2OpenFlow模式

OpenFlow模式下运行OVS,上文的很多命令还会被用到。所以将上面的命令全部拷贝到下面:

$yum install openvswitch

$service openvswitch start

$ovs-vsctl add-br of-switch

$ovs-vsctl add-port of-switch tap0

$ovs-vsctl add-port of-switch em1

$ifconfig tap0 promisc up

$ifconfig em1 promisc up

*注:在OpenFlow模式下网桥设置指向这边的虚拟交换机

(原文:NOTE:the bridge setup in OpenFlow mode will be referred to as of-switch here on

4、POX Controller

在此之前,OpenFlow控制器必须已经正确运行,在网桥启动时转发任何数据都必须和控制器通信。无论是硬件还是软件,控制器的选择都相当的多。本文中采用的是POX控制器(Software)。下载POX的源代码:https://github.com/noxrepo/pox。你也可以通过命令获得:

$git clone https://github.com/noxrepo/pox

下载之后控制器就能这样运行:

$./pox.py forward.12_learning

上面的命令让POX监听所有的网络接口。如果POX已经监听了某个特定的接口或端口,你可以这样启动POX

$./pox.py OpenFlow.of_01 --address=192.168.2.197 --port=6666 forwarding.12_learning

 

OVS不支持混在OpenFlow模式,混杂OpenFlow模式就是一部分数据通路由OVS内置的交换逻辑处理,另一部分由OpenFlow控制器处理。(The openvswitch has a failure mode of operation though)。如果交换机与控制器断开连接,OVS可以回转并使用自身内置的逻辑进行转发。这种回转机制能通过以下命令实现:

$ovs-vsctl set-fail-mode ovs-switch standlone

上述的命令可以使得网桥在某些时间断开连接后回到独立主机模式

$ovs-vsxtl set-fail-mode ovs-switch secure

在设置回转模式为安全状态后,如果连接OF控制器失败,交换机不会转发任何数据包。

4.1、远程控制器

考虑到OF控制器可能运行在远程的主机上,并且虚拟交换机的网桥以安全模式运行的情况。如果在OF交换机上执行dpclient命令,交换机是不知道怎样通过DHCP通路转发数据的,因为它没有远程控制器的IP地址。所以,你既需要将设置OF交换机的接口设置为回转模式到独立主机模式或者分配一个静态的IP并且设置静态的路由那么,网桥将能够接入远程控制器。一旦网桥年建立了到远程控制器的连接,这些通路信息将会被OF控制器中的网桥(基于插件安装)转发。

 

既然网桥和OF控制器已经正在运行,那么可以通过以下命令将控制器信息分配到网桥。

$ovs-vsctl set-controller of-switch tcp:0.0.0.0:6633

*注:输入以上全部命令之后,网桥通过本的主机的6633端口,连接到一个OF控制器上。

5、相关命令

既然网桥和控制器已经配置完毕,你现在可以启动虚拟机(如上面的qemu命令所示)了,并且得到控制器指定的通路。无论何时,当一个新的数据包进来,但网桥中被没有相应的处理方法的信息,网桥将会发送该数据包的包头(包含了2层、3层甚至一些4层的信息)到控制器。控制器回发OF命令作为响应,告诉网桥该如何转发类似的数据包。这些因此而被分配到网桥的流可以通过一下命令罗列出来:

$ovs-ofctl dump-flows of-switch

下面是一个类似的控制器响应的例子。一个流表项最初包含一组域=值表项和行动表项(原文:A flow entry primarily contains a set of filed=value entries and action entry)。域=(value)表项的被用来认证进入的数据包,操作表项则告诉网桥匹配什么通路和执行那些操作。

cocookie=0x0, duration=14.604s, table=0, n_packets=61, n_bytes=7418, idle_timeout=10,  hard_timeout=30,tcp, vlan_tci=0x0000, dl_src=78:2b:cb:4b:db:c5, dl_dst=00:21:9b:8e:36:62,  nw_src=192.168.7.189, nw_dst=192.168.1.150, nw_tos=0, tp_src=22, tp_dst=60221
actions=output:1

上面的流信息不言而喻。如果通路来自源物理地址(src mac address)78:2b:4b:db:c5,目的物理地址(desrination mac address)00:21:9b:8e:36:62,通路(traffic)TCP通路,源IP=192.168.7.189,目的IP=192.168.1.150TCP源端口为22TCP目的端口60221 转发包端口1(actions:1)

在网桥上的端口配置可以用以下命令查看:

$ovs-ofctl show ovs 

 

OFPT_FEATURES_REPLY (xid=0x1): ver:0x1,
dpid:0000782bcb4bdbc5

n_tables:255, n_buffers:256

features: capabilities:0xc7, actions:0xfff

 1(em1): addr:78:2b:cb:4b:db:c5

     config:     0

     state:      0

     current:    1GB-FD COPPER AUTO_NEG

     advertised:
10MB-HD 10MB-FD 100MB-HD 100MB-FD 1GB-HD 1GB-FD COPPER AUTO_NEG AUTO_PAUSE

    
supported:  10MB-HD 10MB-FD
100MB-HD 100MB-FD 1GB-HD 1GB-FD COPPER AUTO_NEG

 2(tap0): addr:a6:30:4d:0f:40:49

     config:     0

     state:      LINK_DOWN

     current:    10MB-FD COPPER

 LOCAL(ovs): addr:78:2b:cb:4b:db:c5

     config:     0

     state:      0

OFPT_GET_CONFIG_REPLY (xid=0x3): frags=normal
miss_send_len=0

根据以上提及的流,通路(traffic)被转发到主机em1接口的端口1

 

如果必要的话,某些用户流可以手动分配到网桥,下面就是一些例子:

$ovs-ofctl add-flow of-switch

 

"in_port=LOCAL,table=0,idle_timeout=60,ip,hard_timeout=60,vlan_tci=0x0000, dl_src=78:2b:cb:4b:db:c5,dl_dst=00:09:8a:02:80:c0, nw_proto=1,nw_dst=192.168.1.100, n w_src=192.168.7.189,actions=drop"

 

以上规则使网桥丢弃所有192.168.7.189192.168.1.100ICMP通路(nw_prpto=1)

 

正如上面所展示的add-flow的例子,value idle_timeouthard_timeout是定义所有的流的。这些值告诉网桥这些规则会被网桥使用多长时间。相关流在超过定义的时间不活动的话idle_timeout就会导致这些流被删除。而hard_timeout则会在超过定义时间后不管在此期间流是否活跃,都将相关的流删除。如果要在网桥中配置了静态的规则,则需要把hard_timeoutidle_time的值都设置为0.

 

以上包含了我到目前位置的所有研究。希望这篇文章将会帮助到更多的用户开启研究openFlow技术的旅途!

 

免责申明:

以上的文章仅仅是为了信息的即时传递。内容来自翻译相关技术文档和术语。这些提供的信息可能包含排版上或技术的错误。

这篇关于OpenvSwitch + OpenFlow:Let’s get start(翻译自国外某大牛)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1065142

相关文章

BD错误集锦3——ERROR: Can't get master address from ZooKeeper; znode data == null

hbase集群没启动,傻子!   启动集群 [s233 s234 s235]启动zk集群 $>zkServer.sh start $>zkServer.sh status   [s233] 启动dfs系统 $>start-dfs.sh 如果s237 namenode启动失败,则 [s237] $>hadoop-daemon.sh start namenode [s233]启动yarn集群

[分布式网络通讯框架]----Zookeeper客户端基本操作----ls、get、create、set、delete

Zookeeper数据结构 zk客户端常用命令 进入客户端 在bin目录下输入./zkCli.sh 查看根目录下数据ls / 注意:要查看哪一个节点,必须把路径写全 查看节点数据信息 get /第一行代码数据,没有的话表示没有数据 创建节点create /sl 20 /sl为节点的路径,20为节点的数据 注意,不能跨越创建,也就是说,创建sl2的时候,必须确保sl

【鸿蒙】ERROR_GET_BUNDLE_INSTALLER_FAILED

错误信息 [ERROR_GET_BUNDLE_INSTALLER_FAILED] Troubleshooting guide $ hdc file send D:\Huawei\devEcoProjects\entry\build\default\outputs\default\entry-default-unsigned.hap /sdcard/e8a215ea7be1444197e6a58e

Kimichat使用案例026:AI翻译英语PDF文档的3种方法

文章目录 一、介绍二、腾讯交互翻译TranSmart https://transmart.qq.com/三、沉浸式翻译三、谷歌网页翻译 一、介绍 短的文章,直接丢进kimichat、ChatGPT里面很快就可以翻译完成,而且效果很佳。但是,很长的PDF文档整篇需要翻译,怎么办呢? 二、腾讯交互翻译TranSmart https://transmart.qq.com/ 软件

关于IE get 请求报400

问题描述: 在使用IE8进行get请求时,参数中有中文存在,发现发送请求之后,返回http状态码400 问题解决方法: 把请求连接进行处理window.encodeURI('http://aaa:8080/wtp?name=小明'); window.location.href=window.encodeURI('http://aaa:8080/wtp?name=小明'); 然后在把处理后

Creating custom and compound Views in Android - Tutorial(翻译)

Creating custom and compound Views in Android - Tutorial(翻译) 译前的: 之前做了三篇学习笔记,从知乎上面看到了这篇英文的推荐,总的来说可以是一篇导读,没有相关的学习,看这篇,可以作为一个学习脉络导向;有相关的学习底子,可以作为一个基础夯实、思维理清。没想到一翻译就是四个多小时…英语渣,很多词句都不太准确,幸好有之前的学习基础打底…

面试题3:GET 和 POST 有什么区别?

[!]高频面试题。 GET 和 POST 没有本质区别,可以进行相互代替。 1、GET语义:“从服务器获取数据”;POST语义:“往服务器上提交数据”。[设计初衷,不一定要遵守] 2、发请求时,给服务器传递的数据,GET 一般是放在查询字符串中,但GET 也可以把数据放在 body 里。不过比较少见,以至于浏览器不一定能支持,不过其他的http客户端可以支持;POST 一般是放在 body 中

使用Let‘s Encrypt 申请通配符证书

为什么不使用阿里云/腾讯云等公有云厂商提供的免费证书? 上篇介绍了从阿里云上面申请免费证书,有效期一年 为网站配置https证书 公有云提供的证书不支持通配符,只支持某个确定的解析。 不管是二级域名还是三级域名,只要是具体的确定的地址,都可以使用。 对于某个域名,如果DNS解析很少,如只有mail.abc.com,www.abc.com,blog.abc.com, 用公有云需要分别为

Elasticsearch java API (10)Multi Get API

Multi Get API编辑 多让API允许基于他们得到的文档列表 index, type和 id: MultiGetResponse multiGetItemResponses = client.prepareMultiGet().add("twitter", "tweet", "1") // <1> .add("twitter", "tweet

Elasticsearch java API (7)GET API

GET API编辑 On this page 操作线程 get API允许获得类型从指数基于JSON文档id。下面的例子得到一个JSON文档的索引称为twitter,在一种称为tweet,id为价值1: GetResponse response = client.prepareGet("twitter", "tweet", "1").get(); 在g