dnspython是python 实现的一个dns场景的工具包。

dnspython(http://www.dnspython.org/)是Python实现的一个DNS工具包,它支持几乎所有的记录类型,可以用于查询、传输并动态更新ZONE信息,同时支持TSIG(事务签名)验证消息和EDNS0(扩展DNS)。在系统管理方面,我们可以利用其查询功能来实现DNS服务监控以及解析结果的校验,可以代替nslookup及dig等工具

更多关于域名知识详解博文:Windows系统DNS部署与安全_IT之一小佬的博客-CSDN博客_windows10搭建dns服务器

安装:

pip install dnspython

dns.resolve源码解析:

def resolve(qname, rdtype=dns.rdatatype.A, rdclass=dns.rdataclass.IN,tcp=False, source=None, raise_on_no_answer=True,source_port=0, lifetime=None, search=None):"""Query nameservers to find the answer to the question.This is a convenience function that uses the default resolverobject to make the query.See ``dns.resolver.Resolver.resolve`` for more information on theparameters."""return get_default_resolver().resolve(qname, rdtype, rdclass, tcp, source,raise_on_no_answer, source_port,lifetime, search)

参数解析:

  • qname 指定查询的名称
  • rdtype 指定查询的类型 默认是A记录
  1. A记录,将主机名转换为IP地址;
  2. MX记录,邮件交换记录,定义邮件服务器的域名;
  3. CNAME记录,指别名记录,实现域名间的映射;
  4. NS记录,标记区域的域名服务器及授权子域;
  5. PTR记录,反向解析,与A记录相反,将IP转换为主机名;
  6. SOA记录,SOA标记,一个起始授权区的定义。
  • rdclass 指定查询的网络类型 ,可选的值有IN、CH与HS,默认是 IN
  • tcp 是否启用tcp查询模式
  • source 和source_port 指定 查询用的源地址和端口
  • raise_on_no_answer 查询无结果的时候,是否需要抛出异常
  • lifetime 声明周期配置参数,采用默认值

1、A记录  实现A记录查询方法源码

示例代码:

# 导包
import dns.resolverdomain = 'www.baidu.com'# 获取解析对象
query_object = dns.resolver.resolve(qname=domain, rdtype='A')  # 指定查询记录为A
print('查询对象:{}'.format(query_object))print('*' * 100)# 查看response对象
response_object = query_object.response
print('应答对象:{}'.format(response_object))print('*' * 100)# 查询answer对象
answer_object = response_object.answer
print('解析对象:{}'.format(answer_object))print('*' * 100)# 查看解析条目对象
answer_object = response_object.answer
for query_item in answer_object:print('查询条目:{}'.format(query_item))print('*' * 100)# 解析后的记录条目
query_item = response_object.answer[0]
# print(query_item)
for item in query_item:print('解析记录:{}'.format(item))print('*' * 100)

运行结果:

示例代码:

# 导包
import dns.resolverdomain = 'www.baidu.com'query_object = dns.resolver.resolve(qname=domain, rdtype='A')
for query_item in query_object.response.answer:for item in query_item.items:print("{}的A记录解析地址有:{}".format(domain, item))

运行结果:

示例代码:

import dns.resolverdomain = 'www.baidu.com'
# 指定查询类型为A记录
A = dns.resolver.query(domain, 'A')
# 通过response.answer方法获取查询信息
for i in A.response.answer:print('+' * 100)print(i)# 遍历回应信息for j in i.items:print(j)print("*" * 100)

运行结果:

2、MX记录 实现MX记录查询方法源码

示例代码:

# 必须这样导入
import dns.resolverret = dns.resolver.query('dnspython.org', 'MX')
print(ret)for data in ret:print(data)print('*' * 100)for data in ret:print(data.exchange, data.preference)print('*' * 100)ret2 = dns.resolver.resolve('dnspython.org', 'MX')
print(ret2)
for data in ret2:print(data.exchange, data.preference)

运行结果:

示例代码:

import dns.resolverdomain = '126.com'# 获取解析对象
query_object = dns.resolver.resolve(domain, 'MX')  # MX记录
print('MX记录的结果:{}'.format(query_object))print('*' * 100)# 从应答的response中获取查询记录
resp_object = query_object.response
print('MX记录的结果:{}'.format(resp_object))print('*' * 100)# 从应答的answer中获取查询目录
answer_object = resp_object.answer
print('MX记录的结果:{}'.format(answer_object))print('*' * 100)# 查看解析条目对象
answer_object = resp_object.answer
for query_item in answer_object:print('查询条目:{}'.format(query_item))print('*' * 100)# 查看解析后的记录条目
query_item = resp_object.answer[0]
for item in query_item.items:print('查询条目:{}'.format(item))print('*' * 100)# 查看解析后的记录条目-详细
query_item = resp_object.answer[0]
for item in query_item.items:print('邮件服务器权重:{},邮件服务器地址:{}'.format(item.preference, item.exchange))

运行结果:

示例代码:

# 导包
import dns.resolverdomain = '126.com'query_object = dns.resolver.resolve(domain, 'MX')
for query_item in query_object.response.answer:for item in query_item.items:print('邮件服务器权重:{},邮件服务器地址:{}'.format(item.preference, item.exchange))

运行结果:

示例代码:

import dns.resolver# 输入域名地址
domain = 'baidu.com'# 指定查询类型为MX
MX = dns.resolver.query(domain, 'MX')# 遍历回应结果,输出MX记录的preference及exchanger信息
for i in MX:print('MX preference=', i.preference, 'mail exchange=', i.exchange)

运行结果:

3、NS记录 实现NS记录查询方法源码

NS(Name Server)域名服务器记录。用来表明由哪台服务器对该域名进行解析。在注册域名时,总有默认的DNS服务器,每个注册的域名都是由一个DNS域名服务器来进行解析的。但是需要注意的是只能输入一级域名,如:baidu.com;对于二级以及多级域名,如www.baidu.com、wenku.baidu.com则是错误的。

示例代码:

# 导包
import dns.resolverdomain = '126.com'NS = dns.resolver.resolve(domain, 'NS')
for i in NS.response.answer:for j in i.items:print(j.to_text())

运行结果:

4、CNAME记录 实现CNAME记录查询方法源码

示例代码:

# 导包
import dns.resolverdomain = 'www.baidu.com'CNAME = dns.resolver.resolve(domain, 'CNAME')
for i in CNAME.response.answer:for j in i.items:print(j.to_text())

运行结果:

5、案例分析:DNS域名轮询业务监控

大部分的DNS解析都是一个域名对应一个IP地址,但是通过DNS轮询技术可以做到一个域名对应多个IP,从而实现最简单高效的负载均衡,不过此方案最大的弊端是目标主机不可用时无法被自动剔除,因此做好业务主机的服务可用监控至关重要。

实现步骤:

  1. 实现域名的解析,获取域名所有的A记录解析IP列表
  2. 对IP列表进行HTTP级别的探测

具体实现方式:

第一步通过dns.resolver.query()方法获取业务域名A记录信息,查询出所有IP地址列表;

第二步使用httplib模块的request()方法以GET请求监控页面,监控业务所有服务的IP是否正常。

示例代码:

import dns.resolver
import http.client# 定义域名ip列表变量
ip_list = []
# 定义业务域名
app_domain = "www.baidu.com"
# app_domain = "www.blog.csdn.net"# 域名解析函数,解析成功IP将被追加到ip_list
def get_ip_list(domain=""):try:A = dns.resolver.query(domain, 'A')except Exception as e:print("dns resolver error: " + str(e))returnfor i in A.response.answer:for j in i.items:# 追加到ip_list列表ip_list.append(j)return Truedef check_ip(ip):check_url = str(ip) + ": 80"get_content = ""# 定义http连接5秒超时(5)秒http.client.socket.setdefaulttimeout(5)# 创建http连接对象conn = http.client.HTTPConnection(check_url)try:# 发起url请求,添加host主机头conn.request("GET", "/", headers={"Host": app_domain})r = conn.getresponse()# 获取URL页面前15个字符用来可用性效验get_content = r.read(15)finally:# 监控URL页的内容一般是事先定义好的比如http 200等# 判断是否为字节if isinstance(get_content, bytes):get_content = get_content.decode('utf-8')if get_content == "<!DOCTYPE html>":print(str(ip) + "\033[32;1m [ok]\033[0m")else:print(str(ip) + "\033[31;1m [Error]\033[0m")# 获取response的状态码print(r.reason)# 获取response的状态 ok或errorprint(r.status)if __name__ == "__main__":# 域名解析正确且至少返回一个IPif get_ip_list(app_domain) and len(ip_list) > 0:for ip in ip_list:check_ip(ip)else:print("dns resolver error.")

运行结果:

参考博文:

python运维常用模块(三)——DNS处理模块dnspython - jiayou111 - 博客园

python中dns库用法详解(DNS处理模块)相关推荐

  1. python中os库用法详解(总结)

    os库主要是对文件和文件夹进行操作,在Python中对⽂件和⽂件夹的操作要借助os模块⾥⾯的相关功能. 具体步骤如下: 1. 导⼊os模块 import os 2. 使⽤ os 模块相关功能 os.函 ...

  2. python中flask_caching库用法详解(缓存)

    为了尽量减少缓存穿透,并同时减少web的响应时间,可以针对那些需要一定时间才能获取结果的函数和那些不需要频繁更新的视图函数提供缓存服务,可以在一定的时间内直接返回结果而不是每次都需要计算或者从数据库中 ...

  3. python中openpyxl库用法详解

    openpyxl模块是一个读写Excel 文档的Python库,openpyxl是一个比较综合的工具,能够同时读取和修改Excel文档. openpyxl.load_workbook(地址) - 打开 ...

  4. python中cpca库用法详解(从文本中提取省市区)

    一个用于提取简体中文字符串中省,市和区并能够进行映射,检验和简单绘图的python模块. 首先安装cpca库: pip install cpca Github: GitHub - DQinYuan/c ...

  5. python中IPy库用法详解

    使用python遍历所有的ip,可以借助第三方库IPy来获取所有的ip. 安装IPy库: pip install IPy 1.遍历IP网段中所有IP并打印个数 示例代码1: import IPydef ...

  6. python中ipaddress库用法详解

    ipaddress库提供了处理IPv4与IPv6网络地址的类.这些类支持验证,查找网络上的地址和主机,以及其他常见的操作. 示例代码1: import ipaddressx = ipaddress.i ...

  7. python中gzip库用法详解(压缩和解压缩)

    1.使用gzip创建一个文件: 示例代码: import gzip# 创建一个gzip文件 content = "Hello world!" f = gzip.open('file ...

  8. python中ipaddr库用法详解

    首先安装ipaddr库 pip install ipaddr 判断一个IP地址是否在某个网段内: import ipaddrip = ipaddr.IPv4Address("192.168. ...

  9. python中zlib库用法详解(压缩与解压缩)

    zlib主要用于压缩与解压缩 字符串:使用zlib.compress可以压缩字符串.使用zlib.decompress可以解压字符串. 数据流:压缩:compressobj,解压:decompress ...

  10. python中base64库用法详解

    Base64是一种用64个字符来表示任意二进制数据的方法. 示例代码1: from base64 import b64encode, b64decodewith open(r'./text.txt', ...

最新文章

  1. php开发自学经典.pdf_PHP从入门到精通(第3版) PDF扫描版[45MB]
  2. SAP S4HANA 账户组的配置里'Int.Std.Grping'选项没勾选导致ABAP程序报错
  3. 初识OSGI.NET插件框架
  4. 漫画:老板扣了我1000,因为我没记住阿里巴巴开发手册的这条规则。
  5. 第一章 统计学概论
  6. 亚伦•斯沃茨:提升时间的品质
  7. iOS 快速实现分页界面的搭建
  8. 6-6-3:STL之map和set——multiset和multimap及set和map在oj题中的用处
  9. 第一百零四天 how can I 坚持
  10. 计算机网络,IP地址概念及IP地址详细分类介绍、及子网掩码详细介绍MAC地址介绍、网络位,主机位、网络地址、广播地址。
  11. bzoj千题计划181:bzoj1878: [SDOI2009]HH的项链
  12. 3.6. Pure-FTPd + LDAP + MySQL + PGSQL + Virtual-Users + Quota
  13. 2048小程序代码c语言,微信小程序版2048
  14. 通过java调用webservice服务详细案例一
  15. 电脑知识:台式电脑如何使用无线网上网?
  16. C++编程第一步:判断一个数字是不是整数
  17. 如何使用图片自定义和装饰您的QR码
  18. Laravel SQL查询中first、pluck、lists方法的使用
  19. Exception: java.io.IOException: Keystore was tampered with, or password was incorrect
  20. winform直接控制云台_比 2 代便宜的灵眸手机云台 3,竟然还多了 15 条新亮点!...

热门文章

  1. 豆瓣源安装requirements.txt方法
  2. 流水线技术概念及计算
  3. vue项目中使用echarts完成图表类的开发之饼图,环形图
  4. 股票最新最全的短线操作方法
  5. Armbian 笔记六_使用 armbian-ddbr 命令 备份/还原 eMMC 系统
  6. 中兴通讯 嵌入式开发工程师 校招一面面经
  7. JAVA面试集合类之ArrayList详解
  8. cesium中添加高程terrain地形
  9. HDU 1280 前m大的数(暴力)
  10. 经典的邮件群发情景分析和解决方案