DNSpython 是一个 Python 实现的 DNS 工具包,它支持几乎所有的记录类型,可以用于查询、传输并动态更新 ZONE 信息,同时支持 TSIG(事务签名)验证消息和 EDNS0(扩展 DNS),在系统管理方面,可以利用其查询功能来实现 DNS 服务监控以及解析结果的校验,可以代替 nslookup 及 dig 等工具。
1、安装:通过 pip 命令安装 dnspython 模块,如pip install dnspython
。
2、常用方法:提供了多种域名解析方法,常用的是dns.resolver.query
方法,例如查询 A 记录可写为A = dns.resolver.query('www.google.com', 'A')
。
1、A 记录:将主机名转换成 IP 地址,如查询www.baidu.com
的 A 记录,代码如下:
import dns.resolver domain = "www.baidu.com" A = dns.resolver.query(domain, 'A') for i in A.response.answer: for j in i.items: print(j)
执行结果会输出www.baidu.com
对应的多个 IP 地址。
2、MX 记录:邮件交换记录,定义邮件服务器的域名,查询google.com
的 MX 记录示例如下:
import dns.resolver domain = "google.com" MX = dns.resolver.query(domain, 'MX') for i in MX: print('MX preference=', i.preference, 'mail exchange=', i.exchange)
执行结果会输出类似MX preference= 10 mail exchange= aspmx.l.google.com.
等信息。
3、NS 记录:标记区域的域名服务器及授权子域,查询example.com
的 NS 记录代码如下:
import dns.resolver domain = "example.com" NS = dns.resolver.query(domain, 'NS') for i in NS: print(i.target)
执行结果会输出example.com
的域名服务器信息。
4、CNAME 记录:指别名记录,实现域名间的映射,例如查询cname.example.com
的 CNAME 记录:
import dns.resolver domain = "cname.example.com" CNAME = dns.resolver.query(domain, 'CNAME') for i in CNAME: print(i.target)
执行结果会输出cname.example.com
指向的域名。
5、PTR 记录:反向解析,与 A 记录相反,将 IP 转换为主机名,查询 IP 地址8.8.8.8
的 PTR 记录代码如下:
import dns.resolver ip_address = "8.8.8.8" PTR = dns.resolver.query(ip_address, 'PTR') for i in PTR: print(i.target)
执行结果会输出该 IP 地址对应的域名。
6、SOA 记录:SOA 标记,一个起始授权区的定义,查询example.com
的 SOA 记录代码如下:
import dns.resolver domain = "example.com" SOA = dns.resolver.query(domain, 'SOA') for i in SOA: print(i)
执行结果会输出example.com
的 SOA 记录信息。
1、如何指定查询的源 IP 地址和端口:可以在dns.resolver.query
方法中使用source
和source_port
参数来指定查询用的源地址和端口。A = dns.resolver.query('www.google.com', 'A', source='192.168.1.1', source_port=53)
。
2、如何处理查询无应答的情况:可以在dns.resolver.query
方法中使用raise_on_no_answer
参数来指定查询无应答时是否抛出异常,如果设置为False
,则不会抛出异常;如果设置为True
,则会抛出异常。A = dns.resolver.query('www.nonexistentdomain.com', 'A', raise_on_no_answer=False)
。