Python DNS解析之pydns/py3dns使用文档

由于工作中需要解析大量域名,获取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: 查询记录类型,如ACNAMEMX
  • 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反查

可使用revlookuprevlookupall实现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.comA记录信息:

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地址

参考:https://itbilu.com/other/relate/EyxzdVl3.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章