据我所知,答案是否定的,OpenFlow 不支持这个概念,更不用说 Pox。Pox 可以告诉交换机生成一个数据包,但没有流表条目具有将这个其他数据包发送到这里的操作。
一种可能的实现方式如下:
对 TCP 协议和端口号的匹配有两个动作。动作一发送数据包,动作二将数据包发送到流表的一些备用表。
在这个表中有一个动作来修改数据包以发送这个虚拟数据包。您无法制作特定的,但您可以说将目标 IP 修改为一些无意义的值或将一些无意义的 VLAN 设置为一种 sudo 标记。
编辑:用户要求澄清我所说的备用表的含义,因此我将尝试找到一些 pox 命令来显示我计划使用的过程。首先,我建议这个wiki 用于很多基本的 pox 命令,它有点过时,在某些情况下是错误的,但总的来说它非常有用。
在说明备用表时,我说的是 openflow 1.3 启用的概念,即所有流表不必是一个处理列表。相反,所有数据包都可以转到表 0 进行处理,然后如果一个操作声明它可以将数据包发送到表 5 进行扩展处理,或者根据表 0 找到的内容进行更有针对性的处理。这允许更通用的操作,您可以将此新概念视为表格或二维数组,其中最终元素是流表条目。对不起,这个词表出现了很多我希望他们为这个概念选择一个不同的词。
Pox 默认不支持这个概念,因为它使用 OpenFlow1.0 但是有一个扩展可以启用它,更多信息可以在这里找到。一些重要的部分可以在下面找到。
# 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))