Example #1
0
File: snat.py Project: John-Lin/nat
    def __init__(self, *args, **kwargs):
        super(SNAT, self).__init__(*args, **kwargs)
        wsgi = kwargs['wsgi']
        wsgi.register(SNATRest, {nat_instance_name: self})

        nat_settings = settings.load()

        self.wan_port = nat_settings['wan_port']

        self.gateway = str(nat_settings['default_gateway'])

        self.nat_public_ip = str(nat_settings['nat_public_ip'])
        self.nat_private_ip = nat_settings['dhcp_gw_addr']

        self.private_subnetwork = nat_settings['ip_network']

        self.MAC_ON_WAN = nat_settings['MAC_ON_WAN']
        self.MAC_ON_LAN = nat_settings['MAC_ON_LAN']
        self.IDLE_TIME = 10

        self.port_counter = -1
        self.ports_pool = range(2000, 65536)

        pp = pprint.PrettyPrinter(indent=2)
        pp.pprint(nat_settings)
Example #2
0
File: snat.py Project: John-Lin/nat
    def nat_config_save(self, req, **kwargs):
        json_body = json.loads(req.body)

        save_dict = settings.load()
        if save_dict is None:
            save_dict = {}

        save_dict['wan_port'] = json_body.get('wanPort')
        save_dict['nat_public_ip'] = IPAddress(json_body.get('natPublicIp'))
        save_dict['default_gateway'] = IPAddress(json_body.get('defaultGateway'))

        net = json_body.get('natPrivateNetwork') + '/24'
        save_dict['ip_network'] = IPNetwork(net)
        save_dict['dhcp_gw_addr'] = IPNetwork(net)[1]

        save_dict['broadcast_addr'] = IPAddress('192.168.8.255')
        save_dict['dns_addr'] = IPAddress('8.8.8.8')

        save_dict['dhcp_hw_addr'] = '08:00:27:b8:0f:8d'
        save_dict['MAC_ON_WAN'] = '00:0e:c6:87:a6:fb'
        save_dict['MAC_ON_LAN'] = '00:0e:c6:87:a6:fa'

        if settings.save(save_dict):
            pp = pprint.PrettyPrinter(indent=2)
            pp.pprint(save_dict)
            return Response(status=200)
        else:
            return Response(status=400)
Example #3
0
File: snat.py Project: Robin131/NAT
    def nat_config_save(self, req, **kwargs):
        json_body = json.loads(req.body)

        save_dict = settings.load()
        if save_dict is None:
            save_dict = {}

        save_dict['wan_port'] = json_body.get('wanPort')
        save_dict['nat_public_ip'] = IPAddress(json_body.get('natPublicIp'))
        save_dict['default_gateway'] = IPAddress(
            json_body.get('defaultGateway'))

        net = json_body.get('natPrivateNetwork') + '/24'
        save_dict['ip_network'] = IPNetwork(net)
        save_dict['dhcp_gw_addr'] = IPNetwork(net)[1]

        save_dict['broadcast_addr'] = IPAddress('192.168.8.255')
        save_dict['dns_addr'] = IPAddress('8.8.8.8')

        save_dict['dhcp_hw_addr'] = '08:00:27:b8:0f:8d'
        save_dict['MAC_ON_WAN'] = '00:0e:c6:87:a6:fb'
        save_dict['MAC_ON_LAN'] = '00:0e:c6:87:a6:fa'

        if settings.save(save_dict):
            pp = pprint.PrettyPrinter(indent=2)
            pp.pprint(save_dict)
            return Response(status=200)
        else:
            return Response(status=400)
Example #4
0
File: snat.py Project: Robin131/NAT
    def __init__(self, *args, **kwargs):
        super(SNAT, self).__init__(*args, **kwargs)
        wsgi = kwargs['wsgi']
        wsgi.register(SNATRest, {nat_instance_name: self})

        nat_settings = settings.load()

        self.wan_port = nat_settings['wan_port']

        self.gateway = str(nat_settings['default_gateway'])

        self.nat_public_ip = str(nat_settings['nat_public_ip'])
        self.nat_private_ip = nat_settings['dhcp_gw_addr']

        self.private_subnetwork = nat_settings['ip_network']

        self.MAC_ON_WAN = nat_settings['MAC_ON_WAN']
        self.MAC_ON_LAN = nat_settings['MAC_ON_LAN']
        self.IDLE_TIME = 10

        self.port_counter = -1
        self.ports_pool = range(2000, 65536)

        pp = pprint.PrettyPrinter(indent=2)
        pp.pprint(nat_settings)
Example #5
0
    def _packet_in_handler(self, ev):
        msg = ev.msg
        datapath = msg.datapath
        ofproto = datapath.ofproto
        parser = datapath.ofproto_parser
        in_port = msg.match['in_port']

        nat_settings = settings.load()
        wan_port = nat_settings['wan_port']

        if in_port == wan_port:
            # self.logger.info("ignore packet coming from WAN port 3")
            # ignore packet coming from WAN port
            return
        pkt = packet.Packet(msg.data)
        eth = pkt.get_protocols(ethernet.ethernet)[0]

        if eth.ethertype == ether_types.ETH_TYPE_LLDP:
            # ignore lldp packet
            return
        dst = eth.dst
        src = eth.src

        dpid = datapath.id
        self.mac_to_port.setdefault(dpid, {})

        # self.logger.info("packet in %s %s %s %s", dpid, src, dst, in_port)

        # learn a mac address to avoid FLOOD next time.
        self.mac_to_port[dpid][src] = in_port

        if dst in self.mac_to_port[dpid]:
            out_port = self.mac_to_port[dpid][dst]
        else:
            out_port = ofproto.OFPP_FLOOD

        actions = [parser.OFPActionOutput(out_port)]

        # install a flow to avoid packet_in next time
        if out_port != ofproto.OFPP_FLOOD:
            match = parser.OFPMatch(in_port=in_port, eth_dst=dst)
            # verify if we have a valid buffer_id, if yes avoid to send both
            # flow_mod & packet_out
            if msg.buffer_id != ofproto.OFP_NO_BUFFER:
                ofp_helper.add_flow(datapath, 1, match, actions, msg.buffer_id)
                return
            else:
                ofp_helper.add_flow(datapath, 1, match, actions)
        data = None
        if msg.buffer_id == ofproto.OFP_NO_BUFFER:
            data = msg.data

        out = parser.OFPPacketOut(datapath=datapath,
                                  buffer_id=msg.buffer_id,
                                  in_port=in_port,
                                  actions=actions,
                                  data=data)
        datapath.send_msg(out)
Example #6
0
    def _packet_in_handler(self, ev):
        msg = ev.msg
        datapath = msg.datapath
        ofproto = datapath.ofproto
        parser = datapath.ofproto_parser
        in_port = msg.match['in_port']

        nat_settings = settings.load()
        wan_port = nat_settings['wan_port']

        if in_port == wan_port:
            # self.logger.info("ignore packet coming from WAN port 3")
            # ignore packet coming from WAN port
            return
        pkt = packet.Packet(msg.data)
        eth = pkt.get_protocols(ethernet.ethernet)[0]

        if eth.ethertype == ether_types.ETH_TYPE_LLDP:
            # ignore lldp packet
            return
        dst = eth.dst
        src = eth.src

        dpid = datapath.id
        self.mac_to_port.setdefault(dpid, {})

        # self.logger.info("packet in %s %s %s %s", dpid, src, dst, in_port)

        # learn a mac address to avoid FLOOD next time.
        self.mac_to_port[dpid][src] = in_port

        if dst in self.mac_to_port[dpid]:
            out_port = self.mac_to_port[dpid][dst]
        else:
            out_port = ofproto.OFPP_FLOOD

        actions = [parser.OFPActionOutput(out_port)]

        # install a flow to avoid packet_in next time
        if out_port != ofproto.OFPP_FLOOD:
            match = parser.OFPMatch(in_port=in_port, eth_dst=dst)
            # verify if we have a valid buffer_id, if yes avoid to send both
            # flow_mod & packet_out
            if msg.buffer_id != ofproto.OFP_NO_BUFFER:
                ofp_helper.add_flow(datapath, 1, match, actions, msg.buffer_id)
                return
            else:
                ofp_helper.add_flow(datapath, 1, match, actions)
        data = None
        if msg.buffer_id == ofproto.OFP_NO_BUFFER:
            data = msg.data

        out = parser.OFPPacketOut(datapath=datapath, buffer_id=msg.buffer_id,
                                  in_port=in_port, actions=actions, data=data)
        datapath.send_msg(out)
Example #7
0
File: dhcp.py Project: John-Lin/nat
    def __init__(self, *args, **kwargs):
        super(SimpleDHCPServer, self).__init__(*args, **kwargs)

        self.dhcp_msg_type_code = {
            1: 'DHCP_DISCOVER',
            2: 'DHCP_OFFER',
            3: 'DHCP_REQUEST',
            4: 'DHCP_DECLINE',
            5: 'DHCP_ACK',
            6: 'DHCP_NAK',
            7: 'DHCP_RELEASE',
            8: 'DHCP_INFORM',
        }

        dhcp_settings = settings.load()

        self.dhcp_addr = dhcp_settings['dhcp_gw_addr']

        self.gw_addr = dhcp_settings['dhcp_gw_addr']
        self.broadcast_addr = dhcp_settings['broadcast_addr']

        self.ip_network = dhcp_settings['ip_network']
        self.ip_pool_list = list(self.ip_network)

        self.dns_addr = dhcp_settings['dns_addr']

        self.dhcp_hw_addr = dhcp_settings['dhcp_hw_addr']

        self.mac_to_client_ip = {}

        assert self.dhcp_addr in self.ip_pool_list
        assert self.gw_addr in self.ip_pool_list

        # self.ip_pool_list.remove(self.dhcp_addr)
        self.ip_pool_list.remove(self.gw_addr)
        self.ip_pool_list.remove(self.broadcast_addr)
        self.ip_pool_list.remove(self.ip_network[0])
Example #8
0
File: dhcp.py Project: Robin131/NAT
    def __init__(self, *args, **kwargs):
        super(SimpleDHCPServer, self).__init__(*args, **kwargs)

        self.dhcp_msg_type_code = {
            1: 'DHCP_DISCOVER',
            2: 'DHCP_OFFER',
            3: 'DHCP_REQUEST',
            4: 'DHCP_DECLINE',
            5: 'DHCP_ACK',
            6: 'DHCP_NAK',
            7: 'DHCP_RELEASE',
            8: 'DHCP_INFORM',
        }

        dhcp_settings = settings.load()

        self.dhcp_addr = dhcp_settings['dhcp_gw_addr']

        self.gw_addr = dhcp_settings['dhcp_gw_addr']
        self.broadcast_addr = dhcp_settings['broadcast_addr']

        self.ip_network = dhcp_settings['ip_network']
        self.ip_pool_list = list(self.ip_network)

        self.dns_addr = dhcp_settings['dns_addr']

        self.dhcp_hw_addr = dhcp_settings['dhcp_hw_addr']

        self.mac_to_client_ip = {}

        assert self.dhcp_addr in self.ip_pool_list
        assert self.gw_addr in self.ip_pool_list

        # self.ip_pool_list.remove(self.dhcp_addr)
        self.ip_pool_list.remove(self.gw_addr)
        self.ip_pool_list.remove(self.broadcast_addr)
        self.ip_pool_list.remove(self.ip_network[0])