由于工作中需要解析大量域名,获取DNS解析记录信息,于是找到了pydns库,此第三方库支持DNS解析,但是发现缺乏相关文档,特此整理了pydns/py3dns的使用文档。
前提
在此之前,你可能需要回顾下DNS有关基础知识,特别是域名相关解析记录类型,如下:
A记录: 将域名指向一个IPv4地址(例如:100.100.100.100),需要增加A记录
CNAME记录: 如果将域名指向一个域名,实现与被指向域名相同的访问效果,需要增加CNAME记录。这个域名一般是主机服务商提供的一个域名
MX记录: 建立电子邮箱服务,将指向邮件服务器地址,需要设置MX记录。建立邮箱时,一般会根据邮箱服务商提供的MX记录填写此记录
NS记录: 域名解析服务器记录,如果要将子域名指定某个域名服务器来解析,需要设置NS记录
TXT记录: 可任意填写,可为空。一般做一些验证记录时会使用此项,如:做SPF(反垃圾邮件)记录
AAAA记录: 将主机名(或域名)指向一个IPv6地址(例如:ff03:0:0:0:0:0:0:c1),需要添加AAAA记录
SRV记录: 添加服务记录服务器服务记录时会添加此项,SRV记录了哪台计算机提供了哪个服务。格式为:服务的名字.协议的类型(例如:_example-server._tcp)。
SOA记录: SOA叫做起始授权机构记录,NS用于标识多台域名解析服务器,SOA记录用于在众多NS记录中那一台是主服务器
PTR记录: PTR记录是A记录的逆向记录,又称做IP反查记录或指针记录,负责将IP反向解析为域名
显性URL转发记录: 将域名指向一个http(s)协议地址,访问域名时,自动跳转至目标地址。例如:将www.liuht.cn显性转发到www.itbilu.com后,访问www.liuht.cn时,地址栏显示的地址为:www.itbilu.com。
隐性UR转发记录L: 将域名指向一个http(s)协议地址,访问域名时,自动跳转至目标地址,隐性转发会隐藏真实的目标地址。例如:将www.liuht.cn显性转发到www.itbilu.com后,访问www.liuht.cn时,地址栏显示的地址仍然是:www.liuht.cn。
DNS默认端口为:53
DNS同时支持UDP和TCP协议,但一般情况下使用的都是UDP协议,关于协议的使用场景,可阅读:https://draveness.me/whys-the-design-dns-udp-tcp
好的,了解了DNS的基础知识,下面我们开始介绍pydns的使用方法
库导入
pydns/py3dns使用时,库导入方法如下:
import DNS
此处我遇到了问题,发现如果和 dnspython 混用的话,会出现无法导入的问题,具体原因不得而知,解决办法是 卸载 dnspython 和 pydns/py3dns,然后再重新安装
sudo pip uninstall dnspython
sudo pip uninstall pydns
sudo pip install pydns
使用
简单查询
使用 dnslookup
方法来进行查询,其参数有三个,分别是:
- name: 需要查询的域名
- qtype: 查询记录类型,如
A
、CNAME
、MX
等 - timeout: dns解析超时时间,默认值为 30s
查询 baidu A记录信息:
DNS.dnslookup('www.baidu.com', qtype='A') # ['www.a.shifen.com', '220.181.38.149', '220.181.38.150']
查询 baidu CNAME 信息:
DNS.dnslookup('www.baidu.com', qtype='CNAME') # ['www.a.shifen.com']
查询MX记录
可 使用 dnslookup
指定qtype
为 MX,也可以直接使用 mxlookup
方法来进行查询,其有两个参数:
- name: 需要查询的域名
- timeout: dns解析超时时间,默认值为 30s
例:
DNS.mxlookup('www.baidu.com') # ['www.a.shifen.com']
DNS反查
可使用revlookup
与revlookupall
实现DNS反查功能,两者的区别在于 revlookup
只会返回一条记录,而revlookupall
会返回所以查到的记录,两者参数相同如下:
- name: 需要查询的域名
- timeout: dns解析超时时间,默认值为 30s
例子:
DNS.revlookupall("10.237.8.5")
DNS.revlookup("10.237.8.5")
高级查询
可能有时候,上面的参数并不能满足我们的需求,比如需要从特定的DNS Server上面查询,从特定端口查询,从特定协议上查询等,DnsRequest类可以满足你的需求,DnsRequest 类创建时,常用的参数有:
- name: 需要查询的域名,如想支持多个域名,可使用
,
分隔 - protocol:使用的协议,默认为 udp
- port: 使用的端口,默认为 53
- qtype: 解析记录类型,默认为A记录
- timeout: 超时时间,默认为 30s
- server: DNS server列表,默认为空
例1:查询 www.baidu.com
A记录信息:
req = DNS.DnsRequest(name="www.baidu.com")
r = req.req() # 发动查询请求
r.show() # 展示查询详情,类似于 dig www.baidu.com 结果
print(r.answers) # DNS响应的数据
例2:查询 www.baidu.com
CNAME 信息,指定端口为 53,使用TCP协议、超时时间为 20,DNS地址为 8.8.8.8
req = DNS.DnsRequest(name="www.baidu.com", qtype="CNAME", port=53, protocol='tcp', server=['8.8.8.8'])
r = req.req(timeout=20)
print(r.answers)
r.show()
其他
ParseResolvConf : 加载DNS解析配置,从而设置默认server地址,参数 resolv_path 指定配置地址,默认从 /etc/resolv.conf
读取DNS配置
例:
DNS.ParseResolvConf() # 从 /etc/resolv.conf 加载DNS server地址