原生OVS(未使用SDN控制器)初认识

栏目: 服务器 · 发布时间: 7年前

内容简介:原生OVS(未使用SDN控制器)初认识

安装OVS

OVS安装过程此处省略,参考 http://www.linuxidc.com/Linux/2017-06/144769.htm 。在本例中,会创建一个不连接到任何控制器的 OVS 交换机,并演示如何使用 ovs-octl 命令操作 OpenFlow 流表。

创建一个OVS 交换机

创建一个叫ovs-switch的交换机

$ ovs-vsctl add-br ovs-switch

创建一个端口 p0,设置端口 p0 的 OpenFlow 端口编号为 100(如果在创建端口的时候没有指定 OpenFlow 端口编号,OVS 会自动生成一个)。

$ ovs-vsctl add-port ovs-switch p0 -- set Interface p0 ofport_request=100

设置网络接口设备的类型为"internal"。对于 internal 类型的的网络接口,OVS 会同时在 Linux 系统中创建一个可以用来收发数据的模拟网络设备。我们可以为这个网络设备配置 IP 地址、进行数据监听等操作。

$ ovs-vsctl set Interface p0 type=internal  
$ ethtool -i p0  
driver: openvswitch  
version:   
firmware-version:   
bus-info:   
supports-statistics: no  
supports-test: no  
supports-eeprom-access: no  
supports-register-dump: no 

为了避免网络接口上的地址和本机已有网络地址冲突,我们可以创建一个虚拟网络空间 ns0,把 p0 接口移入网络空间 ns0,并配置 IP 地址为 192.168.1.100

$ ip netns add ns0  
$ ip link set p0 netns ns0  
$ ip netns exec ns0 ip addr add 192.168.1.100/24 dev p0 
$ ip netns exec ns0 ifconfig p0 promisc up

使用同样的方法创建端口 p1、p2

创建的端口信息

端口

说明

p0

IP 地址 : 192.168.1.100/24
网络名称空间 : ns0
网络接口 MAC 地址 : 66:4e:cc:ae:4d:20
OpenFlow Port Number: 100

p1

IP 地址 : 192.168.1.101/24
网络名称空间 : ns1
网络接口 MAC 地址 : 46:54:8a:95:dd:f8
OpenFlow Port Number: 101

p2

IP 地址 : 192.168.1.102/24, 
网络名称空间 : ns2
网络接口 MAC 地址 : 86:3b:c8:d0:44:10
OpenFlow Port Number: 102

创建所有的端口之后, 查看 OVS 交换机的信息

$ ovs-vsctl show  
30282710-d401-4187-8e13-52388f693df7 
    Bridge ovs-switch  
        Port "p0" 
            Interface "p0" 
                type: internal  
        Port "p2" 
            Interface "p2" 
                type: internal  
        Port "p1" 
            Interface "p1" 
                type: internal  
        Port ovs-switch  
            Interface ovs-switch  
                type: internal  

使用 ovs-ofctl 创建并测试 OpenFlow 命令

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

$ ovs-ofctl show ovs-switch  
OFPT_FEATURES_REPLY (xid=0x2): dpid:00001232a237ea45 
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  
 100(p0): addr:54:01:00:00:00:00 
     config:     PORT_DOWN  
     state:      LINK_DOWN  
     speed: 0 Mbps now, 0 Mbps max 
 101(p1): addr:54:01:00:00:00:00 
     config:     PORT_DOWN  
     state:      LINK_DOWN  
     speed: 0 Mbps now, 0 Mbps max 
 102(p2): addr:54:01:00:00:00:00 
     config:     PORT_DOWN  
     state:      LINK_DOWN  
     speed: 0 Mbps now, 0 Mbps max 
 LOCAL(ovs-switch): addr:12:32:a2:37:ea:45 
     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 p0 ofport  
100 

查看 datapath 的信息

$ ovs-dpctl show  
system@ovs-system:  
lookups: hit:12173 missed:712 lost:0 
flows: 0 
port 0: ovs-system (internal) 
port 1: ovs-switch (internal) 
port 2: p0 (internal) 
port 3: p1 (internal) 
port 4: p2 (internal) 

屏蔽数据包

屏蔽所有进入 OVS 的以太网广播数据包

$ ovs-ofctl add-flow ovs-switch "table=0, dl_src=01:00:00:00:00:00/01:00:00:00:00:00, actions=drop"

屏蔽 STP 协议的广播数据包

$ ovs-ofctl add-flow ovs-switch "table=0, dl_dst=01:80:c2:00:00:00/ff:ff:ff:ff:ff:f0, actions=drop"

修改数据包

添加新的 OpenFlow 条目,修改从端口 p0 收到的数据包的源地址为 9.181.137.1

$ ovs-ofctl add-flow ovs-switch "priority=1 idle_timeout=0,\ 
    in_port=100,actions=mod_nw_src:9.181.137.1,normal" 

从端口 p0(192.168.1.100)发送测试数据到端口 p1(192.168.1.101)

$ ip netns exec ns0 ping 192.168.1.101

在接收端口 p1 监控数据,发现接收到的数据包的来源已经被修改为 9.181.137.1

$ ip netns exec ns1 tcpdump -i p1 icmp 
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode 
listening on p1, link-type EN10MB (Ethernet), capture size 65535 bytes 
15:59:16.885770 IP 9.181.137.1 > 192.168.1.101: ICMP echo request, id 23111, seq 457, length 64 
15:59:17.893809 IP 9.181.137.1 > 192.168.1.101: ICMP echo request, id 23111, seq 458, length 64 

重定向数据包

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

$ ovs-ofctl add-flow ovs-switch idle_timeout=0,dl_type=0x0800,nw_proto=1,actions=output:102

从端口 p0 (192.168.1.100)发送数据到端口 p1(192.168.1.101)

$ ip netns exec ns0 ping 192.168.1.101

在端口 p2 上监控数据,发现数据包已被转发到端口 p2

$ ip netns exec ns3 tcpdump -i p2 icmp 
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode 
listening on p2, link-type EN10MB (Ethernet), capture size 65535 bytes 
16:07:35.677770 IP 192.168.1.100 > 192.168.1.101: ICMP echo request, id 23147, seq 25, length 64 
16:07:36.685824 IP 192.168.1.100 > 192.168.1.101: ICMP echo request, id 23147, seq 26, length 64 

修改数据包的 VLAN Tag

除了使用"ping"、"tcpdump"和"iperf" 等 Linux 命令以外,我们也可以使用 OVS 提供的 ovs-appctl ofproto/trace 工具来测试 OVS 对数据包的转发状况。ovs-appctl ofproto/trace 可以用来生成测试用的模拟数据包,并一步步的展示 OVS 对数据包的流处理过程。在以下的例子中,我们演示一下如何使用这个命令:

修改端口 p1 的 VLAN tag 为 101,使端口 p1 成为一个隶属于 VLAN 101 的端口

$ ovs-vsctl set Port p1 tag=101

现在由于端口 p0 和 p1 属于不同的 VLAN,它们之间无法进行数据交换。我们使用 ovs-appctl ofproto/trace 生成一个从端口 p0 发送到端口 p1 的数据包,这个数据包不包含任何 VLAN tag,并观察 OVS 的处理过程

在第一行输出中,"Flow:"之后的字段描述了输入的流的信息。由于我们没有指定太多信息,所以多数字段 (例如 dl_type 和 vlan_tci)被 OVS 设置为空值。

在第二行的输出中,"Rule:" 之后的字段描述了匹配成功的流表项。

在第三行的输出中,"OpenFlow actions"之后的字段描述了实际执行的操作。

最后一段以"Final flow"开始的字段是整个处理过程的总结,"Datapath actions: 4,1"代表数据包被发送到 datapath 的 4 和 1 号端口。

$ ovs-appctl ofproto/trace ovs-switch in_port=100,dl_src=66:4e:cc:ae:4d:20, 
dl_dst=46:54:8a:95:dd:f8 -generate 
Flow:metadata=0,in_port=100,vlan_tci=0x0000,dl_src=66:4e:cc:ae:4d:20, 
 dl_dst=46:54:8a:95:dd:f8,dl_type=0x0000 
Rule: table=0 cookie=0 priority=0 
OpenFlow actions=NORMAL  
no learned MAC for destination, flooding 
  
Final flow: unchanged  
Relevant fields: skb_priority=0,in_port=100,vlan_tci=0x0000/0x1fff,\ 
dl_src=66:4e:cc:ae:4d:20,dl_dst=46:54:8a:95:dd:f8,dl_type=0x0000,nw_frag=no 
Datapath actions: 4,1 创建一条新的 Flow:对于从端口 p0 进入交换机的数据包,如果它不包含任何 VLAN tag,则自动为它添加 VLAN tag 101
$ ovs-ofctl add-flow ovs-switch "priority=3,in_port=100,dl_vlan=0xffff,\

actions=mod_vlan_vid:101,normal"

再次尝试从端口 p0 发送一个不包含任何 VLAN tag 的数据包,发现数据包进入端口 p0 之后, 会被加上 VLAN tag101, 同时转发到端口 p1 上

$ ovs-appctl ofproto/trace ovs-switch in_port=100,dl_src=66:4e:cc:ae:4d:20, 
dl_dst=46:54:8a:95:dd:f8 –generate 
Flow: metadata=0,in_port=100,vlan_tci=0x0000,dl_src=66:4e:cc:ae:4d:20, 
dl_dst=46:54:8a:95:dd:f8,dl_type=0x0000 
Rule: table=0 cookie=0 priority=3,in_port=100,vlan_tci=0x0000 
OpenFlow actions=mod_vlan_vid:101,NORMAL 
forwarding to learned port  
  
Final flow: metadata=0,in_port=100,dl_vlan=101,dl_vlan_pcp=0,dl_src=66:4e:cc:ae:4d:20, 
dl_dst=46:54:8a:95:dd:f8,dl_type=0x0000 
Relevant fields: skb_priority=0,in_port=100,vlan_tci=0x0000/0x1fff,dl_src=66:4e:cc:ae:4d:20, 
dl_dst=46:54:8a:95:dd:f8,dl_type=0x0000,nw_frag=no 
Datapath actions: 3 

反过来从端口 p1 发送数据包,由于 p1 现在是带有 VLAN tag 101 的 Access 类型的端口,所以数据包进入端口 p1 之后,会被 OVS 添加 VLAN tag 101 并发送到端口 p0

$ ovs-appctl ofproto/trace ovs-switch in_port=101,dl_dst=66:4e:cc:ae:4d:20,

dl_src=46:54:8a:95:dd:f8 -generate 
Flow: metadata=0,in_port=101,vlan_tci=0x0000,dl_src=46:54:8a:95:dd:f8, 
dl_dst=66:4e:cc:ae:4d:20,dl_type=0x0000 
Rule: table=0 cookie=0 priority=0 
OpenFlow actions=NORMAL  
forwarding to learned port  
  
Final flow: unchanged  
Relevant fields: skb_priority=0,in_port=101,vlan_tci=0x0000,dl_src=46:54:8a:95:dd:f8, 
dl_dst=66:4e:cc:ae:4d:20,dl_type=0x0000,nw_frag=no 
Datapath actions: push_vlan(vid=101,pcp=0),2 

其他 OpenFlow 常用的操作

查看交换机中的所有 Table

ovs-ofctl dump-tables ovs-switch

查看交换机中的所有流表项

ovs-ofctl dump-flows ovs-switch

删除编号为 100 的端口上的所有流表项

ovs-ofctl del-flows ovs-switch "in_port=100"

查看交换机上的端口信息

ovs-ofctl show ovs-switch

本文永久更新链接地址 http://www.linuxidc.com/Linux/2017-06/144768.htm


以上所述就是小编给大家介绍的《原生OVS(未使用SDN控制器)初认识》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Pro Git

Pro Git

Scott Chacon / Apress / 2009-8-27 / USD 34.99

Git is the version control system developed by Linus Torvalds for Linux kernel development. It took the open source world by storm since its inception in 2005, and is used by small development shops a......一起来看看 《Pro Git》 这本书的介绍吧!

JS 压缩/解压工具
JS 压缩/解压工具

在线压缩/解压 JS 代码

HTML 编码/解码
HTML 编码/解码

HTML 编码/解码

Base64 编码/解码
Base64 编码/解码

Base64 编码/解码