Python如何使用指定DNS服务器通过IP地址查询对应主机名
可行解决方案
方案1:Python dnspython 实现(支持自定义DNS、自定义业务逻辑)
socket.gethostbyaddr 方法默认读取系统DNS配置,无法手动指定查询服务器;之前使用dns.resolver未生效大概率是未主动覆盖默认nameserver配置,以下是可直接运行的实现:
- 先安装依赖库
pip install dnspython
- 核心实现代码
import dns.resolver from dns import reversename from concurrent.futures import ThreadPoolExecutor, as_completed # 自定义配置项 CUSTOM_DNS = ["192.168.xxx.xxx"] # 替换为你指定的DNS服务器IP QUERY_TIMEOUT = 3 QUERY_RETRY = 2 MAX_WORKERS = 30 # 并发数,根据指定DNS的承载能力调整 def query_ptr(ip): try: # 构造反向查询地址 rev_name = reversename.from_address(ip) # 初始化resolver并指定自定义DNS resolver = dns.resolver.Resolver() resolver.nameservers = CUSTOM_DNS resolver.timeout = QUERY_TIMEOUT resolver.lifetime = QUERY_TIMEOUT * QUERY_RETRY # 查询PTR记录 answers = resolver.resolve(rev_name, "PTR") return ip, str(answers[0]).rstrip('.') except Exception as e: return ip, None if __name__ == "__main__": # 从文件读取所有待查询IP,每行一个IP with open("ip_list.txt", "r", encoding="utf-8") as f: ip_list = [line.strip() for line in f if line.strip()] result = [] with ThreadPoolExecutor(max_workers=MAX_WORKERS) as executor: futures = [executor.submit(query_ptr, ip) for ip in ip_list] for future in as_completed(futures): ip, hostname = future.result() result.append(f"{ip},{hostname if hostname else '未查询到主机名'}") # 结果写入文件 with open("ip_hostname_result.csv", "w", encoding="utf-8") as f: f.write("IP,主机名\n") f.write("\n".join(result))
方案2:命令行批量查询(无需写代码,快速生成结果)
如果不需要复杂逻辑处理,可以直接用dig命令指定DNS服务器批量查询:
- 把所有待查询IP按每行一个存入
ip_list.txt - 执行以下命令,替换
192.168.xxx.xxx为你的自定义DNS服务器IP
cat ip_list.txt | xargs -P 30 -I {} dig @192.168.xxx.xxx -x {} +short +tries=2 +time=3 | paste -d, <(cat ip_list.txt) - > ip_hostname_result.csv
参数说明:
-P 30控制并发查询数为30,可根据实际情况调整+tries=2重试次数为2+time=3单次查询超时时间为3秒
注意事项
- 正式批量查询前先拿10-20个已知有PTR记录的IP做测试,确认指定的DNS服务器允许你发起反向查询,无IP白名单或频率限制
- 并发数不要设置过高,避免你指定的DNS服务器负载过高影响其他业务
- 查询完成后可过滤结果中无主机名的条目,单独发起二次重试
内容的提问来源于stack exchange,提问作者Rem4000
相关产品推荐
相关产品推荐

