0

我正在使用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 向新的外部主机 B 发送 TCP SYN。由于交换机中没有匹配此数据包的流,它将被发送到 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 地址,在 IP dst 字段中包含 B 的 IP 地址。除了 Ether 类型(设置为 IP)外,流中的所有其他字段都是通配符。第二个流与第一个流相似,但匹配从 B 发送到 A 的所有数据包。每个流包含一个将匹配的数据包转发到交换机相关端口的操作。此外,TRW-CB 还进行正常处理(即从 A 的队列中删除此连接请求并降低 A 的似然比)。
4

1 回答 1

0

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

假设您在主类 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 类的信息。

于 2016-04-20T15:22:36.893 回答