网站设计找谁做,标识设计网站,网站开发如何建设公共页面,云南网站制作一条龙全包1.dnspython介绍 dnspython是Pyhton实现的一个DNS工具包#xff0c;他几乎支持所有的记录类型#xff0c;可以用于查询、传输并动态更新ZONE信息#xff0c;同事支持TSIG#xff08;事物签名#xff09;验证消息和EDNS0#xff08;扩展DNS#xff09;。在系统管理方面他几乎支持所有的记录类型可以用于查询、传输并动态更新ZONE信息同事支持TSIG事物签名验证消息和EDNS0扩展DNS。在系统管理方面我们可以利用其查询功能来实现DNS服务监控以及解析结果的效验可以代替nslookup及dig等工具轻松做到与现有平台的整合。
2.模块域名解析方法详解 dnspython模块提供了大量的DNS处理方法最长用的方法是域名查询。dnspython提供了一个DNS解析器类——resolver使用他的query方法来实现域名查询功能。query方法定义如下
queryself, qname, rdtype1, rdclass1, tcpFalse, sourceNone, raise_on_no_answerTrue, source_port0
其中qname参数为查询的域名。rdtype参数用来指定RR资源的类型常用的有以下几种
A记录将主机名转换成IP地址
MX记录邮件交换记录定义邮件服务器的域名
CNAME记录指别名记录实现域名间的映射
NS记录标记区域的域名服务器及授权子域
PTR记录反向解析与A记录相反将IP转换成主机名
SOA记录SOA标记一个起始授权区的定义 rdclass参数用于指定网络类型可选的值有IN、CH与HS其中IN为默认使用最广泛。
tcp参数用于指定查询是否启用TCP协议默认为False不启用。source与source_port参数作为指定查询原地址与端口默认值为查询设备IP地址和0.raise_on_no_answer参数用于指定当查询无应答时是否触发异常默认为True
3.常见解析类型示例说明 常见的DNS解析类型包括A、MX、NS、CNAME等。利用dnspython的dns.resolver.query方法可以简单实现这些DNS类型的查询为后面要实现的功能提供数据来源比如对一个使用DNS轮循业务的域名进行可用性监控需要得到当前的解析结果。下面一一进行介绍
1A记录
实现A记录查询方法源码 2MX记录
实现MX记录查询方法源码
#!/bin/bash/env python
import dns.resolver
domain input(Please input an domain:) # 输入IP地址
MX dns.resolver.query(domain,MX) # 指定查询类型为MX记录
for i in MX: # 遍历回应结果输出MX记录的preference及exchanger信息print (MX preference , i.preference, mail exchanger , i.exchange)运行代码查看结果这里以163.com域名为例 注意这里如果查询的域名没有MX则会报错 3 NS记录 实现NS记录查询方法源码 只限制输入一级域名‘licloud.xyz’如果输入二级域名www.licloud.com则会报错 4CNAME记录
实现CNAME记录查询方法源码 4.实践DNS轮循业务监控
大部分的DNS解析都是一个域名对应一个IP地址但是通过DNS轮循技术可以做到一个域名对应多个IP从而实现最简单且高效的负载军很不过此方案最大的弊端是目标主机不可用时无法被自动踢出因此做好业务主机的服务可用监控至关重要。 1实现域名的解析获取域名所有的A记录解析IP列表
2对IP列表进程HTTP级别的探测
代码解析
通过dns.resolver.query()方式获取业务领域A记录信息查询出所有IP地址列表再使用httplib模块的request()方法以GET方式请求监控页面监控业务所有服务的IP是否正常
import dns.resolver
import os
import httplib2iplist [] # 定义域名IP列表变量
appdomain www.licloud.xyz # 定义业务域名def get_iplist(domain): # 域名解析函数,解析成功ip将被追加到iplisttry: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:iplist.append(j.address) # 追加到iplistreturn Truedef checkip(ip):checkurl ip:80getcontenthttplib2.socket.setdefaulttimeout(5)conn httplib2.HTTPConnection(checkurl) # 创建http连接对象try:conn.request(GET,/,headers {Host: appdomain}) # 发起URL请求添加HOST主机头r conn.getresponse()getcontent r.read(15) # 获取URL页面前15个字符以便做可用性校验finally:if getcontent!doctype html: # 监控URL页的内容一般是事先定义好的比如HTTP200等print(ip)else:print(ipError) # 此处可放告警程序可以是邮件、短信通知if __name____main__:if get_iplist(appdomain) and len(iplist) 0:for ip in iplist:checkip(ip)else:print(dns resolver error.)