Floodlight API简介

背景

Floodlight是Apache授权并且基于JAVA开发的企业级Openflow控制器,它的稳定性、易用性已经得到SDN专业人士以及爱好者们的一致好评,并因其完全开源,这让SDN网络世界变得更加有活力。控制器作为SDN网络中的重要组成部分,能集中地灵活控制SDN网络,为核心网络及应用创新提供了良好的扩展平台。

Floodlight提供的API接口:ACL,防火墙,静态流表,虚拟网。

环境                                                                      

  • Ubuntu14.04LTS in VM
  • Mininet
  • Floodlight

访问控制(ACL)

Floodlight包含以响应方式执行A​​CL的防火墙应用程序。控制器通过监视Packet-in消息来响应性地执行A​​CL规则,然后推送流表。然而,通过主动添加ACL规则方式,控制器执行ACL规则而不用监视Packet-in消息,从而避免额外的延迟。 ACL应用程序解析用户的REST更新ACL请求,并以主动的方式通过静态流表强制执行,而无需监视Packet-in消息。删除相关的ACL规则时,还可以及时删除生成的ACL流表。

增加ACL规则:

curl -X POST -d '{"src-ip":"10.0.0.1/32","dst-ip":"10.0.0.2/32","action":"deny"}' http://controller_ip:8080/wm/acl/rules/json

显示所有ACL规则:

curl http://controller_ip:8080/wm/acl/rules/json | python -mjson.tool

删除ACL规则:

curl -X DELETE -d '{"ruleid":"1" }' http://controller_ip:8080/wm/acl/rules/json

删除所有ACL规则:

curl http://controller_ip:8080/wm/acl/clear/json

ACL规则的属性:

属性

类型

备注

 nw-protp

                 string

TCP或UDP或ICMP

src-ip

ipv4地址[/子网掩码]

必填

dst-ip

ipv4地址[/子网掩码]

必填

tp-dst

number

nw-proto ==“TCP”或“UDP”时有效。

action

string

"DENY" 或者 "ALLOW",没有指定默认"DENY"

注意点:

l  较早添加的ACL规则有较高的优先级

l  ACL由静态流表组成

l  Src-ip Dst-ip必填

静态流表(Static Entry Pusher)

用户通过REST API公开的Floodlight模块,允许用户手动将流表和组下发到OpenFlow网络。
OpenFlow支持两种流下发方式:主动和被动。当数据包到达没有匹配流的OpenFlow交换机时,就会发生响应流表下发。数据包被发送到控制器,它对其进行分析,添加适当的流表,并让交换机继续转发。或者,在数据包到达之前,可以通过控制器在交换机中主动下发流表。Floodlight支持两种机制。Static Entry Pusher通常用于响应式。

请注意,默认情况下,Floodlight会加载响应流表下发的Forwading模块。可以从floodlight.properties文件中删除转发。

下发流表:

curl -X POST -d '{"switch":"00:00:00:00:00:00:00:01", "name":"flow-mod-1", "cookie":"0", "priority":"32768", "in_port":"1","active":"true", "actions":"output=2"}' http://controller_ip:8080/wm/staticentrypusher/json

查看流表:

curl http://controller_ip:8080/wm/staticentrypusher/list/00:00:00:00:00:00:00:01/json

查看所有流表:

curl http://controller_ip:8080/wm/staticentrypusher/list/all/json

清空某一交换机上的所有流表:

curl http://controller_ip:8080/wm/staticentrypusher/clear/00:00:00:00:00:00:00:01/json

清空所有流表:

curl http://controller_ip:8080/wm/staticentrypusher/clear/all/json

删除流表:

curl -X DELETE -d '{"name":"flow-mod-1"}' http://controller_ip:8080/wm/staticentrypusher/json

必须输入的属性:

属性

类型

备注

name

string

唯一,作为流表的主键

switch

switch DPIP

格式:xx:xx:xx:xx:xx:xx:xx:xx

entry_type

string

“flow” 或者 “group”,未填默认flow

保留端口关键字:

保留端口

备注

all

所有的端口

flood

所有的端口,除了入端口和禁止flood的端口

in_port

数据包入端口

local

本地网络栈交换机端口

normal

交换机L2/L3 pipeline

any

任一交换机端口

controller

控制器端口

可选动作:

属性

类型

必要条件

支持OF版本

备注

output

number/保留端口

all

没有丢包选项

set_vlan_vid

number

eth_vlan_vid = something 

1.0

十六进制(0x开头)或十进制

set_eth_src

MAC地址

1.0-1.1

xx:xx:xx:xx:xx:xx

set_eth_dst

MAC地址

1.0-1.1

xx:xx:xx:xx:xx:xx

set_ipv4_src

IPv4 [/mask]

eth_type = 0x0800

1.0-1.1

xx.xx.xx.xx

set_ipv4_dst

IPv4 [/mask]

eth_type = 0x0800

1.0-1.1

xx.xx.xx.xx

group

number

1.1+

十六进制(0x开头)或十进制

enqueue

number:number

1.0

第一个数字是端口号,第二个则是队列号。十六进制(0x开头)或十进制

set_queue

number

1.1_

十六进制(0x开头)或十进制

strip_vlan

eth_vlan_vid = something

1.0

set_vlan_pcp

number

eth_vlan_vid = something

1.0

set_vlan_pcp

number

eth_vlan_vid = something

all

十六进制(0x开头)或十进制

push_vlan

eth-type-number

1.1+

十六进制(0x开头)或十进制。必须单独执行来设置VLAN ID

pop_vlan

eth_vlan_vid = something

1.1+

set_ip_tos

number

eth_type = 0x0800 || 0x86dd

1.0

十六进制(0x开头)或十进制

set_ip_ecn

number

eth_type = 0x0800 || 0x86dd

1.0

十六进制(0x开头)或十进制

set_ip_ttl

number

eth_type = 0x0800 || 0x86dd

1.1+

十六进制(0x开头)或十进制

dec_ip_ttl

eth_type = 0x0800 || 0x86dd

1.1+

十六进制(0x开头)或十进制

copy_ip_ttl_in

eth_type = 0x0800 || 0x86dd

1.1+

copy_ip_ttl_out

eth_type = 0x0800 || 0x86dd

1.1+

set_mpls_label

number

eth_type = 0x8847 || 0x8848

1.1+

十六进制(0x开头)或十进制

set_mpls_tc

number

eth_type = 0x8847 || 0x8848

1.1+

十六进制(0x开头)或十进制

set_mpls_ttl

number

eth_type = 0x8847 || 0x8848

1.1+

十六进制(0x开头)或十进制

dec_mpls_ttl

eth_type = 0x8847 || 0x8848

1.1+

push_mpls

number

1.1+

十六进制(0x开头)或十进制

pop_mpls

number

eth_type = 0x8847 || 0x8848

1.1+

十六进制(0x开头)或十进制

push_pbb

number

1.1+

十六进制(0x开头)或十进制

pop_pbb

eth_type = 0x88e7

1.1+

set_tp_src

number

ip_proto = 0x06 || 0x11 || 0x84

1.0

十六进制(0x开头)或十进制

set_tp_dst

number

ip_proto = 0x06 || 0x11 || 0x84

1.0

十六进制(0x开头)或十进制

set_field

OXM-value

See match table above.

1.2+

例 "set_field=eth_src-00:11:22:33:44:55"

meter

number

1.5+

替换"instruction_goto_meter"

十六进制(0x开头)或十进制

copy_field

copy field

1.5+

JSON object.:

{

    "src_field" : "eth_src",

    "dst_field" : "eth_dst",

    "src_offset_bits" : "0",

    "dst_offset_bits" : "0",

    "num_bits" : "48"

}

set_tp_src

number

ip_proto = 0x06 || 0x11 || 0x84

1.0

十六进制(0x开头)或十进制

可选匹配项:

属性

类型

必要条件

支持OF版本

备注

in_port

number/保留端口

all

eth_type

number

all

十六进制(0x开头)或十进制

eth_src

MAC地址

all

xx:xx:xx:xx:xx:xx

eth_dst

MAC地址

all

xx:xx:xx:xx:xx:xx

ip_proto

number

eth_type = 0x0800 || 0x86dd

all

十六进制(0x开头)或十进制

ipv4_src

IPv4 [/mask]

eth_type = 0x0800

all


xx.xx.xx.xx[/xx]

ipv4_dst

IPv4 [/mask]

eth_type = 0x0800

all


xx.xx.xx.xx[/xx]

tp_src

number

ip_proto = 0x06 || 0x11 || 0x84

UDP,TCP,SCTP

tp_dst

number

ip_proto = 0x06 || 0x11 || 0x84

UDP,TCP,SCTP

eth_vlan_vid

number

all

必须在匹配值中包含当前位(bit 12),例:要匹配标记0x0064,请使用0x1064

十六进制(0X开头)或十进制.

eth_vlan_pcp

number

eth_vlan_vid = something

all

十六进制(0X开头)或十进制.

ipv6_src

IPv6 [/mask]

eth_type = 0x86dd

1.2+

xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx[/xx]

ipv6_dst

IPv6 [/mask]

eth_type = 0x86dd

1.2+

xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx[/xx]

ipv6_label

number

eth_type = 0x86dd

1.2+

十六进制(0X开头)或十进制.

ip_tos

number

eth_type = 0x0800 || 0x86dd

all

十六进制(0X开头)或十进制.

ip_ecn

number

eth_type = 0x0800 || 0x86dd

all

十六进制(0X开头)或十进制.

ip_dscp

number

eth_type = 0x0800 || 0x86dd

all

十六进制(0X开头)或十进制. 

udp_src

number

ip_proto = 0x11

all

UDP

udp_dst

number

ip_proto = 0x11

all

UDP

tcp_src

number

ip_proto = 0x06

all

TCP

tcp_dst

number

ip_proto = 0x06

all

TCP

sctp_src

number

ip_proto = 0x84

all

SCTP

sctp_dst

number

ip_proto = 0x84

all

SCTP

icmpv4_type

number

ip_proto = 0x01

1.2+

十六进制(0X开头)或十进制.

icmpv4_code

number

ip_proto = 0x01

1.2+

十六进制(0X开头)或十进制.

icmpv6_type

number

ip_proto = 0x3a

1.2+

十六进制(0X开头)或十进制.

icmpv6_code

number

ip_proto = 0x3a

1.2+

十六进制(0X开头)或十进制.

ipv6_nd_sll

MAC

icmpv6_type = 0x87

1.2+

xx:xx:xx:xx:xx:xx

ipv6_nd_tll

MAC

icmpv6_type = 0x88

1.2+

xx:xx:xx:xx:xx:xx

ipv6_nd_target

IPv6

icmpv6_type = 0x87 || 0x88

1.2+

xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx

ipv6_exthdr

number

eth_type = 0x86dd

1.3+

十六进制(0X开头)或十进制.

arp_opcode

number

eth_type = 0x0806

1.2+

十六进制(0X开头)或十进制.

arp_sha

MAC

eth_type = 0x0806

1.2+

xx:xx:xx:xx:xx:xx

arp_tha

MAC

eth_type = 0x0806

1.2+

xx:xx:xx:xx:xx:xx

arp_spa

IPv4

eth_type = 0x0806

1.2+

xx.xx.xx.xx

arp_tpa

IPv4

eth_type = 0x0806

1.2+

xx.xx.xx.xx

mpls_label

number

eth_type = 0x8847 || 0x8848

1.2+

十六进制(0X开头)或十进制.

mpls_tc

number

eth_type = 0x8847 || 0x8848

1.2+

十六进制(0X开头)或十进制.

mpls_bos

boolean

eth_type = 0x8847 || 0x8848

1.3+

"true" or "false"

pbb_uca

boolean

1.3+

"true" or "false"

tunnel_id

number

1.3+

十六进制(0X开头)或十进制.

tunnel_ipv4_src

IPv4

1.3+

xx.xx.xx.xx

OVS使用的NXM

tunnel_ipv4_dst

IPv4

1.3+

xx.xx.xx.xx

OVS使用的NXM

metadata

number

1.2+

十六进制(0X开头)或十进制.

tcp_flags

number

ip_proto = 0x06

 1.5+

十六进制(0X开头)或十进制.

actset_output

number

reserved_port

 1.5+

十六进制(0X开头)或十进制.

packet_type

number/number

 1.5+

Must take form ns/ns_type, where both ns and ns_type are numbers.

十六进制(0X开头)或十进制.

sctp_dst

number

ip_proto = 0x84

all

SCTP only.

icmpv4_type

number

ip_proto = 0x01

 1.2+

十六进制(0X开头)或十进制.

icmpv4_code

number

ip_proto = 0x01

 1.2+

十六进制(0X开头)或十进制.

icmpv6_type

number

ip_proto = 0x3a

 1.2+

十六进制(0X开头)或十进制.

icmpv6_code

number

ip_proto = 0x3a

 1.2+

十六进制(0X开头)或十进制.

ipv6_nd_sll

MAC

icmpv6_type = 0x87

 1.2+

xx:xx:xx:xx:xx:xx

ipv6_nd_tll

MAC

icmpv6_type = 0x88

 1.2+

xx:xx:xx:xx:xx:xx

ipv6_nd_target

IPv6

icmpv6_type = 0x87 || 0x88

 1.2+

xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx

ipv6_exthdr

number

eth_type = 0x86dd

 1.3+

十六进制(0X开头)或十进制.

arp_opcode

number

eth_type = 0x0806

 1.2+

十六进制(0X开头)或十进制.

arp_sha

MAC

eth_type = 0x0806

 1.2+

xx:xx:xx:xx:xx:xx

arp_tha

MAC

eth_type = 0x0806

 1.2+

xx:xx:xx:xx:xx:xx

arp_spa

IPv4

eth_type = 0x0806

 1.2+

xx.xx.xx.xx

arp_tpa

IPv4

eth_type = 0x0806

 1.2+

xx.xx.xx.xx

mpls_label

number

eth_type = 0x8847 || 0x8848

 1.2+

十六进制(0X开头)或十进制.

mpls_tc

number

eth_type = 0x8847 || 0x8848

 1.2+

十六进制(0X开头)或十进制.

mpls_bos

boolean

eth_type = 0x8847 || 0x8848

 1.3+

"true" or "false"

pbb_uca

boolean

 1.3+

"true" or "false"

tunnel_id

number

 1.3+

十六进制(0X开头)或十进制.

tunnel_ipv4_src

IPv4

 1.3+

xx.xx.xx.xx

NXM used by OVS.

tunnel_ipv4_dst

IPv4

 1.3+

xx.xx.xx.xx

NXM used by OVS.

metadata

number

 1.2+

十六进制(0X开头)或十进制.

tcp_flags

number

ip_proto = 0x06

 1.5+

十六进制(0X开头)或十进制.

actset_output

number

reserved_port

 1.5+

十六进制(0X开头)或十进制.

packet_type

number/number

 1.5+

采取ns / ns_type形式,其中ns和ns_type都是数字。

十六进制(0X开头)或十进制.

arp_spa

IPv4

eth_type = 0x0806

 1.2+

xx.xx.xx.xx

arp_tpa

IPv4

eth_type = 0x0806

 1.2+

xx.xx.xx.xx

mpls_label

number

eth_type = 0x8847 || 0x8848

 1.2+

十六进制(0X开头)或十进制.

mpls_tc

number

eth_type = 0x8847 || 0x8848

 1.2+

十六进制(0X开头)或十进制.

mpls_bos

boolean

eth_type = 0x8847 || 0x8848

 1.3+

"true" or "false"

防火墙(Firewall)

显示防火墙是启用还是禁用。

curl http:// controller_ip:8080/wm/firewall/module/status/json

开启防火墙,默认拒绝所有的通信除非增加ALLOW规则:

curl http:// controller_ip:8080/wm/firewall/module/enable/json -X PUT -d ''

为IP主机10.0.0.3和主机10.0.1.5之间的所有流添加ALLOW规则。不指定操作意味着允许规则:

curl -X POST -d '{"src-ip": "10.0.0.3/32", "dst-ip": "10.0.0.7/32"}' http:// controller_ip:8080/wm/firewall/rules/json

curl -X POST -d '{"src-ip": "10.0.0.7/32", "dst-ip": "10.0.0.3/32"}' http:// controller_ip:8080/wm/firewall/rules/json

虚拟网(Virtual Network Filter)

创建名为“VirtualNetwork1”的虚拟网络,ID为“NetworkId1”,网关为“10.0.0.7”,租户为“默认”(目前被忽略):

curl -X PUT -d '{ "network": { "gateway": "10.0.0.7", "name": "virtualNetwork1" } }' http://localhost:8080/networkService/v1.1/tenants/default/networks/NetworkId1

将主机添加到MAC地址为“00:00:00:00:00:08”的VirtualNetwork1和端口“port1”:

curl -X PUT -d '{"attachment": {"id": "NetworkId1", "mac": "00:00:00:00:00:08"}}' http://localhost:8080/networkService/v1.1/tenants/default/networks/NetworkId1/ports/port1/attachment

原文地址:https://www.cnblogs.com/davidrua/p/7202568.html