DNS处理模块 dnspython

DNS处理模块 dnspython

    • 标题介绍
    • 安装dnspython 模块
    • 常用方法介绍
    • 实践:DNS域名轮询业务监控

标题介绍

Dnspython 是 Python 的 DNS 工具包。它可用于查询、区域传输、动态更新、名称服务器测试和许多其他事情。
dnspython 模块提供了大量的 DNS 处理方法,最常用的方法是域名查询。
dspython 提供了一个DNS 解析器类–resolve,使用它的 reslover方法来实现域名的查询功能。

安装dnspython 模块

采用pip的方式直接安装

pip install dnspython

dns.resolve 源码如下

def resolve(self,qname: Union[dns.name.Name, str],rdtype: Union[dns.rdatatype.RdataType, str] = dns.rdatatype.A,rdclass: Union[dns.rdataclass.RdataClass, str] = dns.rdataclass.IN,tcp: bool = False,source: Optional[str] = None,raise_on_no_answer: bool = True,source_port: int = 0,lifetime: Optional[float] = None,search: Optional[bool] = None,) -> Answer: resolution = _Resolution(self, qname, rdtype, rdclass, tcp, raise_on_no_answer, search)start = time.time()while True:(request, answer) = resolution.next_request()# Note we need to say "if answer is not None" and not just# "if answer" because answer implements __len__, and python# will call that.  We want to return if we have an answer# object, including in cases where its length is 0.if answer is not None:# cache hit!return answerassert request is not None  # needed for type checkingdone = Falsewhile not done:(nameserver, tcp, backoff) = resolution.next_nameserver()if backoff:time.sleep(backoff)timeout = self._compute_timeout(start, lifetime, resolution.errors)try:response = nameserver.query(request,timeout=timeout,source=source,source_port=source_port,max_size=tcp,)except Exception as ex:(_, done) = resolution.query_result(None, ex)continue(answer, done) = resolution.query_result(response, None)if answer is not None:return answer

resolve 方法的定义如下:
参数解析:
● qname 指定查询的名称
● rdtype 指定查询的类型 默认是A记录

  • A记录,将主机名转换为IP地址;
  • MX记录,邮件交换记录,定义邮件服务器的域名;
  • CNAME记录,指别名记录,实现域名间的映射;
  • NS记录,标记区域的域名服务器及授权子域;
  • PTR记录,反向解析,与A记录相反,将IP转换为主机名;
  • SOA记录,SOA标记,一个起始授权区的定义。

● rdclass 指定查询的网络类型 ,可选的值有IN、CH与HS,默认是 IN
● tcp 是否启用tcp查询模式
● source 和source_port 指定 查询用的源地址和端口
● raise_on_no_answer 查询无结果的时候,是否需要抛出异常
● lifetime 声明周期配置参数,采用默认值

常用方法介绍

  1. A记录
import dns.resolverdomain = "www.baidu.com"
# 获取解析对象
query_object = dns.resolver.resolve(qname=domain, rdtype='A')  # 指定查询记录为A
print('查询对象:{}'.format(query_object))
# 应答对象
response_object = query_object.response  # 指定查询记录为 A
print('应答对象:{}'.format(response_object))
print("-"*20)
# 解析对象
answer_object = response_object.answer  # 指定查询记录为A
print('解析对象:{}'.format(answer_object))
# print(len(answer_object))
print('解析对象1:{}'.format(answer_object[0]))
print('解析对象2:{}'.format(answer_object[1]))print("-"*20)
for i in answer_object:print(f"查询条目: {i}")for j in i.items:print(f"解析记录: {j}")

在这里插入图片描述

import dns.resolver
# 基本信息
domain = input("Please input domain: " )
dns_type = 'A'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))

在这里插入图片描述

  1. MX邮件记录
import dns.resolver
# 基本信息
domain = "163.com"
dns_type = 'MX'
# A记录解析效果
query_object = dns.resolver.resolve(domain, dns_type)  # 指定查询记录为MX
# 从应答的answer中获取查询记录
for query_item in query_object.response.answer:
# 获取解析的记录信息for item in query_item.items:print("邮件服务器权重:{},邮件服务器地址:{} ".format(domain,item))

在这里插入图片描述

import dns.resolver
# 基本信息
domain = "163.com"
dns_type = 'MX'
# 获取解析对象
# query_object1 = dns.resolver.query(domain,dns_type)      # query 后续可能不在支持
query_object = dns.resolver.resolve(domain, dns_type)   # 指定查询记录为A
print("MX记录的结果:{} ".format(query_object))
# 从应答的response中获取查询记录
resp_object = query_object.response
print("MX记录的结果:{}".format(resp_object))
# 查看answer对象
answer_object = resp_object.answer
print("解析对象:{}".format(answer_object))
# 查看解析条目对象
answer_object = resp_object.answer
for query_item in answer_object:print("查询条目:{}".format(query_item))
print('-' * 20)
# 查看解析后的记录条目--详情
# 1. preference 权重, exchange 替换服务器主机
query_item = resp_object.answer[0]
for item in query_item.items:print("邮件服务器权重:{},邮件服务器地址:{} ".format(item.preference,item.exchange))

在这里插入图片描述
在这里插入图片描述

  1. NS 记录结构
    NS(Name Server)域名服务器记录。用来表明由哪台服务器对该域名进行解析。在注册域名时,总有默认的DNS服务器,每个注册的域名都是由一个DNS域名服务器来进行解析的。但是需要注意的是只能输入一级域名,如:baidu.com;对于二级以及多级域名,如www.baidu.com、wenku.baidu.com则是错误的。
import dns.resolver
# 基本信息
domain = "jdy.com"
dns_type = 'NS'
# 获取解析对象
query_object = dns.resolver.resolve(domain, dns_type)   # 指定查询记录为NS
print("NS记录的结果:{} ".format(query_object))
print('-' * 20)
# 从应答的response中获取查询记录
resp_object = query_object.response
print("NS记录的结果:{}".format(resp_object))
print('-' * 20)
# 查看answer对象
answer_object = resp_object.answer
print("解析对象:{}".format(answer_object))
print('-' * 20)
# 查看解析条目对象
answer_object = resp_object.answer
for query_item in answer_object:print("查询条目:{}".format(query_item))
print('-' * 20)
# 查看解析后的记录条目 - 2
query_item = resp_object.answer[0]
for item in query_item:print("查询条目:{}".format(item))print("数据格式:{}".format(type(item)))
print('-' * 20)
query_item = resp_object.answer[0]
for item in query_item:print("查询条目:{}".format(item.to_text()))print("数据格式:{}".format(type(item.to_text())))

在这里插入图片描述

import dns.resolver
# 基本信息
domain = input("Please input domain: " )
dns_type = 'NS'
# NS记录解析效果
query_object = dns.resolver.resolve(domain, dns_type)  # 指定查询记录为A
# 从应答的answer中获取查询记录
for query_item in query_object.response.answer:
# 获取解析的记录信息for item in query_item.items:print("{}的NS记录解析结果有:{} ".format(domain,item))

在这里插入图片描述

  1. CNAME记录结构
import dns.resolver
# 基本信息
domain = "www.baidu.com"
dns_type = 'CNAME'
# 获取解析对象
query_object = dns.resolver.resolve(domain, dns_type)   # 指定查询记录为CNAME
print("CNAME记录的结果:{} ".format(query_object))
print('-' * 20)
# 从应答的response中获取查询记录
resp_object = query_object.response
print("CNAME记录的结果:{}".format(resp_object))
print('-' * 20)
# 查看answer对象
answer_object = resp_object.answer
print("解析对象:{}".format(answer_object))
print('-' * 20)
# 查看解析条目对象
answer_object = resp_object.answer
for query_item in answer_object:print("查询条目:{}".format(query_item))
print('-' * 20)
# 查看解析后的记录条目 - 2
query_item = resp_object.answer[0]
for item in query_item:print("查询条目:{}".format(item))

在这里插入图片描述

import dns.resolver
# 基本信息
domain = input("Please input domain: " )
dns_type = 'CNAME'
# NS记录解析效果
query_object = dns.resolver.resolve(domain, dns_type)  # 指定查询记录为A
# 从应答的answer中获取查询记录
for query_item in query_object.response.answer:
# 获取解析的记录信息for item in query_item.items:print("{}的CNAME记录解析结果有:{} ".format(domain,item))

在这里插入图片描述

实践:DNS域名轮询业务监控

大部分的 DNS 解析都是一个域名对应一个 IP 址,但是通过 DNS 轮循技术可以做到个域名对应多个IP,从而实现最简单且高效的负载平衡,
不过此方案最大的弊端是目标主机不可用时无法被自动剔除,因此做好业务主机的服务可用监控至关重要。
本示例通过分析当前域名的解析 IP,再结合服务端口探测来实现自动监控,在域名解析中添加、删除 IP 时无须对监控脚本进行更改。

  • 步骤
  • 实现域名的解析,获取域名所有的A记录解析IP列表;
  • 对IP列表进行HTTP级别的探测。
"""
代码思路:1. 获取有效IP列表获取记录类型将获取的值添加到列表中2. 对IP列表里面的值进行检测创建IP地址的连接尝试发起请求对请求的响应内容进行判断,并输出结果3. 测试主程序先获取IP列表,然后对IP进行测试
"""
import dns.resolver
import http.client
import re# 准备工作
iplist = []  #定义域名IP列表
appdomain = 'www.baidu.com' #定义业务域名# 判断解析的数据是不是IP
def is_ipv4(ip):# 使用正则表达式检查是否为IPv4地址pattern = r'^((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$'return re.match(pattern, ip) is not None
def get_iplist(domain=""):try:dns_type = 'A'ip_result = dns.resolver.resolve(domain, dns_type)except Exception as e:print("dns解析失败:{}".format(str(e)))return False# 将获取的值添加到列表中for rdata in ip_result:if is_ipv4(rdata.address):  #要判断是不是IP需要 加上addressiplist.append(rdata.address)print(type(data))   #<class 'dns.rdtypes.IN.A.A'>print(type(data.address))   #<class 'str'>return True
def checkip(ip):conn = http.client.HTTPConnection(ip, port=80, timeout=10)try:conn.request("GET", "/", headers={"Host": appdomain})response = conn.getresponse()if response.status == 200:first_bytes = response.read(6)if first_bytes.startswith(b"<html>") or first_bytes.startswith(b"<!DOCT"):print("{} 状态: Ok".format(ip))else:print("{} 状态: 可能不是HTML内容".format(ip))else:print("{} 状态码: {}".format(ip, response.status))except Exception as e:print("网络超时或者地址访问异常,请重试: {}".format(str(e)))finally:conn.close()
# 测试主程序
if __name__ == '__main__':if get_iplist(appdomain) and len(iplist) > 0:for ip in iplist:# print("{} 的正常解析IP有: {}".format(appdomain,ip))checkip(ip)else:print("dns 解析后的IP地址有误")
  1. A记录解析的IP地址必须能够被ping正常测试,否则失败
  2. 正常的126.com虽然可以正常,但是测试失败。
    因为格式不一致,测试失败。
    将二进制格式转为普通的utf-8格式
    str(b’sdfads’,“utf-8”)
    for rdata in ip_result:if is_ipv4(rdata.address):  #要判断是不是IP需要 加上addressiplist.append(rdata.address)print(type(data))   #<class 'dns.rdtypes.IN.A.A'>print(type(data.address))   #<class 'str'>

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/390606.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

django集成pytest进行自动化单元测试实战

文章目录 一、引入pytest相关的包二、配置pytest1、将django的配置区分测试环境、开发环境和生产环境2、配置pytest 三、编写测试用例1、业务测试2、接口测试 四、进行测试 在Django项目中集成Pytest进行单元测试可以提高测试的灵活性和效率&#xff0c;相比于Django自带的测试…

PyQt5入门

Python中经常使用的GUI控件集有PyQt、Tkinter、wxPython、Kivy、PyGUI和Libavg。其中PyQt是Qt(c语言实现的)为Python专门提供的扩展 PyQt是一套Python的GUI开发框架,即图形用户界面开发框架.。而在Python中则使用PyQt这一工具包&#xff08;PyQt5、PyQt5-tools、PyQt5-stubs&am…

卡码网--数组篇(二分法)

系列文章目录 文章目录 系列文章目录前言数组二分查找 前言 详情看&#xff1a;https://programmercarl.com/ 总结知识点用于复习 数组 概念: 数组是存放在连续内存空间上的相同类型数据的集合。 数组可以方便的通过下标索引的方式获取到下标对应的数据。 特点&#xff1a;…

安卓基本布局(下)

TableLayout 常用属性描述collapseColumns设置需要被隐藏的列的列号。shrinkColumns设置允许被伸缩的列的列号。stretchColumns设置允许被拉伸的列的列号。 <TableLayout xmlns:android"http://schemas.android.com/apk/res/android"android:id"id/TableL…

状体管理-装饰器

State 自己的状态 注意:不是状态变量的所有更改都会引起刷新。只有可以被框架观察到的修改才会引起UI刷新。 1、boolean、string、number类型时&#xff0c;可以观察到数值的变化。 2、class或者Object时&#xff0c;可以观察 自身的赋值 的变化&#xff0c;第一层属性赋值的变…

CC++:贪吃蛇小游戏教程

❀创作不易&#xff0c;关注作者不迷路❀&#x1f600;&#x1f600; 目录 &#x1f600;贪吃蛇简介 &#x1f603;贪吃蛇的实现 &#x1f40d;生成地图 &#x1f40d;生成蛇模块 ❀定义蛇的结构体 ❀初始化蛇的相关信息 ❀初始化食物的相关信息 &#x1f40d;光标定位和…

[Spring] SpringBoot统一功能处理与图书管理系统

&#x1f338;个人主页:https://blog.csdn.net/2301_80050796?spm1000.2115.3001.5343 &#x1f3f5;️热门专栏: &#x1f9ca; Java基本语法(97平均质量分)https://blog.csdn.net/2301_80050796/category_12615970.html?spm1001.2014.3001.5482 &#x1f355; Collection与…

USB 2.0 规范摘录

文章目录 1、USB 体系简介2、USB 数据流模型四种传输类型 3、USB 物理规范和电气规范4、USB 协议层规范事务传输&#xff08;Transaction&#xff09;的流程 5、USB 框架6、USB 主机&#xff1a;硬件和软件7、USB HUB 规范数据的转发唤醒信号的转发USB HUB 的帧同步HUB Repeate…

前端常见场景、JS计算精度丢失问题(Decimal.js 介绍)

目录 一. Decimal.js 介绍 二. 常用方法 1. 创建 Decimal 实例 2.加法 add 或 plus 3.减法 sub 或 minus 4.乘法 times 或 mul 5.除法 div 或 dividedBy 6.取模 7.幂运算 8.平方根 9.保留小数位 toFixed方法(四舍五入) 三.项目应用 前端精度丢失问题通常由以下原因…

【Kubernetes】kubeadmu快速部署k8s集群

目录 一.组件部署 二.环境初始化 三.所有节点部署docker&#xff0c;以及指定版本的kubeadm 四.所有节点安装kubeadm&#xff0c;kubelet和kubectl 五.高可用配置 六.部署K8S集群 1.master01 节点操作 2.master02、master03节点 3.master01 节点 4.master02、master…

C语言 ——— 学习、使用 strcmp函数 并模拟实现

目录 strcmp函数的功能 学习strcmp函数​编辑 使用strcmp函数 模拟实现strcmp函数 strcmp函数的功能 strcmp函数的功能是字符串比较&#xff0c;两个字符串的对应位置的字符进行比较&#xff0c;直到字符不同或达到终止的 \0 字符为止 举例说明&#xff1a; 字符串1&am…

leetcode-二叉树oj题1(共三道)--c语言

目录 a. 二叉树的概念以及实现参照博客&#xff1a; 一、三道题的oj链接 二、每题讲解 1.单值二叉树 a. 题目&#xff1a; b. 题目所给代码 c. 思路 d. 代码&#xff1a; 2. 相同的树 a. 题目 b. 题目所给代码 c. 思路 d. 代码 3. 二叉树的前序遍历 a. 题目 b.…

前端-05-VSCode自定义代码片段console.log(js/ts配置)、代码段快捷提示放在首位

目录 配置VSCode自定义代码片段console.log()log代码段快捷提示放在首位 配置VSCode自定义代码片段console.log() 点击VSCode左下角设置图标&#xff0c;点击用户代码片段 点击用户代码片段后&#xff0c;VSCode上方出现弹窗如下图&#xff08;没有显示这两个文件的话搜索一下…

Redis结合Lua脚本的简单使用

我们就拿购物车举例子 现在有5个东西免费送&#xff0c;我们只能选择1个 例如 可乐 美年达 香蕉 苹果 薯片 我们选择后就放进redis里面 然后我们不能选重复&#xff0c;只能选不同 Lua脚本 我们redis使用lua脚本的时候&#xff0c;会传两个参数进去 一个是List<Strin…

MySQL:数据库权限与角色

权限 MySQL 的权限管理系统是保障数据库安全性的关键组件之一。它允许数据库管理员精确控制哪些用户可以对哪些数据库对象执行哪些操作。 自主存取控制 DAC&#xff08;DiscretionaryAccess Control)&#xff1a;用户对于不同的数据库对象有不同的存取权限&#xff0c;不同的…

fatal: Could not read from remote repository. 解决方法

问题描述&#xff1a; Git : fatal: Could not read from remote repository. Please make sure you have the correct access rights and the repository exists。 解决方法&#xff1a; 当在网上尝试大量方法仍然失败的时候&#xff0c;不妨试试这个方法。 在 github 上&…

thinkphp框架远程代码执行

一、环境 vulfocus网上自行下载 启动命令&#xff1a; docker run -d --privileged -p 8081:80 -v /var/run/docker.sock:/var/run/docker.sock -e VUL_IP192.168.131.144 8e55f85571c8 一定添加--privileged不然只能拉取环境首页不显示 二、thinkphp远程代码执行 首页&a…

鸿蒙媒体开发【拼图】拍照和图片

拼图 介绍 该示例通过ohos.multimedia.image和ohos.file.photoAccessHelper接口实现获取图片&#xff0c;以及图片裁剪分割的功能。 效果预览 使用说明&#xff1a; 使用预置相机拍照后启动应用&#xff0c;应用首页会读取设备内的图片文件并展示获取到的第一个图片&#x…

2024关于日本AI 领域TOP12 的大学介绍

1.东京大学 &#xff08;The University of Tokyo&#xff09; 位于&#xff1a;日本东京都文京区本郷七丁目3 番1 号 网址&#xff1a;東京大学 东京大学也被称为UTokyo 或东大&#xff0c;是日本第一所国立大学。作为领先的研究型 大学&#xff0c;东京大学提供基本所有…

8月17日|广州|Cocos开发者沙龙不见不散!

6月底举行的Cocos成都沙龙吸引了近200位开发者和10多家发行&#xff0c;得到了大家的一致好评。 Cocos广州沙龙即将到来&#xff0c;会邀请更多KOL和头部发行、渠道嘉宾分享行业经验&#xff0c;让大家实现技术干货、游戏合作、行业信息多丰收。 活动主题&#xff1a;小游戏与出…