Openflow
RouterOS 支持 OpenFlow 1.0 和 1.3 协议以实现 SDN 集成,通过访问交换机数据路径的控制器应用程序实现集中式流量管理。它包含基本的统计支持,并且需要谨慎配置,以避免启用了 OpenFlow 的接口干扰常规网络。
Openflow
RouterOS 支持 OpenFlow 1.0 和 1.3,它们允许 OpenFlow 控制器与 OpenFlow agent 之间进行通信。
OpenFlow 用于在软件定义网络(SDN)中集中管理网络设备。
OpenFlow 控制器上的应用程序可以访问交换机的数据路径,并执行自定义任务,例如流量引导和流量监控。
控制器发送 flow,将其添加到 agent 的 flow 表中。数据包的查找、修改和转发均基于 agent 的 flow 表。
RouterOS 在不使用 "goto table" flow 的简单场景中支持 OpenFlow 快速路径。
OpenFlow 会覆盖常规的数据包处理。在 OpenFlow 交换机端口上接收的数据包不会经过常规网络协议栈,除非 OpenFlow 控制器设置了允许这样做的 flow。配置 OpenFlow 时,请注意不要禁用对设备的访问。
OpenFlow 支持以独立的 OpenFlow 包形式提供。
支持的基本能力
- OFPC_FLOW_STATS
- OFPC_TABLE_STATS
- OFPC_PORT_STATS
- OFPC_GROUP_STATS
不支持的基本能力
- OFPC_IP_REASM
- OFPC_QUEUE_STATS
- OFPC_PORT_BLOCKED
不支持的配置参数和操作(版本 1)
- OFPAT_SET_NW_SRC
- OFPAT_SET_NW_DST
- OFPAT_SET_NW_TOS
- OFPAT_SET_TP_SRC
- OFPAT_SET_TP_DST
- OFPAT_ENQUEUE
- OFPAT_VENDOR
不支持的配置参数和操作(版本 1.3)
- OFPT_SET_ASYNC
- OFPAT_SET_NW_TTL
- OFPAT_DEC_NW_TTL
- OFPAT_COPY_TTL_OUT
- OFPAT_COPY_TTL_IN
配置示例
该示例演示了在 sfp-sfpplus1 和 sfp-sfpplus2 端口之间非常基本的 L2 未标记数据包转发。Faucet 被用作控制器。
/openflow
add controllers=tcp/10.155.101.182/6653 datapath-id=1/DC:2C:6E:A4:B4:2E disabled=no name=faucet
/openflow/port
add disabled=no interface=sfp-sfpplus1 port-id=1 switch=faucet
add disabled=no interface=sfp-sfpplus2 port-id=2 switch=faucet
信息
如果你还打算使用 Gauge,请将 Gauge 的 IP 地址和端口添加到 controllers 列表中。在此示例中,6654 是 Gauge 端口:
controllers=tcp/10.155.101.182/6653,tcp/10.155.101.182/6654在 Faucet 配置中,dp_id必须以十六进制格式与 RouterOS 配置中的datapath-id匹配(1/DC:2C:6E:A4:B4:2E→0x0001dc2c6ea4b42e):
---
vlans:
100:
description: "untagged"
acls:
1:
- rule:
actions:
allow: 1
dps:
test_switch:
dp_id: 0x0001dc2c6ea4b42e
hardware: "Generic"
drop_broadcast_source_address: false
drop_spoofed_faucet_mac: false
interfaces:
1:
name: "h1"
description: "host1 container"
native_vlan: 100
acl_in: 1
2:
name: "h2"
description: "host2 container"
native_vlan: 100
acl_in: 1
Faucet 安装的 flow 可以从 /openflow/flow 菜单查看:
[admin@CCR2004_2XS_111] /openflow/flow> print detail
Flags: I - inactive
0 switch=faucet version=4 match=" [ { ethdst_m=01000cccccccffffffffffff } ]" actions=" []"
info="priority 8240, idletimeout 0, hardtimeout 0, cookie 1524372928, removenotify 0" table-id=4
1 switch=faucet version=4 match=" [ { ethdst_m=01000ccccccdffffffffffff } ]" actions=" []"
info="priority 8240, idletimeout 0, hardtimeout 0, cookie 1524372928, removenotify 0" table-id=4
2 switch=faucet version=4 match=" [ { ethdst_m=ffffffffffffffffffffffff }; { vlanvid=1064 } ]"
actions=" [ { apply-actions= [ { popvlan={} }; { output={ port=1; max_len=0 } }; { output={ port=2; max_len=0 } } ]
} ]"
info="priority 8240, idletimeout 0, hardtimeout 0, cookie 1524372928, removenotify 0" table-id=4
3 switch=faucet version=4 match=" [ { ethdst_m=0180c2000000fffffffffff0 } ]" actions=" []"
info="priority 8236, idletimeout 0, hardtimeout 0, cookie 1524372928, removenotify 0" table-id=4
4 switch=faucet version=4 match=" [ { ethdst_m=0180c2000000ffffff000000 }; { vlanvid=1064 } ]"
actions=" [ { apply-actions= [ { popvlan={} }; { output={ port=1; max_len=0 } }; { output={ port=2; max_len=0 } } ]
} ]"
info="priority 8216, idletimeout 0, hardtimeout 0, cookie 1524372928, removenotify 0" table-id=4
5 switch=faucet version=4 match=" [ { ethdst_m=01005e000000ffffff000000 }; { vlanvid=1064 } ]"
actions=" [ { apply-actions= [ { popvlan={} }; { output={ port=1; max_len=0 } }; { output={ port=2; max_len=0 } } ]
} ]"
info="priority 8216, idletimeout 0, hardtimeout 0, cookie 1524372928, removenotify 0" table-id=4
6 switch=faucet version=4 match=" [ { ethdst_m=333300000000ffff00000000 }; { vlanvid=1064 } ]"
actions=" [ { apply-actions= [ { popvlan={} }; { output={ port=1; max_len=0 } }; { output={ port=2; max_len=0 } } ]
} ]"
info="priority 8208, idletimeout 0, hardtimeout 0, cookie 1524372928, removenotify 0" table-id=4
7 switch=faucet version=4 match=" [ { vlanvid=1064 } ]"
actions=" [ { apply-actions= [ { popvlan={} }; { output={ port=1; max_len=0 } }; { output={ port=2; max_len=0 } } ]
} ]"
info="priority 8192, idletimeout 0, hardtimeout 0, cookie 1524372928, removenotify 0" table-id=4
8 switch=faucet version=4 match=" []" actions=" []"
info="priority 0, idletimeout 0, hardtimeout 0, cookie 1524372928, removenotify 0" table-id=4
9 switch=faucet version=4 match=" []" actions=" [ { goto=4 } ]"
info="priority 0, idletimeout 0, hardtimeout 0, cookie 1524372928, removenotify 0" table-id=3
10 switch=faucet version=4 match=" [ { ethtype=9000 } ]" actions=" []"
info="priority 20490, idletimeout 0, hardtimeout 0, cookie 1524372928, removenotify 0" table-id=2
11 switch=faucet version=4 match=" [ { vlanvid=1064 } ]"
actions=" [ { apply-actions= [ { output={ port=4294967293; max_len=96 } } ] }; { goto=3 } ]"
info="priority 4096, idletimeout 0, hardtimeout 0, cookie 1524372928, removenotify 0" table-id=2
12 switch=faucet version=4 match=" []" actions=" [ { goto=3 } ]"
info="priority 0, idletimeout 0, hardtimeout 0, cookie 1524372928, removenotify 0" table-id=2
13 switch=faucet version=4 match=" [ { inport=00000001 }; { vlanvid=0000 } ]"
actions=" [ { apply-actions= [ { pushvlan={ ethertype=33024 } }; { setfield={ vlanvid=1064 } } ] }; { goto=2 } ]"
info="priority 4096, idletimeout 0, hardtimeout 0, cookie 1524372928, removenotify 0" table-id=1
14 switch=faucet version=4 match=" [ { inport=00000002 }; { vlanvid=0000 } ]"
actions=" [ { apply-actions= [ { pushvlan={ ethertype=33024 } }; { setfield={ vlanvid=1064 } } ] }; { goto=2 } ]"
info="priority 4096, idletimeout 0, hardtimeout 0, cookie 1524372928, removenotify 0" table-id=1
15 switch=faucet version=4 match=" []" actions=" []"
info="priority 0, idletimeout 0, hardtimeout 0, cookie 1524372928, removenotify 0" table-id=1
16 switch=faucet version=4 match=" [ { inport=00000001 } ]" actions=" [ { goto=1 } ]"
info="priority 20480, idletimeout 0, hardtimeout 0, cookie 1524372928, removenotify 0" table-id=0
17 switch=faucet version=4 match=" [ { inport=00000002 } ]" actions=" [ { goto=1 } ]"
info="priority 20480, idletimeout 0, hardtimeout 0, cookie 1524372928, removenotify 0" table-id=0
18 switch=faucet version=4 match=" []" actions=" []"
info="priority 0, idletimeout 0, hardtimeout 0, cookie 1524372928, removenotify 0" table-id=0
19 switch=faucet version=4 match=" [ { ethdst=dc2c6ec5a7ff }; { vlanvid=1064 } ]"
actions=" [ { apply-actions= [ { popvlan={} }; { output={ port=1; max_len=0 } } ] } ]"
info="priority 8192, idletimeout 413, hardtimeout 0, cookie 1524372928, removenotify 0" table-id=3
20 switch=faucet version=4 match=" [ { inport=00000001 }; { ethsrc=dc2c6ec5a7ff }; { vlanvid=1064 } ]"
actions=" [ { goto=3 } ]" info="priority 8191, idletimeout 0, hardtimeout 263, cookie 1524372928, removenotify 0"
table-id=2
21 switch=faucet version=4 match=" [ { ethdst=dc2c6e46f893 }; { vlanvid=1064 } ]"
actions=" [ { apply-actions= [ { popvlan={} }; { output={ port=2; max_len=0 } } ] } ]"
info="priority 8192, idletimeout 417, hardtimeout 0, cookie 1524372928, removenotify 0" table-id=3
22 switch=faucet version=4 match=" [ { inport=00000002 }; { ethsrc=dc2c6e46f893 }; { vlanvid=1064 } ]"
actions=" [ { goto=3 } ]" info="priority 8191, idletimeout 0, hardtimeout 267, cookie 1524372928, removenotify 0"
table-id=2
要查看 flow 统计信息,请使用 stats 参数:
[admin@CCR2004_2XS_111] /openflow/flow> print stats
Columns: SWITCH, MATCH, BYTES, PACKETS, DURATION
# SWITCH MATCH BYTES PACKETS DURATION
0 faucet [ { ethdst_m=01000cccccccffffffffffff } ] 3590 25 6m26s890ms
1 faucet [ { ethdst_m=01000ccccccdffffffffffff } ] 0 0 6m26s890ms
2 faucet [ { ethdst_m=ffffffffffffffffffffffff }; { vlanvid=1064 } ] 5552 26 6m26s890ms
3 faucet [ { ethdst_m=0180c2000000fffffffffff0 } ] 4917 25 6m26s890ms
4 faucet [ { ethdst_m=0180c2000000ffffff000000 }; { vlanvid=1064 } ] 0 0 6m26s890ms
5 faucet [ { ethdst_m=01005e000000ffffff000000 }; { vlanvid=1064 } ] 0 0 6m26s890ms
6 faucet [ { ethdst_m=333300000000ffff00000000 }; { vlanvid=1064 } ] 5992 25 6m26s890ms
7 faucet [ { vlanvid=1064 } ] 340 5 6m26s890ms
8 faucet [] 0 0 6m26s890ms
9 faucet [] 20391 106 6m26s890ms
10 faucet [ { ethtype=9000 } ] 0 0 6m26s890ms
11 faucet [ { vlanvid=1064 } ] 530 8 6m26s890ms
12 faucet [] 0 0 6m26s890ms
13 faucet [ { inport=00000001 }; { vlanvid=0000 } ] 39135 463 6m26s890ms
14 faucet [ { inport=00000002 }; { vlanvid=0000 } ] 37936 459 6m26s890ms
15 faucet [] 17941 100 6m26s890ms
16 faucet [ { inport=00000001 } ] 48664 515 6m26s890ms
17 faucet [ { inport=00000002 } ] 46348 507 6m26s890ms
18 faucet [] 0 0 6m26s890ms
19 faucet [ { ethdst=dc2c6ec5a7ff }; { vlanvid=1064 } ] 28340 408 6m26s780ms
20 faucet [ { ethdst=dc2c6e46f893 }; { vlanvid=1064 } ] 28340 408 6m26s780ms
21 faucet [ { inport=00000001 }; { ethsrc=dc2c6ec5a7ff }; { vlanvid=1064 } ] 12020 142 2m660ms
22 faucet [ { inport=00000002 }; { ethsrc=dc2c6e46f893 }; { vlanvid=1064 } ] 10769 133 1m55s660ms
统计信息
快速路径统计信息可以从 /openflow/print fast-path 查看。在此示例中,由于 Faucet 安装的 flow 较为复杂,快速路径无法工作。
[admin@CCR2004_2XS_111] /openflow> print fast-path
openflow-fast-path-packets: 0 0
openflow-fast-path-bytes: 0 0
端口统计信息可以从 /openflow/port 菜单查看。
[admin@CCR2004_2XS_111] /openflow/port> print stats
Columns: INTERFACE, PORT-ID, RX-BYTES, TX-BYTES, RX-PACKETS, TX-PACKETS
# INTERFACE PORT-ID RX-BYTES TX-BYTES RX-PACKETS TX-PACKETS
0 sfp-sfpplus1 1 115668 81180 1223 1035
1 sfp-sfpplus2 2 112200 82188 1215 1037