如何通过公共DNS服务器获取所有.ac.in结尾的网站并写入文件(代码问题排查)
如何通过公共DNS服务器获取所有.ac.in结尾的网站并写入文件(代码问题排查)
嗨,我来帮你排查下代码失效的问题~ 你当前的代码逻辑存在一个核心误区:直接查询ac.in的A记录,只能拿到ac.in这个域名本身的IP地址,根本没办法获取所有以.ac.in结尾的子域名。DNS系统本身并没有提供“遍历所有子域名”的原生查询方式,这就是你的代码没效果的关键原因。
那怎么才能获取这类子域名呢?常见的可行思路有两种:
- 尝试域传送(AXFR查询):这是DNS服务器用来同步域名记录的机制,部分域名的权威DNS服务器可能允许公开的AXFR请求(但像
.ac.in这类顶级二级域,几乎不会开放公共查询权限)。 - 借助第三方数据集/工具:比如安全厂商、域名统计平台的公开数据集,或者合法的子域名枚举工具(结合DNS查询、搜索引擎数据等多维度信息)。
下面给你修改后的代码,尝试通过DNS域传送的方式尝试获取数据(提前说明:很大概率会失败,因为这类公共域名不会开放AXFR权限):
import dns.resolver import dns.query import dns.zone def get_ac_in_websites(): dns_server = '8.8.8.8' # 先通过Google DNS获取ac.in的权威DNS服务器地址 query_domain = 'ac.in' try: # 第一步:获取ac.in的权威DNS服务器列表 resolver = dns.resolver.Resolver() resolver.nameservers = [dns_server] ns_response = resolver.resolve(query_domain, rdtype='NS') auth_dns_servers = [ns.to_text().strip('.') for ns in ns_response] websites = [] # 尝试对每个权威DNS服务器发起AXFR域传送请求 for ns in auth_dns_servers: try: zone = dns.zone.from_xfr(dns.query.xfr(ns, query_domain)) # 遍历域内所有记录,提取完整域名 for name, node in zone.nodes.items(): full_domain = f"{name}.{query_domain}".strip('.') if full_domain.endswith('.ac.in'): websites.append(full_domain) except Exception as e: print(f"无法从权威服务器 {ns} 获取数据: {e}") # 去重后返回结果 return list(set(websites)) except dns.exception.DNSException as e: print(f"DNS查询失败: {e}") return [] def write_to_file(filename, data): with open(filename, 'w', encoding='utf-8') as file: # 只写入前1000条数据 for entry in data[:1000]: file.write(entry + '\n') # 获取.ac.in结尾的网站列表 websites = get_ac_in_websites() # 写入文件 write_to_file('dotacin.txt', websites)
重要提示:
- 上面的代码大概率拿不到有效数据,因为
.ac.in的权威DNS服务器出于安全考虑,会拒绝公共的AXFR请求。 - 如果确实需要大量
.ac.in子域名数据,建议查找公开的域名归档数据集,或者使用amass、sublist3r这类合法的子域名枚举工具(它们会结合多种数据源来枚举子域名)。
备注:内容来源于stack exchange,提问作者Curi0usM3
相关产品推荐
相关产品推荐

