影刀RPA DNS解析监控:域名解析异常自动告警

影刀RPA DNS解析监控:域名解析异常自动告警 影刀RPA DNS解析监控域名解析异常自动告警作者林焱 | 分类影刀RPA新手教程 | 难度★★什么情况用公司有多个域名官网、API、CDN等DNS解析可能因为配置变更、DNS服务商故障、或被劫持而出问题。等用户反馈网站打不开了才知道DNS出问题影响面已经很广。用影刀RPA定时从多地区/多DNS服务器解析域名比对解析结果发现异常解析失败、IP变化、被劫持到非预期IP自动告警。怎么做第一步维护域名监控清单域名期望IP解析类型告警条件解析服务器www.example.com47.x.x.1A记录IP不匹配或解析失败114DNS, 阿里DNS, Google DNSapi.example.com47.x.x.2A记录IP不匹配同上cdn.example.com*.cloudfront.netCNAMECNAME指向变化同上第二步多DNS服务器解析# 影刀Python节点多源DNS解析importsocketimportdns.resolver# pip install dnspython# 使用系统DNSdefresolve_by_system(domain,record_typeA):使用系统默认DNS解析try:ifrecord_typeA:ipssocket.getaddrinfo(domain,None)returnlist(set(ip[4][0]foripinips))elifrecord_typeCNAME:importsubprocess resultsubprocess.run([nslookup,-typeCNAME,domain],capture_outputTrue,textTrue)# 解析nslookup输出linesresult.stdout.split(\n)forlineinlines:ifcanonical nameinline.lower()orAliasesinline:return[line.split()[-1].strip()]exceptExceptionase:returnNone# 使用指定DNS服务器defresolve_by_specific_dns(domain,dns_server,record_typeA):使用指定DNS服务器解析如114DNS114.114.114.114resolverdns.resolver.Resolver()resolver.nameservers[dns_server]resolver.timeout3resolver.lifetime5try:ifrecord_typeCNAME:answersresolver.resolve(domain,CNAME)return[str(answer.target).rstrip(.)foranswerinanswers]else:answersresolver.resolve(domain,A)return[str(answer)foranswerinanswers]exceptdns.resolver.NXDOMAIN:returnNXDOMAIN# 域名不存在exceptdns.resolver.NoAnswer:returnNOANSWER# 没有该类型记录exceptdns.resolver.Timeout:returnTIMEOUT# DNS服务器超时exceptExceptionase:returnstr(e)[:50]# 多源解析DNS_SERVERS{114DNS:114.114.114.114,阿里DNS:223.5.5.5,Google DNS:8.8.8.8,Cloudflare:1.1.1.1,}fordomain,configindomain_list:print(f\n{domain})fordns_name,dns_ipinDNS_SERVERS.items():resultresolve_by_specific_dns(domain,dns_ip,config[type])print(f{dns_name}:{result})第三步异常检测# 影刀Python节点异常检测defdetect_dns_anomalies(results,expected):比对解析结果检测异常anomalies[]expected_ipsset(expected.get(期望IP,).split(,))fordns_name,resultinresults:ifisinstance(result,str)andresultin[TIMEOUT,NXDOMAIN,NOANSWER]:anomalies.append({类型:解析失败,DNS:dns_name,结果:result,严重度:,})elifisinstance(result,list):resolved_ipsset(result)# 检查是否为预期IPifexpected_ipsandnotresolved_ips.intersection(expected_ips):anomalies.append({类型:IP不匹配,DNS:dns_name,预期:expected_ips,实际:resolved_ips,严重度:,})# 检查多DNS结果是否一致iflen(results)1:other_results[set(r)forname,rinresultsifname!dns_nameandisinstance(r,list)]ifother_resultsandresolved_ips!other_results[0]:anomalies.append({类型:DNS不一致,DNS:dns_name,本DNS:resolved_ips,其他DNS:other_results[0],严重度:,})returnanomalies# 模拟检测anomaliesdetect_dns_anomalies(dns_results,domain_config)forainanomalies:print(f{a[严重度]}{a[类型]}:{a})第四步DNS被劫持检测# 影刀Python节点劫持检测defcheck_dns_hijack(domain,expected_ips):检测是否存在DNS劫持# 方法1比对权威DNS和非权威DNS结果# 方法2HTTP访问比对SSL证书importrequeststry:# 直接访问域名检查返回证书的CN是否匹配resprequests.get(fhttps://{domain},timeout10,verifyTrue)# 如果能正常拿到预期页面大概率没被劫持![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/03aa4a1edaad44d0ab4f70f2d11d9036.png#pic_center)return{hijacked:False}exceptrequests.exceptions.SSLErrorase:# SSL证书错误可能是劫持信号return{hijacked:True,suspicious:True,reason:fSSL证书异常:{str(e)[:100]}}exceptExceptionase:return{hijacked:False,note:str(e)[:50]}hijack_checkcheck_dns_hijack(www.example.com,expected_ips)ifhijack_check.get(suspicious):print(f⚠️ DNS劫持嫌疑{hijack_check[reason]})第五步自动告警与切换发现DNS异常后的处理策略解析失败严重→ 立即【企微电话】告警运维 → 检查DNS服务商状态IP不匹配严重→ 确认是否为正常变更上线新服务器→ 非正常则告警DNS不一致警告→ 可能是DNS缓存问题等待TTL过期再确认劫持嫌疑严重→ 切换备用DNS或启用DNSSEC影刀检测到异常后自动执行对应通知策略。有什么坑坑1CDN域名IP频繁变化temu店群自动化报活动案例CDN域名的IP根据用户地理位置和CDN调度策略动态变化每次解析结果都可能不同。不要用IP变化作为CDN域名的告警条件应该检查是否能正常HTTP访问。坑2DNS缓存导致检测不准确操作系统和路由器都会缓存DNS你解析出来的可能是过期的缓存结果。用指定DNS服务器dns.resolver可以绕过本地缓存但运营商的DNS缓存无法绕过。坑3某些DNS服务器被墙从中国大陆访问8.8.8.8Google DNS或1.1.1.1Cloudflare可能不稳定或完全不通。部署在国内的RPA应该用114DNS或阿里DNS海外部署的用Google DNS。坑4dnspython安装问题dnspython库在Windows上可能需要额外安装Visual C运行时。如果用pip安装报错尝试安装预编译的wheel包。坑5域名解析变更是正常的业务操作服务迁移、CDN切换都会导致IP变化。告警的目的是通知运维有变更请确认而不是直接判定为出事了。每次变更在RPA系统中登记为预期变更可以减少误报。总结DNS监控的核心价值是尽早发现问题——DNS故障和劫持是最影响用户体验的问题之一。与其等用户投诉不如主动监控在影响的用户变成一大群之前发现并处理。