def query_domain_ns_by_ns(domain,
                          original_ns,
                          ip=None,
                          local_dns=None,
                          timeout=2):
    """
    向域名的NS权威服务器查询域名的IP记录,若有CNAME,则获取CNAME的记录
    :parameter
    domain: 要查询的域名,注意为主域名
    authoritative_ns: 域名的权威服务器地址,可能为域名或IP
    timeout:超时时间
    retry_time:重试次数
    """

    domain_ns = []
    domain_ns_ip = defaultdict(list)
    ns_status = 'FALSE'
    if not ip:
        authoritative_ns = original_ns
        if not judge_legal_ip(authoritative_ns):  # 若为域名,则先解析出来权威服务器的IP
            authoritative_ip, _, auth_ip_cname_status = obtaining_domain_ip(
                authoritative_ns, local_dns)
            if auth_ip_cname_status != "TRUE":
                return domain_ns, domain_ns_ip, ns_status, original_ns
        else:
            authoritative_ip = [authoritative_ns]
    else:
        authoritative_ip = [ip]
    # query = dns.message.make_query(domain, dns.rdatatype.NS, use_edns=True)
    query = dns.message.make_query(domain, dns.rdatatype.NS)
    for _ in authoritative_ip:
        try:
            authoritative_ns = random.choice(authoritative_ip)  # 随机选择一个IP地址
            response = dns.query.udp(query, authoritative_ns, timeout=timeout)
            try:
                for i in response.additional:
                    r = str(i.to_text())
                    for i in r.split('\n'):  # 注意
                        i = i.split(' ')
                        rc_name, rc_type, rc_data = i[0].lower(
                        )[:-1], i[3], i[4]
                        if rc_type == 'A':
                            domain_ns_ip[rc_name].append(rc_data)
            except Exception, e:
                print str(e)

            # 获取ns地址
            for rrset in response.answer:
                r = str(rrset.to_text())
                for i in r.split('\n'):  # 注意
                    i = i.split(' ')
                    rc_type, rc_data = i[3], i[4]
                    if rc_type == 'NS':
                        domain_ns.append(rc_data[:-1])
            ns_status = 'TRUE'
            break
        except dns.resolver.NoAnswer:
            ns_status = 'NO ANSWERS'
            break
Пример #2
0
def query_aaaa_cname_by_ns(domain,
                           authoritative_ns,
                           local_dns='1.2.4.8',
                           timeout=2,
                           retry_time=2):
    """
    向域名的NS权威服务器查询域名的IP记录,若有CNAME,则获取CNAME的记录
    :parameter
    domain: 要查询的域名,注意为全域名
    authoritative_ns: 域名的权威服务器地址,可能为域名或IP
    timeout:超时时间
    retry_time:重试次数
    """

    aaaa, cnames = [], []
    status = 'FALSE'

    if not judge_legal_ip(authoritative_ns):  # 若为域名,则先解析出来权威服务器的IP
        authoritative_ip, _, auth_ip_cname_status = obtaining_domain_ip(
            authoritative_ns, local_dns)
        if auth_ip_cname_status != "TRUE":
            return aaaa, cnames, status
    else:
        authoritative_ip = [authoritative_ns]

    query = dns.message.make_query(domain, dns.rdatatype.AAAA, use_edns=True)
    for _ in range(retry_time):  # 重试次数
        try:
            authoritative_ns = random.choice(authoritative_ip)  # 随机选择一个IP地址
            response = dns.query.udp(query, authoritative_ns, timeout=timeout)
            for rrset in response.answer:
                r = str(rrset.to_text())
                for i in r.split('\n'):  # 注意
                    i = i.split(' ')
                    rc_type, rc_data, rc_ttl = i[3], i[4], i[1]
                    if rc_type == 'AAAA':
                        aaaa.append(rc_data)
                    elif rc_type == 'CNAME':
                        cnames.append(rc_data[:-1].lower())
            aaaa.sort()
            status = 'TRUE'
            break
        except dns.resolver.NoAnswer:
            status = 'NO ANSWERS'
        except dns.resolver.NXDOMAIN:
            status = "NXDOMAIN"  # 只执行一次
            break
        except dns.resolver.NoNameservers:
            status = 'NO NAMESERVERS'
        except dns.resolver.Timeout:
            status = 'TIMEOUT'
        except:
            status = 'UNEXPECTED ERRORS'

    return aaaa, cnames, status
def query_soa_by_ns(domain,
                    authoritative_ns,
                    local_dns='1.2.4.8',
                    timeout=2,
                    retry_time=2):
    """
    向域名的NS权威服务器查询域名的IP记录,若有CNAME,则获取CNAME的记录
    domain: 要查询的域名,注意为全域名
    authoritative_ns: 域名的权威服务器地址,可能为域名或IP
    timeout:超时时间
    retry_time:重试次数
    """

    domain_soa = ""
    status = 'FALSE'

    if not judge_legal_ip(authoritative_ns):  # 若为域名,则先解析出来权威服务器的IP
        authoritative_ip, _, auth_ip_cname_status = obtaining_domain_ip(
            authoritative_ns, local_dns)
        if auth_ip_cname_status != "TRUE":
            return domain_soa, status
    else:
        authoritative_ip = [authoritative_ns]

    query = dns.message.make_query(domain, dns.rdatatype.SOA, use_edns=True)
    for _ in range(retry_time):  # 重试次数
        try:
            authoritative_ns = random.choice(authoritative_ip)  # 随机选择一个IP地址
            response = dns.query.udp(query, authoritative_ns, timeout=timeout)
            for rrset in response.answer:
                r = str(rrset.to_text())
                for i in r.split('\n'):  # 注意
                    i = i.split(' ')
                    rc_type = i[3]
                    if rc_type == 'SOA':
                        domain_soa = ' '.join(i[4:])
            status = 'TRUE'
            break
        except dns.resolver.NoAnswer:
            status = 'NO ANSWERS'
        except dns.resolver.NXDOMAIN:
            status = "NXDOMAIN"  # 只执行一次
            break
        except dns.resolver.NoNameservers:
            status = 'NO NAMESERVERS'
        except dns.resolver.Timeout:
            status = 'TIMEOUT'
        except:
            status = 'UNEXPECTED ERRORS'

    return domain_soa, status
def query_domain_ns_by_ns(domain, original_ns, local_dns=None, timeout=2):
    """
    向域名的NS权威服务器查询域名的IP记录,若有CNAME,则获取CNAME的记录
    :parameter
    domain: 要查询的域名,注意为主域名
    authoritative_ns: 域名的权威服务器地址,可能为域名或IP
    timeout:超时时间
    retry_time:重试次数
    """

    domain_ns = []
    ns_status = 'FALSE'
    authoritative_ns = original_ns
    if not judge_legal_ip(authoritative_ns):  # 若为域名,则先解析出来权威服务器的IP
        authoritative_ip, _, auth_ip_cname_status = obtaining_domain_ip(
            authoritative_ns, local_dns)
        if auth_ip_cname_status != "TRUE":
            return domain_ns, ns_status, original_ns
    else:
        authoritative_ip = [authoritative_ns]

    # query = dns.message.make_query(domain, dns.rdatatype.NS, use_edns=True)
    query = dns.message.make_query(domain, dns.rdatatype.NS)
    try:
        authoritative_ns = random.choice(authoritative_ip)  # 随机选择一个IP地址
        response = dns.query.udp(query, authoritative_ns, timeout=timeout)
        # print response.flags & dns.flags.AA
        for rrset in response.answer:
            r = str(rrset.to_text())
            for i in r.split('\n'):  # 注意
                i = i.split(' ')
                rc_type, rc_data = i[3], i[4]
                if rc_type == 'NS':
                    domain_ns.append(rc_data[:-1])
        ns_status = 'TRUE'
    except dns.resolver.NoAnswer:
        ns_status = 'NO ANSWERS'
    except dns.resolver.NXDOMAIN:
        ns_status = "NXDOMAIN"  # 只执行一次
    except dns.resolver.NoNameservers:
        ns_status = 'NO NAMESERVERS'
    except dns.resolver.Timeout:
        ns_status = 'TIMEOUT'
    except:
        ns_status = 'UNEXPECTED ERRORS'

    return domain_ns, ns_status, original_ns