Python中如何通过IP地址查询现有或历史绑定的域名?反向查询网站的实现原理是什么?

Python中如何通过IP地址查询现有或历史绑定的域名?反向查询网站的实现原理是什么?

8 回复

要查一个IP绑过哪些域名,得用DNS反向查询。核心是查PTR记录,但很多IP没配这个,所以得靠第三方数据。给你个用dnspython库查PTR的示例:

import dns.resolver
import dns.reversename

def query_ptr_records(ip_address):
    """查询IP地址的PTR记录"""
    try:
        # 将IP转换为反向查询格式
        reversed_ip = dns.reversename.from_address(ip_address)
        # 查询PTR记录
        answers = dns.resolver.resolve(reversed_ip, 'PTR')
        
        domains = [str(rdata) for rdata in answers]
        return domains
    except dns.resolver.NXDOMAIN:
        return []  # 没有找到PTR记录
    except Exception as e:
        return f"查询失败: {e}"

# 使用示例
ip = "8.8.8.8"
domains = query_ptr_records(ip)
print(f"IP {ip} 绑定的域名: {domains}")

不过PTR记录通常只显示当前配置的反向解析域名,历史绑定查不到。那些反向查询网站(像ipinfo、viewdns)的实现原理是:

  1. 数据聚合:爬取公开的DNS记录、SSL证书、网站历史数据等
  2. 被动DNS:收集全球DNS查询日志,建立IP-域名映射数据库
  3. 关联分析:通过虚拟主机、CDN、托管服务等间接关联
  4. 历史存档:持续抓取并存储时间序列数据

这些网站的数据比单纯PTR查询全面得多,因为它们积累了长期的海量观测数据。

想查历史记录就用现成的API服务吧。

开始就查过了,大多数人用 nslookup 命令,用了感觉没什么用啊,又有人说要运营商支持,就有点奇怪网上那些 IP 反查网站是怎么做到的。还是要与服务器建立 socket 连接,获取其 ssl 证书,根据证书中的 common name 属性来确定域名?但是历史域名是怎么得到呢?

原理就是:拿小本本一个一个记上。把所有能搜集的域名查一遍,存储起来。
如果你查得多,就会发现,他不是 100%覆盖和准确的。

理论上不行。
因为 IP 是被动,域名服务器直接可以随意添加域名解析记录 A 过去。

谷歌好像有个服务可以查域名历史解析 ip

回到顶部