Echo.py 2024-05-22 15:49 采纳率: 0%
浏览 3
已结题

ryu如何实现对vxlan数据包VIN的检验

如何使用ryu实现vxlan数据包中vin的验证,并生成流表下发到openflow交换机。

  • 写回答

3条回答 默认 最新

  • 专家-赤兔[在线] 全栈领域优质创作者 2024-05-22 15:50
    关注

    引自免费微信小程序:皆我百晓生

    在Ryu中实现VXLAN数据包中的Vin(VNI,即VXLAN网络标识符)验证并生成流表规则下发到OpenFlow交换机,可以通过编写一个简单的Ryu应用程序来完成。下面是一个详细的步骤和代码示例。

    首先,确保已经安装了Ryu库和相关的Python依赖项。可以使用以下命令进行安装:

    pip install ryu
    

    接下来,创建一个新的Python文件,例如vyvan_validator.py,并在其中编写以下代码:

    from ryu.base import app_manager
    from ryu.controller import ofp_event
    from ryu.controller.handler import set_ev_cls, MAIN_DISPATCHER
    from ryu.ofproto import ofproto_v1_3
    from ryu.lib.packet import packet
    from ryu.lib.packet import vxlan
    
    class VxlanValidator(app_manager.RyuApp):
        OFP_VERSIONS = [ofproto_v1_3.OFP_VERSION]
    
        @set_ev_cls(ofp_event.EventOFPPacketIn, MAIN_DISPATCHER)
        def packet_in_handler(self, ev):
            msg = ev.msg
            dp = msg.datapath
            ofproto = dp.ofproto
    
            # 解析原始数据包
            pkt = packet.Packet(msg.data)
    
            # 检查是否有VXLAN层
            try:
                vxlan_pkt = pkt.get_protocol(vxlan.VXLAN)
            except AttributeError:
                print("No VXLAN header found in the packet")
                return
    
            # 获取VNI值
            vni = vxlan_pkt.vni
    
            # 验证VNI是否符合预期,这里只是一个例子,可以根据实际需求修改
            if vni not in [100, 200]:
                print(f"Invalid VNI: {vni}, dropping packet.")
                return
    
            # 创建匹配字段,用于生成流表规则
            match = ofproto_v1_3.OFPMatch(in_port=msg.match['in_port'], eth_type=0x8847)  # VXLAN的Ethertype是0x8847
    
            # 定义动作,这里只是打印消息,实际应用可能需要添加其他动作,如输出端口等
            actions = [ofproto_v1_3.OFPActionOutput(dp.ofproto.OFPP_CONTROLLER)]
    
            # 填充流表条目
            flow_mod = ofproto_v1_3.OFPFlowMod(
                datapath=dp,
                priority=1,
                match=match,
                instructions=[ofproto_v1_3.OFPInstructionActions(ofproto.OFPIT_APPLY_ACTIONS, actions)]
            )
    
            # 下发流表规则
            dp.send_msg(flow_mod)
    
    if __name__ == "__main__":
        parser = argparse.ArgumentParser()
        parser.add_argument("--datapath", type=str, default="tcp:127.0.0.1:6653",
                            help="Datapath to connect (default: tcp:127.0.0.1:6653)")
        args = parser.parse_args()
    
        print("Starting Ryu application...")
        VxlanValidator().run([args.datapath])
    

    这个程序会监听来自OpenFlow交换机的Packet-In事件。当接收到带有VXLAN头的数据包时,它会检查VNI值。如果VNI不符合预期,它将忽略该数据包。否则,它会创建一个匹配新流的流表规则,并将其发送回交换机。

    要运行此程序,请确保有一个OpenFlow控制器正在运行,并将--datapath参数设置为控制器的连接地址。然后执行以下命令启动程序:

    python vyvan_validator.py --datapath tcp:127.0.0.1:6653
    

    注意:这个示例仅作为概念验证,实际部署时可能需要根据具体的VNI验证逻辑、错误处理和流量处理策略进行调整。

    评论

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 5月22日
  • 创建了问题 5月22日

悬赏问题

  • ¥15 python Flassk 模块部署 服务器时报错
  • ¥15 Opencv(C++)异常
  • ¥15 VScode上配置C语言环境
  • ¥15 汇编语言没有主程序吗?
  • ¥15 这个函数为什么会爆内存
  • ¥15 无法装系统,grub成了顽固拦路虎
  • ¥15 springboot aop 应用启动异常
  • ¥15 matlab有关债券凸性久期的代码
  • ¥15 lvgl v8.2定时器提前到来
  • ¥15 qtcp 发送数据时偶尔会遇到发送数据失败?用的MSVC编译器(标签-qt|关键词-tcp)