You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用Ryu控制器提取交换机流信息(IP、协议、端口等)

在Ryu控制器中提取交换机流信息(源IP、目的IP、协议、TCP端口等)

在Ryu中提取流表的关键信息,核心是处理**流统计回复(FlowStatsReply)**中的flow对象,通过其match属性获取匹配字段。以下是具体实现方法和注意事项:

1. 处理流统计回复事件

注册EventOFPFlowStatsReply事件的处理函数,当控制器收到交换机返回的流统计数据时,会触发该事件进行处理。

2. 提取核心字段

流对象的match是字典结构,包含流表项的匹配规则,直接通过键名提取对应信息即可。建议用get()方法避免字段不存在时抛出异常:

示例代码

from ryu.base import app_manager
from ryu.controller import ofp_event
from ryu.controller.handler import MAIN_DISPATCHER, set_ev_cls
from ryu.ofproto import ofproto_v1_3

class FlowInfoExtractor(app_manager.RyuApp):
    OFP_VERSIONS = [ofproto_v1_3.OFP_VERSION]

    # 处理流统计回复
    @set_ev_cls(ofp_event.EventOFPFlowStatsReply, MAIN_DISPATCHER)
    def handle_flow_stats_reply(self, ev):
        flow_list = ev.msg.body
        for flow in flow_list:
            # 提取IPv4地址
            src_ip = flow.match.get('ipv4_src')
            dst_ip = flow.match.get('ipv4_dst')
            
            # 提取网络协议
            ip_proto = flow.match.get('ip_proto')
            if not ip_proto:
                print(f"流项无协议信息 | 源IP: {src_ip}, 目的IP: {dst_ip}")
                continue
            
            # 根据协议类型提取传输层端口
            if ip_proto == 6:  # TCP协议
                tcp_src = flow.match.get('tcp_src')
                tcp_dst = flow.match.get('tcp_dst')
                print(f"TCP流 | 源IP: {src_ip}, 目的IP: {dst_ip}, 源端口: {tcp_src}, 目的端口: {tcp_dst}")
            elif ip_proto == 17:  # UDP协议
                udp_src = flow.match.get('udp_src')
                udp_dst = flow.match.get('udp_dst')
                print(f"UDP流 | 源IP: {src_ip}, 目的IP: {dst_ip}, 源端口: {udp_src}, 目的端口: {udp_dst}")
            else:
                print(f"其他协议({ip_proto}) | 源IP: {src_ip}, 目的IP: {dst_ip}")

    # 主动向交换机请求流统计
    def request_flow_stats(self, datapath):
        ofp = datapath.ofproto
        parser = datapath.ofproto_parser
        
        # 构造流统计请求消息
        req = parser.OFPFlowStatsRequest(
            datapath, 0, ofp.OFPTT_ALL, ofp.OFPP_ANY, ofp.OFPG_ANY,
            0, 0, None
        )
        datapath.send_msg(req)

3. 关键注意事项

  • OpenFlow版本兼容:不同OF版本的match键名可能不同,比如OF1.0中用nw_src/nw_dst表示IPv4地址,OF1.3及以上推荐使用ipv4_src/ipv4_dst这类明确的键名。
  • 字段存在性判断:不是所有流项都包含传输层端口(比如ICMP流),必须先判断协议类型,再尝试提取对应端口字段,避免KeyError。
  • 主动触发统计:如果需要主动获取流信息,可以在交换机连接事件(EventOFPSwitchFeatures)中调用request_flow_stats方法,主动向交换机发送统计请求。

内容的提问来源于stack exchange,提问作者Mohamed Hanoune

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 17:43:12