您的位置:

Python DNS解析库 — dns.resolver详解

在网络编程领域,DNS(Domain Name System)是一个不可或缺的组成部分。它将域名映射成IP地址,并通过通信协议实现远程计算机之间的交互。

一、dns.resolver库

在Python中,我们可以使用“dns.resolver”库实现各种DNS查询。通过网络DNS服务器查询DNS记录,我们可以使用各种类型的选项来执行DNS查询。

使用“dns.resolver库”可以轻松执行DNS查询,如A,AAAA,MX,CNAME等。在Python的dns.resolver库中,提供了各种类和函数,他们是:

import dns.resolver
 
class dns.resolver.Answer(response, name, rdtype, rdclass, ttl, rdlength, rdata)
class dns.resolver.HeatbeatTimer
class dns.resolver.LRUCache(maxsize)
class dns.resolver.Lock
class dns.resolver.NoAnswer
class dns.resolver.NoNameservers
class dns.resolver.NXDOMAIN
class dns.resolver.NoRootSOA
class dns.resolver.Query(name, rdtype=1, rdclass=1)
class dns.resolver.Retry
class dns.resolver.Server(hostname, port=53, *args, **kwargs)
class dns.resolver.Timeout
class dns.resolver.UnexpectedSource
class dns.resolver.UnixResolver
class dns.resolver._Resolution

二、dns.resolver.query

dns.resolver.query(domain, rdtype='A', tcp=False, source=None, raise_on_no_answer=True, lifetime=None, search=True, edns=False, ednsflags=0, payload=128, request_payload=DEFAULT_EDNS_PAYLOAD, tcp_source=None)

这里我们将介绍“dns.resolver.query(domain, rdtype)”并讨论它的一些重要参数。这个函数可以对指定的DNS域名执行DNS查询。

它需要传入的第一个参数是“domain”。 它是你想在DNS服务器中查询的域名。第二个参数为“rdtype”可以传入的值:

'A' – IPv4地址的 A 记录
'AAAA' – IPv6地址的 AAAA 记录
'MX' – 邮件交换器的MX 记录
'NS' – 域名服务器的NS记录
'TXT' – 文本信息的TXT记录
'SOA' – DNS区域的起始控制权的SOA记录
'CNAME' – 规范DNS名称的CNAME记录
'PTR' – 一个指向真实名称的指针
'ANY' – 任何想要查询的记录 

其他选项包括:

  • “tcp”指示哪个查询协议使用;
  • “source”是发送查询的源IP地址;
  • “raise_on_no_answer”确定我们是否想要精确地知道查询未返回任何类型的响应,或者我们是否想通过返回“None”来快速失败。
  • 'lifetime'确定查询的超时时间,以秒为单位。
  • “search”表示是否搜索这个主机的后缀列表。
  • ‘edns‘ 和 ‘ednsflags‘ 选项有关,它们是扩展DNS(EDNS)选项。

示例代码:

import dns.resolver
 
def query_dns(domain, rdtype='A'):
    try:
        answers = dns.resolver.query(domain, rdtype)
        for rdata in answers:
            print(rdata.address)
    except (dns.resolver.NoAnswer, dns.exception.Timeout):
        print('No Answer') 
 
if __name__ == '__main__':
    query_dns('google.com')

我们使用了“dns.resolver.query”函数查找指定域的A记录。 对于IPv4地址,A记录是DNS最常见的类型之一,并且返回IP地址的名称。 在上面的代码中,“try”和“except”块,我们处理了“NoAnswer”和“Timeout”异常情况,并打印“No Answer”。

三、dns.resolver.arpa

在DNS查询中,反向DNS查询是查询使用IP地址的DNS名称。 因此,这种类型的查询反转了查询的“字啊区”,因此这样的查询也称为“ARP”查询。

Python中的反向DNS查询,使用dns.resolver.arpa。 这个库函数接收IP地址的字符串,并返回拥有该地址的域名。类似于以下代码:

import dns.resolver
 
def get_domain_name(ip_address):
    try:
        domain_name = dns.reversename.from_address(ip_address).to_text()
        return dns.resolver.query(domain_name,'PTR')[0].to_text()
    except (dns.resolver.NoAnswer, dns.exception.Timeout):
        return ''
 
if __name__ == '__main__':
    print(get_domain_name('8.8.8.8'))

在上面的示例中,我们使用“dns.resolver.arpa”进行反向DNS查询。 我们使用了“dns.resolver.from_address”解析IP地址并将其反转到域名称。在上面的例子中,“google.com”是返回值。

四、dns.resolver

Python编程语言的dns.resolver库提供了一种查询DNS服务器获取DNS信息的简单方法。该库提供了一组用于实现各种DNS查询的类和函数。

主要类包括“dns.resolver.Query”和“dns.resolver.Response”。 Query类定义了需要查询什么以及其他元数据,而Response类描述了DNS服务器返回的反馈信息。

import dns.resolver
 
def get_ip_address(domain):
    try:
        answers = dns.resolver.query(domain,'A')
        for rdata in answers:
            return rdata.address
    except (dns.resolver.NoAnswer, dns.exception.Timeout):
        return ''
 
if __name__ == '__main__':
    print(get_ip_address('google.com')) 

在上面的示例中,我们使用“dns.resolver”查询所需的IP地址对其进行解析。如果IP地址在DNS服务器中可用,则此函数返回结果,否则返回“”空字符串。

五、dns.resolver选项

以下是dns.resolver选项:

  • resolver.nameservers: 这个选项用于指定一个域名或IP地址的列表,这些地址是检索器所使用的默认名称服务器。
  • resolver.domain:这个选项用于specify或指定默认域。
  • resolver.search:这个选项用于设置默认搜索域列表,当执行“dns.resolver.query”时启用搜索。
  • resolver.timeout:这个选项用于设置超时(秒)的默认时间。
  • resolver.rotate:如果rotate设为True,那么每个DNS查询都将循环遍历名单中的所有名称服务器。
  • resolver.cache:这个选项用于关闭内部DNS查询器的缓存机制。
  • resolver.rsaalg:这个选项用于指定用于DNSSEC(DNS Security Extensions)验证的RSA算法标识符。

以下是dns.resolver 的应用示例代码:

import dns.resolver
 
def get_domain(d, tld='.com'):
    try:
        answers = dns.resolver.query(d + tld, 'NS')
        for rdata in answers:
            print(rdata)
    except (dns.resolver.NoAnswer, dns.exception.Timeout):
        return ''
 
if __name__ == '__main__':
    get_domain('amazon')

上面的函数将查询亚马逊的域名服务器,并在doc的后面打印结果。事实上,我们的应用程序中可以使用request库和dns库来执行DNS查询,来获取DNS记录。 dnspython库是许多独立开发人员使用的DNSPython库的官方版本。