Floodlight
Floodlight是Apache授权并基于JAVA开发的企业级OpenFlow控制器,当前最新版本是1.2。
Floodlight OpenFlow Controller -ProjectFloodlight:http://www.projectfloodlight.org/floodlight/
流表
把同一时间,经过同一网络中具有某种共同特征或属性的数据抽象为一个流。比如,一般将访问同一目的地址的数据视为一个流。流一般由网络管理员定义的,可以根据不同的流执行不同的策略。
流表是针对特定流的策略表项的集合,负责数据包的查找和转发。流表是交换机进行转发策略控制的核心数据结构。交换机芯片通过查找流表项来决策进入交换机网络的数据包执行适当的处理动作。可以将其理解为交换机收到数据包之后该做什么的一系列规则。
OpenFlow每个流表项由三个部分组成:用于数据包匹配的包头域(Header Fields),用于统计匹配数据包个数的计数器(Counters),用于对匹配的数据包如何处理的动作(Actions)
包头域:
OpenFlow流表的包头域(OpenFlow v1.1之后被称作匹配域),用于对交换机接收到的数据包的包头内容进行匹配。在OpenFlow v1.0中,流表的包头域中包括了12个元组(Tuple):
(图片来源:Juniper Networks)
对应的中文解释:
计数器:
用于统计数据流量相关信息,可以针对交换机中的每张流表,每个数据流,设备端口,转发队列进行维护,用于统计数据流量的相关信息。
1)流表:统计当前活动的表项数,数据包查找次数,以及数据包匹配次数等。
2)数据流:统计接收到的数据包数、字节数、数据流持续时间等。
3)设备端口:统计接收到的数据包数,发送数据包数,接收字节数,发送字节数,错误发生的次数。
4)队列:发送的数据包数、字节数,溢出错误次数。
动作表:
用于指示交换机在收到匹配的数据包后,如何对其进行处理,每个流表项可以对应零到多个动作。
实验过程
在mininet 终端执行 h2 ping -f h1 模拟 Ping Flood Attack,会发现流量涨幅巨大。
调用Floodlight 的API 查询现有流表,返回为空:
添加一条静态流表,为了方便操作和查看,新建一个 ddos.json 的文件,将流表内容写入到这个文件,然后通过 API 进行提交
{
"switch" :"00:00:00:00:00:00:00:01",
"name" : "flow-mod-dropt",
"cookie" : "0",
"in _port" : "1",
"priority" : "100" ,
"active" : "true" ,
"actions " : "output=no-forward"
}
switch:交换机dpid
name:随意取一个名字即可
cookie:流表规则标识
in_port:入端口
priority:优先级
active:是否激活
actions:动作
下发流表Drop数据包 :
出现entry pushed表示流表下发成功,再次查询流表:
这样设置之后,确实能控制住流量,保证h1不被DDOS,但是即使是正常的h2对h1的访问也无法进行:
很明显是不恰当的,需要删除刚刚设置的流表,下发更合理的流表,让OpenFlowSwitch 只Drop掉 ICMP的流量,不影响正常的HTTP服务:
{
"switch" :"00:00:00:00:00:00:00:01",
"name" : "flow-mod-dropt",
"cookie" : "0",
"in _port" : "1",
"eth_type":"0x0800",
"ip_proto":"0x01",
"priority" : "100" ,
"active" : "true" ,
"actions " : "output=no-forward"
}
eth_type: 指定以太网类型为ipv4,ip_proto:指定协议类型为ICMP.
再次下发流表:
此时再观察流量和访问 h1 的HTTP服务
可以发现,流量下降到正常,但HTTP服务依然可以访问,没有受到影响。