通过 OpenDaylight 自定义 OpenFlow 无效
Custom OpenFlow via OpenDaylight has no effect
我在 OpenStack 云中有两个虚拟机。使用以下命令,我可以在它们之间发送数据:
# On the server (IP 10.0.0.7)
nc -u -l -p 7865
# On the client (10.0.0.10)
nc -u 10.0.0.7 7865
现在,我想阻止从 10.0.0.10 到 10.0.0.7 的通信(但仍然允许在另一个方向上通信)。所以我创建了这个流程:
root@ubuntu:/opt/stack/opendaylight# cat my_custom_flow.xml
<?xml version="1.0"?>
<flow xmlns="urn:opendaylight:flow:inventory">
<priority>1</priority>
<flow-name>nakrule-custom-flow</flow-name>
<idle-timeout>12000</idle-timeout>
<match>
<ethernet-match>
<ethernet-type>
<type>2048</type>
</ethernet-type>
</ethernet-match>
<ipv4-source>10.0.0.10/32</ipv4-source>
<ipv4-destination>10.0.0.7/32</ipv4-destination>
<ip-match>
<ip-dscp>28</ip-dscp>
</ip-match>
</match>
<id>10</id>
<table_id>0</table_id>
<instructions>
<instruction>
<order>6555</order>
</instruction>
<instruction>
<order>0</order>
<apply-actions>
<action>
<order>0</order>
<drop-action/>
</action>
</apply-actions>
</instruction>
</instructions>
</flow>
然后,我将流发送到我的交换机。我使用 OpenDaylight 作为我的 SDN 控制器来管理我的 OpenStack 云。我有两个开关,br-int 和 br-ex。在 br-int 上为 OpenStack 中的每个虚拟机创建一个端口。我可以使用以下命令获取开关 ID:
curl -u admin:admin http://192.168.100.100:8181/restconf/config/opendaylight-inventory:nodes | python -m json.tool | grep '"id": "openflow:'[0-9]*'"'
"id": "openflow:2025202531975591"
"id": "openflow:202520253197559"
ID为202520253197559的交换机在他的table中有很多流量,而另一个有2-3个。所以我猜 202520253197559 是 br-int,因此使用以下命令将我的新流程添加到它:
curl -u admin:admin -H 'Content-Type: application/yang.data+xml' -X PUT -d @my_custom_flow.xml http://192.168.100.100:8181/restconf/config/opendaylight-inventory:nodes/node/openflow:202520253197559/table/234/flow/10
现在,我可以通过另一个 REST 请求查看我的流程:
curl -u admin:admin http://192.168.100.100:8181/restconf/config/opendaylight-inventory:nodes | python -m json.tool
{
"flow-name": "nakrule-custom-flow",
"id": "10",
"idle-timeout": 12000,
"instructions": {
"instruction": [
{
"order": 6555
},
{
"apply-actions": {
"action": [
{
"drop-action": {},
"order": 0
}
]
},
"order": 0
}
]
},
"match": {
"ethernet-match": {
"ethernet-type": {
"type": 2048
}
},
"ip-match": {
"ip-dscp": 28
},
"ipv4-destination": "10.0.0.7/32",
"ipv4-source": "10.0.0.10/32"
},
"priority": 1,
"table_id": 0
},
但是,然后我回到我的两个虚拟机,它们仍然可以成功地相互发送数据。此外,使用以下命令 return nothing:
ovs-ofctl dump-flows br-int --protocols=OpenFlow13 | grep nakrule
我应该看到我的新流程,这是否意味着 OpenDaylight 没有将它添加到我的交换机中?
root@ubuntu:/opt/stack# ovs-ofctl snoop br-int
2018-05-11T09:15:27Z|00001|vconn|ERR|unix:/var/run/openvswitch/br-int.snoop: received OpenFlow version 0x04 != expected 01
2018-05-11T09:15:27Z|00002|vconn|ERR|unix:/var/run/openvswitch/br-int.snoop: received OpenFlow version 0x04 != expected 01
提前致谢。
你确定 openflow:1 是交换机 (br-int) 的节点 ID
你想编程。我对此表示怀疑。通常 openflow:1 是什么
我们从 mininet 部署中看到。
通过 RESTCONF 在拓扑 API 上执行 GET 并计算出节点 ID
你的开关(ES)。或者你可以通过找到 mac 来猜测它
您正在使用的 br-int 的地址并将十六进制转换为十进制。
例如,mininet 实际上使它们的 mac 地址变得简单,比如
00:00:00:00:00:01,所以这就是它最终变成 openflow:1
的原因
我在你更新的问题中注意到的另一个问题是你正在发送
URL 中 table 234 的流程,但在流程中指定 table 0
数据.
此外,您可以检查 restconf 中的配置/存储,以了解这些节点
查看 ODL 是否甚至接受流程。如果它在配置存储中并且
该交换机连接到 openflow 插件,那么流程应该
被按下开关。
另一个寻找线索的地方是karaf.log。
最后,如果你认为一切正常,流量应该越来越大
发送到交换机,但交换机不显示流量,然后
尝试进行数据包捕获。您的交换机可能正在拒绝
出于某种原因的流量。这也可能显示在 ovs 日志中,如果
就是这样。我怀疑这就是问题所在,但只是添加它
以防万一
我在 OpenStack 云中有两个虚拟机。使用以下命令,我可以在它们之间发送数据:
# On the server (IP 10.0.0.7)
nc -u -l -p 7865
# On the client (10.0.0.10)
nc -u 10.0.0.7 7865
现在,我想阻止从 10.0.0.10 到 10.0.0.7 的通信(但仍然允许在另一个方向上通信)。所以我创建了这个流程:
root@ubuntu:/opt/stack/opendaylight# cat my_custom_flow.xml
<?xml version="1.0"?>
<flow xmlns="urn:opendaylight:flow:inventory">
<priority>1</priority>
<flow-name>nakrule-custom-flow</flow-name>
<idle-timeout>12000</idle-timeout>
<match>
<ethernet-match>
<ethernet-type>
<type>2048</type>
</ethernet-type>
</ethernet-match>
<ipv4-source>10.0.0.10/32</ipv4-source>
<ipv4-destination>10.0.0.7/32</ipv4-destination>
<ip-match>
<ip-dscp>28</ip-dscp>
</ip-match>
</match>
<id>10</id>
<table_id>0</table_id>
<instructions>
<instruction>
<order>6555</order>
</instruction>
<instruction>
<order>0</order>
<apply-actions>
<action>
<order>0</order>
<drop-action/>
</action>
</apply-actions>
</instruction>
</instructions>
</flow>
然后,我将流发送到我的交换机。我使用 OpenDaylight 作为我的 SDN 控制器来管理我的 OpenStack 云。我有两个开关,br-int 和 br-ex。在 br-int 上为 OpenStack 中的每个虚拟机创建一个端口。我可以使用以下命令获取开关 ID:
curl -u admin:admin http://192.168.100.100:8181/restconf/config/opendaylight-inventory:nodes | python -m json.tool | grep '"id": "openflow:'[0-9]*'"'
"id": "openflow:2025202531975591"
"id": "openflow:202520253197559"
ID为202520253197559的交换机在他的table中有很多流量,而另一个有2-3个。所以我猜 202520253197559 是 br-int,因此使用以下命令将我的新流程添加到它:
curl -u admin:admin -H 'Content-Type: application/yang.data+xml' -X PUT -d @my_custom_flow.xml http://192.168.100.100:8181/restconf/config/opendaylight-inventory:nodes/node/openflow:202520253197559/table/234/flow/10
现在,我可以通过另一个 REST 请求查看我的流程:
curl -u admin:admin http://192.168.100.100:8181/restconf/config/opendaylight-inventory:nodes | python -m json.tool
{
"flow-name": "nakrule-custom-flow",
"id": "10",
"idle-timeout": 12000,
"instructions": {
"instruction": [
{
"order": 6555
},
{
"apply-actions": {
"action": [
{
"drop-action": {},
"order": 0
}
]
},
"order": 0
}
]
},
"match": {
"ethernet-match": {
"ethernet-type": {
"type": 2048
}
},
"ip-match": {
"ip-dscp": 28
},
"ipv4-destination": "10.0.0.7/32",
"ipv4-source": "10.0.0.10/32"
},
"priority": 1,
"table_id": 0
},
但是,然后我回到我的两个虚拟机,它们仍然可以成功地相互发送数据。此外,使用以下命令 return nothing:
ovs-ofctl dump-flows br-int --protocols=OpenFlow13 | grep nakrule
我应该看到我的新流程,这是否意味着 OpenDaylight 没有将它添加到我的交换机中?
root@ubuntu:/opt/stack# ovs-ofctl snoop br-int
2018-05-11T09:15:27Z|00001|vconn|ERR|unix:/var/run/openvswitch/br-int.snoop: received OpenFlow version 0x04 != expected 01
2018-05-11T09:15:27Z|00002|vconn|ERR|unix:/var/run/openvswitch/br-int.snoop: received OpenFlow version 0x04 != expected 01
提前致谢。
你确定 openflow:1 是交换机 (br-int) 的节点 ID 你想编程。我对此表示怀疑。通常 openflow:1 是什么 我们从 mininet 部署中看到。
通过 RESTCONF 在拓扑 API 上执行 GET 并计算出节点 ID 你的开关(ES)。或者你可以通过找到 mac 来猜测它 您正在使用的 br-int 的地址并将十六进制转换为十进制。
例如,mininet 实际上使它们的 mac 地址变得简单,比如 00:00:00:00:00:01,所以这就是它最终变成 openflow:1
的原因我在你更新的问题中注意到的另一个问题是你正在发送 URL 中 table 234 的流程,但在流程中指定 table 0 数据.
此外,您可以检查 restconf 中的配置/存储,以了解这些节点 查看 ODL 是否甚至接受流程。如果它在配置存储中并且 该交换机连接到 openflow 插件,那么流程应该 被按下开关。
另一个寻找线索的地方是karaf.log。
最后,如果你认为一切正常,流量应该越来越大 发送到交换机,但交换机不显示流量,然后 尝试进行数据包捕获。您的交换机可能正在拒绝 出于某种原因的流量。这也可能显示在 ovs 日志中,如果 就是这样。我怀疑这就是问题所在,但只是添加它 以防万一