Exemple #1
0
    def handle_dns(self, dpid, inport, ofp_reason, total_frame_len, buffer_id,
                   packet):
        dnsh = packet.find('dns')
        if not dnsh:
            log.err('received invalid DNS packet', system='dnsspy')
            return CONTINUE

        log.msg(str(dnsh), system='dnsspy')

        for answer in dnsh.answers:
            if answer.qtype == dns.dns.rr.A_TYPE:
                val = self.ip_records[answer.rddata]
                if answer.name not in val:
                    val.insert(0, answer.name)
                    log.msg("add dns entry: %s %s" %
                            (answer.rddata, answer.name),
                            system='dnsspy')
        for addition in dnsh.additional:
            # WHAT IS THIS?! XXX
            #            for char in addition.name:
            #                # some debugging magic in case we have a bad parse in DNS
            #                if not curses.ascii.isascii(char):
            #                    for byte in dnsh.get_layer():
            #                        print '%x' % byte,
            #                    print ''
            #                    continue
            if addition.qtype == dns.dns.rr.A_TYPE:
                val = self.ip_records[addition.rddata]
                if addition.name not in val:
                    val.insert(0, addition.name)
                    log.msg("additional dns entry: %s %s" %
                            (addition.rddata, addition.name),
                            system='dnsspy')

        return CONTINUE
    def handle_dns(self, dpid, inport, ofp_reason, total_frame_len, buffer_id, packet):
        eaddr = util.convert_to_eaddr(packet.src)
        dnsh = packet.find('dns')

        if not self.permit_ether_addr(eaddr):
            print "Dropping DNS Packet - MAC Address not allowed"
            return STOP

        if not dnsh:
            print "Invalid DNS packet:", dnsh, packet
            return CONTINUE

        print "DNS Packet:", dnsh

        for question in dnsh.questions:
            if eaddr in Homework.st['dnsList'] and question.name in Homework.st['dnsList'][eaddr]:
                print "DNS Resquest blocked for", question.name
                return STOP

        flow = util.extract_flow(packet)
        Homework.install_datapath_flow(
             dpid, flow, 3, 10,
             [[openflow.OFPAT_OUTPUT, [-1, openflow.OFPP_NORMAL]]],
             buffer_id, openflow.OFP_DEFAULT_PRIORITY, inport, packet.arr
             )

        return CONTINUE
    def handle_dns(self, dpid, inport, ofp_reason, total_frame_len, buffer_id, packet):
        dnsh = packet.find('dns')
        if not dnsh:
            log.err('received invalid DNS packet',system='dnsspy')
            return CONTINUE

        log.msg(str(dnsh),system='dnsspy')

        for answer in dnsh.answers:
            if answer.qtype == dns.dns.rr.A_TYPE:
                val = self.ip_records[answer.rddata]
                if answer.name not in val:
                    val.insert(0, answer.name)
                    log.msg("add dns entry: %s %s" % (answer.rddata, answer.name), system='dnsspy')
        for addition in dnsh.additional:
# WHAT IS THIS?! XXX            
#            for char in addition.name:
#                # some debugging magic in case we have a bad parse in DNS
#                if not curses.ascii.isascii(char):
#                    for byte in dnsh.get_layer():
#                        print '%x' % byte,
#                    print ''    
#                    continue
            if addition.qtype == dns.dns.rr.A_TYPE: 
                val = self.ip_records[addition.rddata]
                if addition.name not in val:
                    val.insert(0, addition.name)
                    log.msg("additional dns entry: %s %s" % (addition.rddata, addition.name), system='dnsspy')

        return CONTINUE
    def handle_dns_response(self, dpid, inport, ofp_reason, total_frame_len, buffer_id, packet):
        eaddr = util.convert_to_eaddr(packet.dst)
        dnsh = packet.find('dns')

        if not self.permit_ether_addr(eaddr):
            print "Dropping DNS Response Packet - MAC Address not allowed"
            return STOP

        if not dnsh:
            print "\n\n +++ +++ Invalid DNS Response packet: ", dnsh
            print packet
            print dir(packet)
            print packet.__dict__
            print "\n\n"
            return CONTINUE

        print "DNS Response packet:", dnsh

        print "*******", dir(dnsh)
        print "*******", dnsh.__dict__

        for answer in dnsh.answers:
            if answer.qtype in dns.rrtype_to_str:
                domain = answer.name + ":" + dns.rrtype_to_str[answer.qtype]
            else:
                domain = answer.name + ":" + str(answer.qtype)

            if domain not in Homework.st['domains']:
                Homework.st['domains'][domain] = set([str(answer.rddata)])
            else:
                Homework.st['domains'][domain].add(str(answer.rddata))

        flow = util.extract_flow(packet)
        Homework.install_datapath_flow(
             dpid, flow, 3, 10,
             [[openflow.OFPAT_OUTPUT, [-1, openflow.OFPP_NORMAL]]],
             buffer_id, openflow.OFP_DEFAULT_PRIORITY, inport, dnsh.arr
             )

        return CONTINUE