Luis Baldellon

Generation

generate functionFri, 13 Dec 2024

genera script de un controlador ryu para mininet que tenga la politica de solo recibir ping de la vlan 20 y la vlan 30

Aquí te muestro un ejemplo de cómo crear un controlador Ryu para Mininet que solo permita recibir pings de la VLAN 20 y la VLAN 30: ```python from ryu.base import app_manager from ryu.controller import ofp_event from ryu.controller.handler import MAIN_DISPATCHER, DEAD_DISPATCHER from ryu.controller.handler import set_ev_cls from ryu.ofproto import ofproto_v1_3 from ryu.lib.packet import packet from ryu.lib.packet import ethernet from ryu.lib.packet import vlan from ryu.lib.packet import icmp class PingFilter(app_manager.RyuApp): OFP_VERSIONS = [ofproto_v1_3.OFP_VERSION] def __init__(self, *args, **kwargs): super(PingFilter, self).__init__(*args, **kwargs) @set_ev_cls(ofp_event.EventOFPSwitchFeatures, MAIN_DISPATCHER) def switch_features_handler(self, ev): datapath = ev.msg.datapath ofproto = datapath.ofproto parser = datapath.ofproto_parser match = parser.OFPMatch(eth_type=0x0800, vlan_id=20) actions = [parser.OFPActionOutput(ofproto.OF_PORT_ANY)] inst = [parser.OFPInstructionActions(ofproto.OFPIT_APPLY_ACTIONS, actions)] mod = parser.OFPFlowMod(datapath=datapath, priority=0, match=match, instructions=inst) datapath.send_msg(mod) match = parser.OFPMatch(eth_type=0x0800, vlan_id=30) actions = [parser.OFPActionOutput(ofproto.OF_PORT_ANY)] inst = [parser.OFPInstructionActions(ofproto.OFPIT_APPLY_ACTIONS, actions)] mod = parser.OFPFlowMod(datapath=datapath, priority=0, match=match, instructions=inst) datapath.send_msg(mod) @set_ev_cls(ofp_event.EventOFPPacketIn, MAIN_DISPATCHER) def packet_in_handler(self, ev): msg = ev.msg datapath = msg.datapath ofproto = datapath.ofproto parser = datapath.ofproto_parser pkt = packet.Packet(msg.data) eth = pkt.get_protocol(ethernet.ethernet) vlan = pkt.get_protocol(vlan.vlan) icmp = pkt.get_protocol(icmp.icmp) if vlan and (vlan.vlan_id == 20 or vlan.vlan_id == 30): if icmp and icmp.type == 8: # ICMP type 8 es el tipo de ping print("Recibido ping de VLAN %d" % vlan.vlan_id) actions = [parser.OFPActionOutput(ofproto.OF_PORT_ANY)] inst = [parser.OFPInstructionActions(ofproto.OFPIT_APPLY_ACTIONS, actions)] mod = parser.OFPFlowMod(datapath=datapath, priority=0, match=parser.OFPMatch(eth_type=0x0800, vlan_id=vlan.vlan_id), instructions=inst) datapath.send_msg(mod) else: print("No es un ping") actions = [parser.OFPActionOutput(ofproto.OF_PORT_ANY)] inst = [parser.OFPInstructionActions(ofproto.OFPIT_APPLY_ACTIONS, actions)] mod = parser.OFPFlowMod(datapath=datapath, priority=0, match=parser.OFPMatch(eth_type=0x0800, vlan_id=vlan.vlan_id), instructions=inst) datapath.send_msg(mod) else: print("No es una VLAN permitida") actions = [parser.OFPActionOutput(ofproto.OF_PORT_ANY)] inst = [parser.OFPInstructionActions(ofproto.OFPIT_APPLY_ACTIONS, actions)] mod = parser.OFPFlowMod(datapath=datapath, priority=0, match=parser.OFPMatch(eth_type=0x0800), instructions=inst) datapath.send_msg(mod) ``` Este controlador Ryu crea dos flujos de red para permitir que los pings lleguen a la VLAN 20 y la VLAN 30. En el evento `EventOFPPacketIn`, verifica si el paquete es un ping y si la VLAN es permitida. Si es así, imprime un mensaje y crea un nuevo flujo de red para permitir que el paquete llegue a la VLAN. Si no es un ping o la VLAN no es permitida, imprime un mensaje y crea un nuevo flujo de red para bloquear el paquete. Recuerda que debes instalar el paquete `ryu` y `mininet` en tu sistema para ejecutar este controlador. También debes crear un archivo de configuración para Mininet que incluya la red y los switches que se utilizarán en el experimento.

Questions about programming?Chat with your personal AI assistant