探测和替换DNS解析服务器地址

DNS不稳定

最近一段时间,国内的一些DNS解析服务器会时不时的请求超时,结果就是线上业务会出问题导致某些API地址不能解析。总是在出问题后再上线改服务器,虽然用saltsatck下发一下resolv.conf文件很方便,但是当我们意识到DNS解析出问题的时候,可能故障已经发生很久了-_-!。如是,搬砖需求又来了,写了个脚本实现自动检测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
32
33
34
35
36
37
38
39
40
41
#coding=utf-8 
#!/usr/bin/python
import os
import time

################ 测试DNS是否解析正常 #########################
def check():
TargetUrl = ('api.xxxxxx.com', 'api.xxxxxxxxx.com')
start = time.time()
for url in TargetUrl:
command = 'nslookup ' + url + '> /dev/null'
os.system(command)
end = time.time()
return end-start

################# 如果超过阀值就更改/etc/resolv.conf文件 #####
def failnum():
count = 0
for i in (1,2):
if(check() >= 1):
count = count + 1
return count

def chgfile(dns1, dns2, dns3):
filename = '/etc/resolv.conf'
fp = open(filename, "w")
dnslist = ['nameserver ' + dns1 + "\n", 'nameserver ' + dns2 + "\n", 'nameserver ' + dns3 + "\n"]
fp.writelines(dnslist)
fp.close()

def main():
DnsPool = ['202.96.209.133', '202.96.199.133', '202.96.209.5', '101.226.4.6']
while True:
if failnum() == 2:
chgfile(DnsPool[0], DnsPool[1], DnsPool[2])
DnsPool.append(DnsPool[0])
DnsPool.pop(0)
time.sleep(10)

if __name__ == "__main__":
main()

给脚本加上x权限,用nohup命令放到后台执行,每隔一段时间来检测一下域名是否正常,如果不正常的值超过了阀值,那么就更新/etc/resolv.conf文件。

脚本搬砖逻辑

脚本check()函数的元祖TargetUrl存放的是需要检测的域名,可增减。main()函数中列表是待替换的DNS解析服务器地址,循环使用,因为这些服务器不会一直出问题的。 脚本用了两个域名做测试,失败阀值是1s(因为当第一个DNS域名解析服务器解析正常时耗时远远小于1s,而当第一个DNS域名解析服务器不正常而第二个正常时,解析时间大概在3.7s左右),连续失败2次就更新DNS解析服务器地址列表。

----------------本文结束 感谢阅读----------------