You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python如何使用指定DNS服务器通过IP地址查询对应主机名

可行解决方案

方案1:Python dnspython 实现(支持自定义DNS、自定义业务逻辑)

socket.gethostbyaddr 方法默认读取系统DNS配置,无法手动指定查询服务器;之前使用dns.resolver未生效大概率是未主动覆盖默认nameserver配置,以下是可直接运行的实现:

  1. 先安装依赖库
pip install dnspython
  1. 核心实现代码
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服务器批量查询:

  1. 把所有待查询IP按每行一个存入ip_list.txt
  2. 执行以下命令,替换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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 11:15:04