最近在学习Pox,为了加深印象,对Pox wiki中的Pox组件写了些笔记。
按照组件的功能进行分类:
L2层地址学习、洪泛
forwarding.hub
forwarding.l2_learning
forwarding.l2_pairs
forwarding.l2_multi
forwarding.l2_nx
L3层地址学习
forwarding.l3_learning
构建拓扑
openflow.discovery
openflow.spanning_tree
forwarding.topo_proactive
openflow 连接相关
openflow.of_01
misc.full_payload
openflow.keepalive
pox内部服务
py
web.webcore
messenger
openflow.debug
pox网络服务应用
proto.arp_responder
proto.pong
proto.dns_spy
proto.dhcp_client
proto.dhcpd
misc.nat
misc.ip_loadbalancer
pox功能扩展
info.packet_dump
misc.of_tutorial
misc.mac_blocker
misc.gephi_topo
openflow.webservice
原文档 Stanford Pox wiki https://openflow.stanford.edu/display/ONL/POX+Wiki#POXWiki-ComponentsinPOX
组件说明
py
POX的交互式Python解释执行组件,用于DEBUG和交互式实验。默认执行,除非添加命令 --no-cli。其他组件可以向该解释器添加函数和值。
forwarding.hub
该组件每个交换机添加洪泛通配符规则,将所有交换机等效于ethernet集线器
forwarding.l2_learning
该组件使opennflow交换机实现 L2链路层上的地址学习(类似网桥?)。但当该组件学习地址学习时,向流表下发的规则会尽可能的准确,而不仅仅是L2层的地址。例如不同的TCP连接将产生不同的表项。
forwarding.l2_pairs
类似于
forwarding.l2_learning,l2_pairs让交换机进行地址学习,但该组件是尽可能的简化规则学习,所有安装的表项时只使用L2层信息(如Mac地址)。
forwarding.l3_learning
该组件并不是一个完整的Router,该组件是可POX的packet library(代码)的一个实现样例,可以构造ARP请求和回复。l3_learning关心IP从哪来,但并不关心IP的填充域,如子网等。
forwarding.l2_multi
L2层地址学习,但该层的学习不是单个交换机的独立学习,而是通过
openflow.discovery交换机之间交换拓扑信息,学习整个网络的拓扑结构。只要网络中有一个交换机学习到一个新的Mac地址及其位置,所有的交换机就都能学会。
forwarding.l2_nx
Open vSwitch的quick-and-dirty组件,需要使用Openvswitch的Nicira扩展安装。
forwarding.topo_proactive
基于重要拓扑的IP地址安装规则。通过DHCP进行地址分配。所有的主机都必须用指定的IP地址,绝大部分规则都是主动安装(?)。该组件被添加至聚合规则复用分支中,路由编码基于l2_multi组件。该组件依赖openflow.discovery以及openflow.spanning_tree组件(有待确认)。
openflow.spanning_tree
该组件使用discovery组件来创建网络拓扑的视图,构造一棵生成树,然后使不在生成树中的交换机端口的洪泛功能失效,使得网络中不存在洪泛回路。需要注意的是该组件同生成树协议没有很大关系,只是有相似的目的。两个选项:
--no-flood,只要交换机连接上了就使该交换机的所有端口洪泛失效,对于某些端口,稍后将使能。
--hold-down,防止洪泛控制在一个完整的发现回路完成前被改变
因此该组件最安全的的使用方法是
openflow.spanning_tree --no-flood --hold-down
.
openflow.webservice
Openflow的一个简单
JSON-RPC-ish web service交互式接口,由of_service信息服务派生而来,依赖于webcore组件。可以使用HTTP POST方式发送JSON进行访问。
目前支持的方法有:
method
get_switch_desc,获取指定交换机详细信息
get_switches,获取交换机列表和基本信息
set_table , 设置指定交换机的流表
web.webcore
在Pox进程中启动一个web服务,其他组件可以通过它提供静态或动态内容。
messenger
该组件通过双向JSON消息为POX在进程间提供了一个交互接口。该组件本质上是API,通过TCP Socket和HTTP进行通信。具体的功能通过Services实现。messenger.log_service允许远程操作log(读log信息,配置log等)。openflow.of_service 允许一下Openflow的操作(如显示交换机列表,设置流表表项等)。./tools/pox-log.py是一个独立的Python应用,可以通过TCP同log服务进行交互。
openflow.of_01
该组件同openflow 1.0协议版本的交换机 进行通讯,默认启动。
openflow.discovery
该组件在交换机之间使用特制的LLDP报文来发现整个网络的拓扑结构。当链路生效或者失效时,该组件都会产生一个事件(Raise Events)。
openflow.debug
加载该组件将导致POX创建pcap追踪(进行抓包),包括openflow报文,可导入wireshark进行分析。该工具并不能完全代替wireshark或tcpdump,不过有一个比较好的特性是每一个openflow报文都一个完整的帧中。
openflow.keepalive
该组件令POX向已经连接的交换机周期性的发送echo请求。但这会解决两个问题:
第一,有些交换机(包括推荐交换机)会认为空闲连接意味着同控制器连接丢失,将会在一段silence时间后断开
连接。
第二,如果网络与交换机断开,控制器将不会立即获得一个FIN或RST,所以将会很难确定一个交换机失效。通过周期行发送echo请求,并分析交换机的响应,即可解决该问题。
proto.pong
该组件是一个简单的检测ICMP echo请求和应答的样例组件
proto.arp_responder
该组件为一个ARP应用,可以学习和代理ARP请求,也可以通过查询静态的表项来回复ARP请求。该组件提供了一个控制台交互界面来查询和修改arp表。
info.packet_dump
该组件将packet_in信息保存至log中,有点类似于在交换机中运行tcpdump
proto.dns_spy
检测DNS应答并存储应答结果,其他组件可以通过DNSSpy检测这些信息。
proto.dhcp_client
DHCP客户端,在同其他组件进行联合时有用(??)
proto.dhcpd
简单的DHCP服务器端,服务器本身的默认地址为192.168.0.254,下发的地址域为192.168.0.1~192.168.0.253,同时宣称自身为网关和DNS服务器。
misc.of_tutorial
配合openflow tutorial使用的组件,类似于简单的hub,但可以修改成L2 learning的交换机
misc.full_payload
默认情况下,当一个数据包在交换机流表中没有命中时,交换机只向控制器发送数据包的前128bytes,使用该组件可以将每一个交换机配置成发送整个数据包
misc.mac_blocker
具有Tkinter-based界面,可以阻塞Mac地址
misc.nat
实现网络地址转换的组件(木有详细介绍)
misc.ip_loadbalancer
由carp branch(不理解是啥)启用的TCP负载均衡器
misc.gephi_topo
检测拓扑结构,并将其导入到gephi中进行分析