博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Python自动化运维——DNS处理模块
阅读量:4349 次
发布时间:2019-06-07

本文共 2381 字,大约阅读时间需要 7 分钟。

Infi-chu:

 

模块:dnspython

功能:

  1. 支持所有的记录类型
  2. 可以用于查询、传输并动态更新ZONE信息
  3. 支持TSIG(事务签名)验证消息和EDNS0(扩展DNS)

安装:

wget http://www.dnspython.org/kits/1.9.4/dnspython-1.9.4.tar.gztar -zxvf dnspython-1.9.4.tar.gzcd dnspython-1.9.4python setup.py install

模块域名解析方法:

dnspython提供一个DNS解析器类——resolver,使用query()方法来实现域名的查询功能

Query()方法使用:

#import dns.resolver#query(self,qname,rdtype=1,rdclass=1,tcp=False,source=None,raise_on_no_answer=True,source_port=0)

qname为查询的域名。

rdtype用来指定RR资源的类型,常用的有如下几种:

  1. A记录,将主机名转换成IP地址
  2. MX记录,邮件交换记录,用于定义邮件服务器的域名
  3. CNAME记录,别名记录,实现域名间的映射
  4. NS记录,标记区域的域名服务器及授权子域
  5. PTR记录,反向解析,与A记录相反,将IP转换成主机名
  6. SOA记录,SOA标记,一个起始授权区的定义

rdclass用于指定网络类型,可选的值有:

  1. IN,默认为IN
  2. CH,
  3. HS,

tcp用于指定查询是否启用TCP协议

source和source_port指定查询源地址与端口,默认查询设备IP和0

raise_on_no_answer用于指定当查询无应答时,是否触发异常,默认为True

 

 

A记录查询方法:

#import dns.resolver#dom=raw_input('输入域名地址:')#A=dns.resolver.query(dom,'A') # 指定查询类型为A的记录#for a in A.response.answer: # 通过response.answer方法获取查询回应信息# for b in a.items: # 遍历回应信息# print(b.address)

MX记录查询方法:

#import dns.resolver#dom=raw_input('输入域名地址:')#MX=dns.resolver.query(dom,'MX')#for a in MX:# print('MX 优先权:',a.preference,'mail 交换器:',a.exchange)

NS记录查询方法:

#import dns.resolver#dom=raw_input('输入一级域名地址:')#NS=dns.resolver.query(dom,'NS')#for a in NS.respinse.answer:# for b in a.items:# print(b.to_text())

CNAME记录查询方法:

#import dns.resolver#dom=raw_input('输入域名地址:')#cname=dns.resolver.query(dom,'CNAME')#for a in cname.response.answer:# for b in a.items:# print(b.to_text())

 

DNS域名轮询业务监控:

 

步骤:

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

实现:

#import dns.resolver#import os#import httplib#ip_list=[] # 定义域名的IP列表#dom=raw_input('输入域名:')#def get_ip_list(dom=''):# try:# A=dns.resolver.query(dom,'A') #解析A记录类型# except Exception,e:# print('DNS解析错误:',str(e))# return# for a in A.response.answer:# for b in a.items:# ip_list.append(b.address) # 添加到IP列表#def checkip(ip):# checkurl=ip+':80'# getcontent=''# httplib.socket.setdefaulttimeout(10) # 定义http连接超时时间,10s# conn=httplib.HTTPConnection(checkurl) # 创建http连接对象# try:# conn.request('GET','/',headers={'HOST':dom}) # 发起URL请求,添加host主机头# r=conn.getresponse()# getcontent=r.read(15) # 获取URL页面前的15个字符,以便做可用性校验# finally:# if getcontent=='': # 监控URL页的内容一般是事先定义好的# print(ip+'[OK]')# else:# print(ip+'[error]')#if __name__="__main__":# if get_ip_list(dom) and len(ip_list)>0: #域名解析正确,且IP列表有数据# for a in ip_list:# print(a)# else:# print('DNS 解析错误')

 

转载于:https://www.cnblogs.com/Infi-chu/p/8016304.html

你可能感兴趣的文章
【linux】记录一下遇到的各种问题
查看>>
python学习之day4,函数
查看>>
Java学习之异常处理
查看>>
使用Maven命令安装jar包到仓库中
查看>>
JavaScript 数据类型
查看>>
SQLite数据库
查看>>
day16_集合框架3(HashMap,TreeMap)
查看>>
db file parallel write等待事件
查看>>
甲骨文发布2012 1月数据库安全补丁Critical Patch Update January 2012
查看>>
小小递归程序
查看>>
VirtualBox中的虚拟机在Ubuntu 下无法启动之问题解决
查看>>
信息增益与决策树
查看>>
[译]Vulkan教程(29)组合的Image采样器
查看>>
combox的DispalyMember和ValueMember属性的测试
查看>>
Start Developing Mac Apps -- Human Interface Design 用户界面设计
查看>>
linux下安装Mongodb
查看>>
Page.RegisterStartupScript和Response.Write的区别。
查看>>
hdu4348区间更新的主席树+标记永久化
查看>>
bzoj3261: 最大异或和 可持久化trie
查看>>
ZOJ 2532 Internship
查看>>