我正在使用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)
实际上我的算法就像
- 假设内部主机 A 向新的外部主机 B 发送 TCP SYN。由于交换机中没有匹配此数据包的流,它将被发送到 POX 控制器。
- 在 POX 控制器上运行的 TRW-CB 实例只需通过交换机转发此数据包,无需设置任何流。同时,该算法也进行正常处理(即,将 B 添加到 A 之前联系过的主机列表中,并将连接请求添加到 A 的队列中)。
- 来自 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 的似然比)。