【问题标题】:POX - Installing a rule which says to send a dummy packet whenever a certain packet matches an ofp_matchPOX - 安装一条规则,当某个数据包与 ofp_match 匹配时发送一个虚拟数据包
【发布时间】:2016-03-19 16:36:48
【问题描述】:

是否可以在交换机上安装规则,指示交换机执行以下操作:

If packet_in is TCP:
    send ( dummy packet )
    send (packet_in)
    send ( dummy packet)
else:
    send (packet_in)

我很欣赏这是相当糟糕的伪代码,但它应该比我试图解释它更好地说明我正在尝试做的事情。

基本上,我试图通过传输虚拟数据包来间隔传输项目的 TCP 数据包,而不必要求将每个 TCP 数据包都发送到控制器。我希望交换机正常运行,但是当它接收到发往某个端口的 TCP 数据包时,我希望交换机也从同一个端口传输一个虚拟数据包(我已经构建),前往同一个目的地。

我知道可能有一些更好的方法来实现我想要实现的目标 - 我愿意接受建议!

谢谢

【问题讨论】:

    标签: python tcp openflow sdn pox


    【解决方案1】:

    据我所知,答案是否定的,OpenFlow 不支持这个概念,更不用说 Pox。 Pox 可以告诉交换机生成一个数据包,但没有流表条目具有发送此其他数据包的操作。

    一种可能的实现方式如下:

    1. 对TCP协议和端口号的匹配有两个动作。动作一发送数据包,动作二将数据包发送到流表的一些备用表。

    2. 在这个表中有一个动作来修改数据包来发送这个虚拟数据包。您无法制作特定的,但您可以说将目标 IP 修改为一些无意义的值或将一些无意义的 VLAN 设置为一种 sudo 标记。

    编辑: 用户要求澄清我所说的备用表的含义,因此我将尝试找到一些 pox 命令来显示我计划使用的过程。 首先,我建议 this wiki 使用很多基本的 pox 命令,它有点过时,在某些情况下是错误的,但总的来说它非常有用。

    在说明备用表时,我说的是 openflow 1.3 启用的概念,即所有流表不必是一个处理列表。相反,所有数据包都可以转到表 0 进行处理,然后如果一个操作声明它可以将数据包发送到表 5 进行扩展处理,或者根据表 0 找到的内容进行更有针对性的处理。这允许更通用的操作,您可以将此新概念视为表格或二维数组,其中最终元素是流表条目。抱歉,单词 table 出现了很多我希望他们为这个概念选择不同的词。

    默认情况下,Pox 不支持这个概念,因为它使用 OpenFlow1.0,但是有一个扩展可以启用它,更多信息可以在 here 找到。一些重要的部分可以在下面找到。

    # Turn on Nicira packet_ins
    msg = nx.nx_packet_in_format()
    event.connection.send(msg)
    # Turn on ability to specify table in flow_mods
    msg = nx.nx_flow_mod_table_id()
    event.connection.send(msg)
    msg = nx.nx_flow_mod()
    msg.priority = 1 # Low priority
    msg.actions.append(of.ofp_action_output(port = of.OFPP_CONTROLLER))
    msg.actions.append(nx.nx_action_resubmit.resubmit_table(table = 1))
    event.connection.send(msg)
    msg = nx.nx_flow_mod()
    msg.table_id = 1
    msg.priority = 1 # Low priority
    msg.actions.append(of.ofp_action_output(port = of.OFPP_FLOOD))
    event.connection.send(msg)
    

    在此示例中,启用了多表支持,然后添加了一个流,该流将所有数据包发送到控制器和表 1,从那里表 1 有一个流,表示淹没所有数据包。希望这能让您大致了解它们的工作原理。

    如果您还不知道如何使用 pox 编辑数据包,可以附加到操作列表以更改目标 MAC 地址的示例操作如下。

    ofp_action_dl_addr.set_dst(EthAddr("01:02:03:04:05:06"))
    

    对于vlan我之前提出的方法你可以这样做

    msg.actions.append(of.ofp_action_vlan_vid(vlan_vid=1234))
    

    【讨论】:

    • Arduic,谢谢!我想我掌握了您的实施建议的主要思想,但是我对您所说的“流表的一些备用表”的意思感到困惑。你能帮我详细说明一下吗?
    • 我编辑了帖子以包含对 OpenFlow/Pox 中的多表概念的简要说明。以及一些示例代码来帮助您尝试实现我的建议。
    • 太好了,谢谢。我有一种感觉,您可能在谈论 Nicira - 这是我昨晚阅读您的初步答案后简要调查的内容,但我必须进一步调查。您提供的示例是特定于您建议的实现还是只是一个示例?是否可以在一个按原样发送数据包的表上安装规则,然后将数据包转发到另一个表,然后编辑 VLAN 标头并将其作为虚拟转发?然后我可以在每台交换机上安装另一条规则,声明所有具有该 VLAN ID 的数据包都被丢弃?
    • 是的,这一切皆有可能。正如我上面的摘录一样,您可以将 port=of.OFPP_CONTROLLER 替换为 port=3 或您想要的任何目的地。然后让表 = 1,这实际上为此流插入了 2 个操作,并且都被遵循。在第二个表中,您可以像我建议的那样将通用捕获全部与 vlan 编辑匹配,然后再使用端口 = 3 或您在终端节点的机器上会看到 2 个数据包,一个带有 vlan,一个没有.请记住,vlan 只是一个选项,您几乎可以编辑数据包标头中的任何内容,因此可能会有更合适的内容。
    • 所以要清楚这只是一个例子,它展示了如何使用 Nicira 扩展来支持多表的基本概念。将此表操作视为另一种操作,类似于您如何通过两个操作将一个数据包发送到多个主机,一个用于端口 3,一个用于端口 4,这只是另一个通用操作。
    猜你喜欢
    • 2016-08-13
    • 1970-01-01
    • 2010-10-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多