dnspython是Python的DNS工具包。它支持几乎所有记录类型。它可用于查询,区域传输和动态更新,它支持TSIG(事务签名)认证消息和EDNS0(扩展DNS)。dnspython起源于Nominum,它的开发是为了方便DNS软件的测试。dnspython的稳定版本为1.16.0,于2018年12月8日发布。未来dnspython版本的编号将从2.0开始,dnspython的未来版本将只支持Python 3。
1. python DNS安装
1 2 3 4 5 6 7 8 9 10 11 12 λ pip install dnspython λ pip show dnspython Name: dnspython Version: 1.16.0 Summary: DNS toolkit Home-page: http://www.dnspython.org Author: Bob Halley Author-email: halley@dnspython.org License: BSD-like Location: c:\python\lib\site-packages Requires: Required-by:
2. python DNS用法
1 2 3 4 5 6 7 8 9 def query( qname: Any, #域名 rdtype: int = dns.rdatatype.A, #记录类型 rdclass: int = dns.rdataclass.IN, #网络类型 tcp: bool = False, #是否启用TCP协议 source: Any = None, #DNS服务器的源IP raise_on_no_answer: bool = True, #无应答是是否触发隐藏 source_port: int = 0, #DNS服务器的源端口 lifetime: Any = None) #超时时间
3. python DNS使用
3.1. A记录
1 2 3 4 5 6 7 8 9 10 11 12 13 import dns.resolver domain = "baidu.com" A = dns.resolver.query(domain) for i in A.response.answer: for j in i.items: print(j.address) ## 执行结果 C:\Python\python.exe C:/Code/Python/DNS/1.py 220.181.57.216 123.125.115.110
3.2. MX记录
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 import dns.resolver domain = "qq.com" MX = dns.resolver.query(domain, "MX") print("优先级 | 服务器地址") for i in MX: print(i.preference, end="") print(" | ", end="" ) print(i.exchange) ## 执行结果 C:\Python\python.exe C:/Code/Python/DNS/1.py 优先级 | 服务器地址 20 | mx2.qq.com. 10 | mx3.qq.com. 30 | mx1.qq.com.
3.3. NS记录
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 import dns.resolver domain ="baidu.com" NS = dns.resolver.query(domain, "NS") for i in NS.response.answer: for j in i.items: print(j.to_text()) ## 执行结果 C:\Python\python.exe C:/Code/Python/DNS/1.py ns3.baidu.com. ns2.baidu.com. dns.baidu.com. ns7.baidu.com. ns4.baidu.com.
3.4. CNAME记录
1 2 3 4 5 6 7 8 9 10 11 import dns.resolver domain="www1.baidu.com" CNAME = dns.resolver.query(domain, "CNAME") for i in CNAME.response.answer: for j in i.items: print(j.to_text()) ## 执行结果 C:\Python\python.exe C:/Code/Python/DNS/1.py www.baidu.com.
4. DNS轮询
大多域名注册商都支持多条A记录的解析,其实这就是DNS轮询,DNS服务器将解析请求按照A记录的顺序,逐一分配到不同的IP上,这样就完成了简单的负载均衡。
DNS轮询系统的优点:
无成本,因为往往域名注册商的这种解析都是免费的; 部署方便,新增的Web服务器只要增加一个公网IP即可。
DNS轮询系统的缺点:
如果某台服务器宕机,DNS服务器是无法知晓的,仍旧会将访问分配到此服务器。 如果几台Web服务器之间的配置不同,能够承受的压力也就不同,但是DNS解析分配的访问却是均匀分配的。 如果是需要身份验证的网站,DNS解析无法将验证用户的访问持久分配到同一服务器。
百度轮询系统代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 #代码没有容错 import dns.resolver import requests #下边两行是SSL证书错误的时候不报错 from requests.packages.urllib3.exceptions import InsecureRequestWarning requests.packages.urllib3.disable_warnings(InsecureRequestWarning) domain = "www.baidu.com" list = [] url =[] A = dns.resolver.query(domain, "A") for i in A.response.answer: for j in i.items: if 57 >= ord(str(j)[-1]) >= 48: ip = str(j) + ":443" else: ip = str(j) r = requests.get("https://" + ip, verify=False) if r.status_code == 200: print(ip + "[ok]") else: print(ip + "[error]") ## 执行 C:\Python\python.exe C:/Code/Python/DNS/2.py www.a.shifen.com.[ok] 183.232.231.173:443[ok] 183.232.231.172:443[ok]