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]