You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Python中如何通过指定DNS服务器完成IP到主机名的反向解析

指定DNS服务器实现IP反向解析(用dnspython)

完全理解你的需求——socket.gethostbyaddr()确实只能用系统默认的DNS服务器,没法自定义。而dnspython正是解决这类自定义DNS查询场景的利器,我平时也常用它来做反向解析、指定DNS查A记录这些操作,下面给你详细讲怎么实现:

步骤1:安装dnspython

首先得先装上这个库,用pip就行:

pip install dnspython

步骤2:编写反向解析代码

核心思路是:把IP地址转换成反向查询的域名(比如192.168.1.1对应1.1.168.192.in-addr.arpa),然后用指定的DNS服务器查询这个域名的PTR记录(反向解析的核心记录类型)。

dnspython提供了dns.reversename.from_address()方法,可以自动帮你生成正确的反向查询域名,不用自己手动拼接,非常省心。

这里有个完整的示例代码:

import dns.resolver
import dns.reversename

def reverse_dns_lookup(ip_address, dns_servers):
    try:
        # 生成反向查询的域名,自动兼容IPv4和IPv6
        reversed_name = dns.reversename.from_address(ip_address)
        
        # 创建DNS解析器实例,指定要使用的DNS服务器
        resolver = dns.resolver.Resolver()
        resolver.nameservers = dns_servers
        
        # 查询PTR类型记录
        answers = resolver.resolve(reversed_name, 'PTR')
        
        # 提取所有匹配的主机名(可能有多个PTR记录)
        hostnames = [str(answer) for answer in answers]
        return hostnames
    
    except dns.resolver.NXDOMAIN:
        return f"没有找到IP {ip_address}对应的PTR记录"
    except dns.resolver.NoNameservers:
        return f"指定的DNS服务器 {dns_servers} 不可达或无法响应"
    except ValueError:
        return f"输入的IP地址 {ip_address} 格式不正确"
    except Exception as e:
        return f"解析出错:{str(e)}"

# 示例使用
if __name__ == "__main__":
    target_ip = "8.8.8.8"
    custom_dns = ["1.1.1.1", "8.8.4.4"]  # 替换成你需要指定的DNS服务器
    result = reverse_dns_lookup(target_ip, custom_dns)
    print(f"反向解析结果:{result}")

关键代码解释

  • dns.reversename.from_address(ip_address):自动处理IPv4和IPv6的反向域名生成,比如IPv6地址2001:db8::1会被转换成标准的反向查询格式,完全不用自己处理复杂的字符串拼接。
  • resolver.nameservers = dns_servers:这就是指定DNS服务器的核心操作,你可以传单个IP字符串,也可以传多个IP组成的列表(解析器会依次尝试列表中的服务器)。
  • resolver.resolve(reversed_name, 'PTR'):明确指定查询PTR类型的记录,这是反向解析的核心逻辑。

异常处理说明

代码里覆盖了几种常见的异常场景:

  • NXDOMAIN:表示目标IP没有对应的PTR记录,反向解析失败。
  • NoNameservers:指定的DNS服务器无法连接或不响应请求。
  • ValueError:输入的IP地址格式不符合规范。
  • 通用异常:兜底处理其他未预见的错误,比如网络超时等。

这样你就可以完全脱离系统默认DNS,用自己指定的服务器来完成IP反向解析了!

内容的提问来源于stack exchange,提问作者Ankit Vallecha

火山引擎 最新活动