1

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

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

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

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

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

谢谢

4

1 回答 1

0

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

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

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

  2. 在这个表中有一个动作来修改数据包以发送这个虚拟数据包。您无法制作特定的,但您可以说将目标 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))
于 2016-03-23T17:47:37.210 回答