2025年3月28日 星期五 甲辰(龙)年 月廿七 设为首页 加入收藏
rss
您当前的位置:首页 > 计算机 > 编程开发 > Python

python dns模块

时间:08-18来源:作者:点击数:28

dns常见的几种解析类型

记录 解释
A IP Address 记录,通过 hostname 获取到ip 地址。
AAAA IP Address 记录,通过 hostname 获取到ipIPv6 地址.
PTR 反向dns解析, 使用ip 查找hostname记录。
NS 负责域查询的名称服务器记录。NS记录是指定由哪个DNS服务器解析你的域名。
MX 邮件交换器记录。服务器负责处理给定域的电子邮件。
SOA 授权起始记录描述了区域管理员定义的有关区域的一些关键数据
CNAME 规范名称或别名,这允许为资源提供备用名称。
TXT 提供有关域的描述性数据的通用文本记录。一般指某个主机名或域名的说明

使用dnspython 实现dns的查询

安装

  • pip3 install dnspython

通过 dns.resolver.query来实现dns解析查询

query 参数解释

  • qname参数为查询的域名。
  • rdtype参数用来指定RR资源的类型,常用的有:A记录、MX记录、CNAME记录、NS记录、PTR记录等。
  • rdclass参数用于指定网络类型,可选值有IN、CH、与HS,其中IN为默认,使用最广泛。
  • tcp参数用于指定查询是否启用TCP协议,默认为False不启用。
  • source与source_port参数作为指定查询源地址与端口,默认值为查询设备IP地址和0。
  • raise_on_no_answer参数用于指定当查询无应答时是否触发异常,默认为True。

查询一个A记录

  • import dns.resolver
  • domain = 'www.biglittleant.cn'
  • qtype = 'A'
  • answer = dns.resolver.query(domain,qtype, raise_on_no_answer=False)
  • if answer.rrset is not None:
  • print(answer.rrset)

结果

  • biglittleant.github.io. 3600 IN A 185.199.108.153
  • biglittleant.github.io. 3600 IN A 185.199.109.153
  • biglittleant.github.io. 3600 IN A 185.199.110.153
  • biglittleant.github.io. 3600 IN A 185.199.111.153

反向查询,通过ip查询域名

第一步通过 reversename 拿到反转地址

  • from dns import reversename, resolver
  • ip = '13.229.188.59' #github.com 的ip
  • domain_address = reversename.from_address(ip)
  • print(domain_address)
  • qtype = 'PTR'
  • domain_name = str(resolver.query(domain_address, qtype)[0])
  • print(domain_name)

结果

  • 59.188.229.13.in-addr.arpa.
  • ec2-13-229-188-59.ap-southeast-1.compute.amazonaws.com.

NS记录查询

这里输入的域名得是二级域名。三级域名会报错。

  • import dns.resolver
  • myResolver = dns.resolver.Resolver()
  • myResolver.nameservers = ['223.5.5.5', '223.6.6.6']
  • myAnswers = myResolver.query("biglittleant.cn", "NS")
  • if myAnswers.rrset is not None:
  • print(myAnswers.rrset)
  • myAnswers = myResolver.query("qq.com", "NS")
  • if myAnswers.rrset is not None:
  • print(myAnswers.rrset)
  • biglittleant.cn. 3600 IN NS dns10.hichina.com.
  • biglittleant.cn. 3600 IN NS dns9.hichina.com.
  • qq.com. 3600 IN NS ns2.qq.com.
  • qq.com. 3600 IN NS ns1.qq.com.
  • qq.com. 3600 IN NS ns3.qq.com.
  • qq.com. 3600 IN NS ns4.qq.com.

搜索可知,ns.qq.com 是腾讯的dns服务器,hichina.com 是万网的dns服务器。

biglittleant.cn的解析记录是在阿里云,qq.com的解析记录是在腾讯云

txt 记录

这里输入的域名得是二级域名。三级域名会报错。

  • import dns.resolver
  • myResolver = dns.resolver.Resolver()
  • myAnswers = myResolver.query("qq.com", "TXT")
  • if myAnswers.rrset is not None:
  • print(myAnswers.rrset)

结果

  • qq.com. 31 IN TXT "v=spf1 include:spf.mail.qq.com -all"

指定dns server 来查询

  • import dns.resolver
  • myResolver = dns.resolver.Resolver()
  • myResolver.nameservers = ['223.5.5.5', '223.6.6.6']
  • myAnswers = myResolver.query("www.biglittleant.cn", "A")
  • if myAnswers.rrset is not None:
  • print(myAnswers.rrset)

结果

  • biglittleant.github.io. 600 IN A 185.199.110.153
  • biglittleant.github.io. 600 IN A 185.199.111.153
  • biglittleant.github.io. 600 IN A 185.199.109.153
  • biglittleant.github.io. 600 IN A 185.199.108.153

一种偷懒的写法

  • import dns.resolver
  • name = 'wwww.github.com'
  • for qtype in 'A', 'AAAA', 'CNAME', 'MX', 'NS', 'TXT', 'SOA':
  • print(qtype)
  • answer = dns.resolver.query(name, qtype, raise_on_no_answer=False)
  • if answer.rrset is not None:
  • print(answer.rrset)
方便获取更多学习、工作、生活信息请关注本站微信公众号城东书院 微信服务号城东书院 微信订阅号
推荐内容
相关内容
栏目更新
栏目热门
本栏推荐