DNS原理
定义
讲网站的域名和ip地址相互关联在一起 --DNS
端口号53
国家互联网工程中心 -亦庄,天地互连
域名
一个网站语句其实有自己专有的格式,这个完整的格式叫FQDN(完全限定域名)
-- 从逻辑上准确的表示出互联网上的主机在什么地方
格式:
主机名.网站名.二级域.*域.(/)
根域服务器获取
ipv4的根DNS全球服务器一共13台(中国没有)
ipv6的根服务器一共25台
A记录,将主机名转换成IP地址;
MX记录,邮件交换记录,定义邮件服务器的域名;
CNAME记录,指别名记录,实现域名间的映射;
NS记录,标记区域的域名服务器及授权子域;
RTP记录,反向解析,与A记录相反,将IP转换成主机名;
SOA记录,SOA标记,一个起始授权区的定义。
模块解析
提供了大量的DNS处理方法,最常用的方法是域名查询,dnspython提供了一个DNS解析类--resolver,使用他的query方法来实现域名的查询
query(qname, rdtype=dns.rdatatype.A, rdclass=dns.rdataclass.IN,
tcp=False, source=None, raise_on_no_answer=True,
source_port=0, lifetime=None):
qname 指定查询的名称
rdtype 指定查询的类型,默认是A记录
rdclass 指定查询的网络类型,默认是IN
TCP 是否启用tcp查询模式
source 和 source_port指定 查询用的源地址和端口
raise_on_no_answer 查询无结果的时候是否要抛出异常
lifetime 生命周期的配置参数,采用默认值
解析操作
A记录
#!/usr/bin/python3.6.7
import dns.resolver
# 接收数据
domain=input("请输入一个域名>>>:")
dns_type='A'
query_object=dns.resolver.resolve(domain,rdtype=dns_type)
for i in query_object:
print("解析记录为>>>:%s"%i)
[root@docker ~]# python3.6.7 yuming.py
请输入一个域名>>>:www.baidu.com
解析记录为>>>:112.80.248.75
解析记录为>>>:112.80.248.76
MX记录
#!/usr/bin/python3.6.7
import dns.resolver
# 接收数据
domain = input("请输入一个MX>>>:")
dns_type = 'MX'
query_object = dns.resolver.resolve(domain, rdtype=dns_type)
for i in query_object:
print("解析记录为>>>:%s" % i)
请输入一个MX>>>:qq.com
解析记录为>>>:30 mx1.qq.com.
解析记录为>>>:10 mx3.qq.com.
解析记录为>>>:20 mx2.qq.com.
NS记录
#!/usr/bin/python3.6.7
import dns.resolver
# 接收数据
domain = input("请输入一个NS>>>:")
dns_type = 'NS'
query_object = dns.resolver.resolve(domain, rdtype=dns_type)
for i in query_object:
print("解析记录为>>>:%s" % i)
[root@docker ~]# ./yuming.py
请输入一个NS>>>:baidu.com
解析记录为>>>:ns2.baidu.com.
解析记录为>>>:ns3.baidu.com.
解析记录为>>>:ns7.baidu.com.
解析记录为>>>:ns4.baidu.com.
解析记录为>>>:dns.baidu.com.
CNAME记录
#!/usr/bin/python3.6.7
import dns.resolver
# 接收数据
domain = input("请输入一个CNAME>>>:")
dns_type = 'CNAME'
query_object = dns.resolver.resolve(domain, rdtype=dns_type)
for i in query_object:
print("解析记录为>>>:%s" % i)
[root@docker ~]# ./yuming.py
请输入一个CNAME>>>:blog.abck8s.com
解析记录为>>>:ip.abck8s.com.
实践
案例分析
域名对应多ip的时候,服务可用性监控,一旦ip不可用,自动清除
思路
获取有效的ip列表
1-1获取记录类型
1-2将获取的值添加到列表中
对ip列表里面的值进行检测
2-1创建ip地址
的连接
2-2尝试发起请求
2-3对请求的响应内容进行判断,并输出结果
测试主程序
先获取ip列表,然后对ip进行测试
#!/usr/bin/python3.6.7
import dns.resolver
import os
import httplib2
# 定义一个ip空列表
iplist = []
domain = "www.baim0.xyz" # 定义业务域名
def get_iplist(domain):
# 接收数据
try:
query_object = dns.resolver.resolve(domain, "A")
except Exception as e:
print("dns解析失败:{}".format(str(e)))
else:
for i in query_object:
iplist.append(i)
return True
def checkip(ip):
conn = httplib2.HTTPConnectionWithTimeout(domain)
try:
conn.request("GET", "/")
result = conn.getresponse()
# print("响应的内容为:{}".format(result))
getcontent = result.read(15)
getcontent = str(getcontent, "utf-8")
except Exception as e:
print("网络超时或者异常,请重试!")
else:
if getcontent == "<!DOCTYPE html>":
print("{}状态:ok".format(ip))
else:
print("{}:error".format(ip))
if __name__ == '__main__':
if get_iplist(domain) and len(iplist) > 0:
for ip in iplist:
print("{}正常解析的ip有{}".format(domain, ip))
checkip(ip)
else:
print("解析错误!")