微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

SDN Ryu 控制器流量监控

如何解决SDN Ryu 控制器流量监控

所以我正在使用 ryu 控制器和 mininet openvSwitchs,我创建了一个包含 3 个交换机和 3 个主机的简单拓扑,现在我想制作一个流量监控应用程序, 我已经仔细查看了文档,并且已经看到了它们的实现,但正如我所理解的(如果我错了,请纠正我) 只有当交换机不知道将流量转发到哪里时,packet_in 方法才会从交换机接收流,之后控制器会创建一个流表并将其发送回交换机,因此下次交换机将直接转发类似的数据包,而无需回到控制器, 在此处的 _flow_stats_reply_handler 中,控制器从安装在交换机中的交换机获取流量,因此我们有一个流量监视器,但我想查看更详细的信息,例如(标志、tos 等...),但未提供此信息在流量中。 所以基本上我想要的是: 当交换机收到数据包时,它无论如何都会向 ryu 控制器发送数据包的副本,这样我就可以随时检查来自控制器的流量。

解决方法

如果您想始终收到控制器上所有流量的副本,我建议您查看组和存储桶。

假设您希望交换机将所有数据包转发到端口 2 上的目的地 20.0.0.0/8。但您还希望将该流量的副本发送到控制器。这将是这样实现的:

from ryu.base import app_manager
from ryu.controller import ofp_event
from ryu.controller.handler import CONFIG_DISPATCHER
from ryu.controller.handler import set_ev_cls
import ryu.ofproto.ofproto_v1_3_parser as parser
import ryu.ofproto.ofproto_v1_3 as ofproto
from ryu.lib.packet import packet
from ryu.lib.packet import ether_types
from ryu.lib.packet import ethernet,arp,ipv4,ipv6

class SDNApp(app_manager.RyuApp):
    def __init__(self,*args,**kwargs):
        super(SDNApp,self).__init__(*args,**kwargs)
    
    @set_ev_cls(ofp_event.EventOFPSwitchFeatures,CONFIG_DISPATCHER)
    def switch_features_handler(self,ev):
        dp = ev.msg.datapath
            
        # One bucket sends packets to port 2,one sends packets to the controller
        buckets = [
            parser.OFPBucket(actions=[parser.OFPActionOutput(2)]),parser.OFPBucket(actions=[parser.OFPActionOutput(ofproto.OFPP_CONTROLLER)]),]
        # Create a new group on the switch
        dp.send_msg(parser.OFPGroupMod(
            dp,command = ofproto.OFPGC_ADD,type_ = ofproto.OFPGT_ALL,# Always send packets to ALL buckets in the group
            group_id = 1,buckets = buckets # Associate the two buckets with this group
        ))

        # Match packets and send them to the group
        match = parser.OFPMatch(
            eth_type = ether_types.ETH_TYPE_IP,ipv4_dst = '20.0.0.0/8'
        )
        instructions = [parser.OFPInstructionActions(
            ofproto.OFPIT_APPLY_ACTIONS,[parser.OFPActionGroup(1)] # Make sure parameter matches group_id
        )]
        dp.send_msg(parser.OFPFlowMod(
            dp,match = match,instructions = instructions,priority = 1
        ))

不确定此代码是否开箱即用,但它应该提供一个很好的起点。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。