【问题标题】:How Pox controller will send packet without installing flow rulesPox 控制器如何在不安装流规则的情况下发送数据包
【发布时间】:2016-08-13 07:57:31
【问题描述】:

我正在使用 pox 控制器编写蠕虫检测代码,谁能告诉我如何编写一个函数,让我的控制器将数据包直接发送到主机我的意思是假设主机 A 发送****TCPSYN**** 数据包现在发送到主机 B,因为流规则不可用,而不是交换机将数据包发送到控制器现在我想编写函数,**** 控制器**** 将在不安装的情况下将数据包发送到主机 B任何流规则。我正在编写数据包处理代码

def _handle_PacketIn (self, event):

packet = event.parsed
log.info("Packet come in %s"%packet.type)
dpidstr = dpid_to_str(event.dpid)
# updating out mac to port mapping
self.macToPort[(event.connection,packet.src)] = event.port
dst_port = self.macToPort.get((event.connection,packet.dst))

tcpp = packet.find('tcp')
if tcpp and tcpp.SYN:
        #here i want to write code where my controller will send tcp syn packet received from host A to the destination host(B) with installing any flow rules
if tcpp and tcpp.ACK:
        #here i want to write code where my controller will receive tcp synack packet and send this syn ack packet to the sender(A) which has sent syn packet to host (B) 

其实我的算法是这样的

  1. 假设内部主机 A 向新的外部主机发送 TCP SYN B. 由于交换机中没有匹配此数据包的流,它将被发送到 POX 控制器。
  2. 在 POX 控制器上运行的 TRW-CB 实例只是转发这个 数据包通过交换机,无需设置任何流。同时, 算法也进行正常处理(即将 B 添加到主机列表中) A 强烈联系并将连接请求添加到 A 的队列中)。
  3. B 的两种可能响应是: (a) 如果收到 B 到 A 的 TCP SYNACK,交换机再次转发 这到 NOX 控制器(因为它仍然不匹配任何流量)。之上 接收到 SYNACK,控制器上的 TRW-CB 实例安装 两个流在开关。第一个流匹配从发送的所有数据包 A到B。它在IP src字段中包含A的IP地址和B的IP地址 在 IP dst 字段中。除了 Ether 类型(设置为 IP),所有其他 流中的字段是通配符的。第二个流程和第一个类似, 但匹配从 B 发送到 A 的所有数据包。每个流包含一个动作 从交换机的相关端口转发匹配的数据包。广告- 此外,TRW-CB 也进行正常处理(即删除此 来自 A 队列的连接请求并降低 A 的似然比).. (b) 如果连接超时,则 TRW-CB 进行常规处理 (对于连接失败的情况)不与交换机交互。因此没有安装流。

【问题讨论】:

  • 请发布一些您尝试过但无效的代码。请参阅How to Ask,了解有关如何充分利用您的问题的更多信息。
  • 我已经发布了代码和算法,现在可以帮助我

标签: python network-programming sdn pox


【解决方案1】:

有一些代码来处理数据包会有所帮助,但无论如何,让我尝试涵盖最简单和通用的情况。

假设您在主类 init 函数中的事件中有一个数据包侦听器,例如

core.openflow.addListenerByName("PacketIn", self._handle_PacketIn)

然后在处理事件的函数中

def _handle_PacketIn (self, event): msg = of.ofp_packet_out(data=event.ofp) msg.actions.append(of.ofp_action_output(port=of.OFPP_FLOOD)) event.connection.send(msg)

所以消息是控制器发送到交换机的消息,为了覆盖所有端口,您只需将传入的数据包泛滥到各处。如果您知道目的地,您可以在此处调整以仅将数据包发送到所需端口。这将在闭环中失败,但它会给你一个起点。 在http://archive.openflow.org/wk/index.php/OpenFlow_Tutorial#ofp_action_output_class 上查看更多关于 ofp_action_output 类的信息。

【讨论】:

  • 我现在已经发布了我的算法,请阅读它,然后帮助我编写我自己的 pox 控制器函数
  • def init (self, transparent): core.openflow.addListeners(self) self.transparent = transparent core.openflow.addListeners(self, "all") 日志。 debug("启用阈值随机游走算法") self.flow_table = {} self.macToPort = {}
  • 只需将(port=of.OFPP_FLOOD) 替换为(port=dst_port)。为了不让您的控制器制动,请检查if dst_port,因为如果您在字典中没有记录macToPort,这将失败。
猜你喜欢
  • 1970-01-01
  • 2015-11-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-12
  • 2018-04-11
相关资源
最近更新 更多