突然接到一个告警,某个公网IP在持续扫你的服务端口;部门交接时给你一张服务器清单,全是IP地址,域名资产表却没了;做安全评估,拿到一批疑似恶意IP,想确认对方背后挂着什么网站。这些场景都指向同一个需求:通过IP反查域名。别指望一条whois或一个nslookup就能把所有答案交出来,真实环境里IP和域名是多对多的关系,藏着CDN、共享主机、证书、历史解析层层信息。这篇文章我不讲虚的,直接把我平时用的一套“IP反查域名”流程拆开:系统自带命令怎么做、证书日志怎么挖、威胁情报平台怎么用、手工验证怎么做,最后用一个排查实例串起所有步骤。运维、安全分析、资产管理的同学都能直接照着操练。
1. 为什么要从IP反查域名
1.1 被忽略的“反查”需求
大多数人每天都在做“域名查IP”:浏览器输入网址,DNS解析出IP,然后建立连接。这是正向操作。可现实中反过来问“这个IP背后是哪个域名”的频率一点不低,只是很多人不把它当独立流程来看。
拿我自己举例,最常见的是两类:
- 告警溯源:监控平台弹出一串来源IP,判断它是不是自家某个业务域名对应的弹性公网IP,决定要不要拉黑、封禁。
- 资产盘点:云主机清单里只有IP,要按合规要求整理出“IP对应域名”的台账,或者查清某个对外IP当前承载的服务。
还有攻防演练、威胁情报分析里,拿到一个可疑IP,需要快速判断它属于哪类业务、是否有域名、域名是否活跃。这类工作没有现成命令能一次搞定,核心思路是把DNS记录、证书日志、被动DNS数据、服务指纹这几类信息来源叠加起来,做交叉验证。
1.2 为什么要写这篇文章
网上搜“IP反查域名”,出来的结果要么是一句话命令,要么是某个在线工具的广告页。真遇到一个IP,尤其涉及CDN、云厂商共享IP时,按那些帖子操作基本查不出东西。我希望把完整的排查方法、可复现的命令、以及哪些结果不能轻信,一次性讲清楚,让读者少踩我踩过的坑。
2. 先搞懂IP与域名是怎么映射的
2.1 正向解析、反向解析与PTR的真相
DNS体系里,域名到IP的映射靠A记录(IPv4)和AAAA记录(IPv6),这叫正向解析。IP到域名的映射靠PTR记录,存放在in-addr.arpa这个反向域名空间里,叫反向解析,也是最直观的“IP查域名”手段。
Linux下查法:
dig -x 114.114.114.114Windows下可以用:
nslookup 114.114.114.114如果这个IP配置了PTR记录,输出会直接给出一个域名。但注意,PTR记录在实际网络中相当不可靠。大量服务器厂商或IDC根本不给普通公网IP配PTR,或者几百个IP统一指到一个完全看不出业务的名称,比如host-1-2-3-4.reverse.example.net。所以PTR查到有用结果,那是运气好;查不到才是常态。
2.2 一个IP可以同时绑多个域名
另一个需要认清的现实是:IP和域名不是一一对应。一台Web服务器用虚拟主机技术,通过HTTP Host头或TLS的SNI字段区分域名,完全可以在一台服务器上部署几十上百个站点。云负载均衡、CDN节点、API网关就更夸张,某个出口IP后面挂几千个域名都不稀奇。
所以IP反查域名,本质上不是在找唯一答案,而是在枚举“这个IP相关的一组域名”,再根据活跃度、证书、访问日志判断哪些是我们要的。
2.3 为什么“证书日志”能帮忙反查
现代网站基本都启用HTTPS,网站的服务器证书里会写明这个证书签发给哪些域名,也就是证书的Subject Alternative Name(SAN)字段。另外,为了公开审计和监督,CA机构会把每一张证书签发记录写入证书透明日志(CT日志),这些日志是公开可查询的。
这意味着:如果一个IP曾经为某域名签发过证书,那么证书里包含该IP、或者证书的SAN里包含域名,我们就可以通过CT日志反查整个域名列表。这个数据源非常关键,能挖出大量PTR记录里压根不存在的信息。这也是为什么第三节到第四节会重点讲授权、crt.sh这类工具。
3. 先用系统自带命令做基础排查
不管最终要不要用在线平台、商业情报库,我拿到IP后的第一次操作永远是系统命令,因为速度快、不依赖外部服务、且能快速建立对IP的初步认知。
3.1 PTR查询三件套:dig、nslookup、host
先明确一下命令的适用系统:
dig:Linux、macOS自带,信息详细,适合脚本化。nslookup:Windows、Linux都有,兼容性好。host:Linux、macOS自带,输出简洁。
基本用法:
# 使用默认DNS服务器查PTR dig -x 1.2.3.4 # 指定DNS服务器再查,避免本地DNS缓存或劫持干扰 dig -x 1.2.3.4 @223.5.5.5 # macOS/Linux host 1.2.3.4 # Windows nslookup 1.2.3.4指定DNS服务器这个习惯我很推荐。本地运营商DNS偶尔会有缓存异常,或者解析策略不一样,导致同一个PTR在不同DNS下结果不同。国内比较稳的公共DNS比如223.5.5.5、119.29.29.29;如果你在全球有业务或分析的IP在境外,也可以搭配8.8.8.8这类国际公共DNS做对照。
输出里看PTR字段。如果显示域名,先记下来,但别立刻相信;还要判断这条PTR是不是真的代表了“站点域名”,因为很多PTR记录指向的是ip-1-2-3-4.domain这类主机名,不是用户访问的正式域名。
3.2 用whois确认IP归属
PTR查不到不代表没戏。whois能告诉你这个IP属于哪家机构、哪个网段、在哪些范围,这些信息对后续判断非常有价值。
whois 1.2.3.4输出信息比较多,重点看这几个字段:
NetName / netname:网络段名称,经常直接体现运营商或组织名。Organization / org-name:管理机构名称,能看到是新网段还是老网段、是云厂商还是IDC。CIDR / inetnum:所属CIDR范围。Descr / country:常见描述和地域。
举个例子,如果whois显示这是某个云服务商的动态公网出口段,那这个IP极大可能是某台云主机的弹性IP;如果显示是某大带宽IDC的自建段,那背后挂的域名往往更集中,反查成功率更高。
注意:whois数据也有滞后和上报错误,别把组织名称当成100%的归属结论,只能用于辅助研判。
3.3 验证服务的端口连通性
反查域名时,如果已经通过其他渠道拿到候选域名,最好顺手验证IP上对应端口是否真的开着。这个动作能筛掉大量过期记录。
最简单的命令:
telnet 1.2.3.4 443如果连接后没有立即报错,只是卡在一个黑屏或者回显一些协议信息,说明端口通。但现代Windows系统默认没有telnet客户端,可以用PowerShell:
Test-NetConnection 1.2.3.4 -Port 443或者用nc:
nc -vz 1.2.3.4 443每次看到连不通也别急着把域名排除,因为有些站点只允许特定来源IP访问,或者WAF策略会拦截陌生来源。端口连通只能作为辅助判断。
3.4 顺手查历史解析记录
很多时候,当前A记录已经指向CDN,反查不到真实源站。这时候可以考虑查历史DNS解析记录。国内常用的是“域名查历史解析”类的在线站,通常输入域名能看到最近几次的解析记录快照,但它们是“域名→IP”方向。如果IP是已知的,我们可以关注该IP曾经对应过哪些域名,再把域名拿去查历史解析,找到从该IP迁走之前的域名记录。
这类历史记录数据源比较杂,时效性不一。我通常把它当“参考证据”,不作为最终结论,但它对CDN源站隐藏的场景有奇效。
4. 进阶:用证书日志和威胁情报平台反查
系统命令做的是“点对点”验证,真正把域名列表摊开来的,靠的是第三方数据源和主动探测。
4.1 crt.sh按IP搜证书
crt.sh是社区常用的证书透明日志搜索引擎。打开crt.sh主页,输入IP并选择“匹配IP地址”(或网页会根据输入自动判断),它会返回所有出现过该IP的证书、域名、颁发机构、时间。
命令行下更高效,直接请求JSON接口:
curl -s "https://crt.sh/?q=1.2.3.4&output=json" | jq .返回的JSON数组里,核心字段如下:
name_value:证书中的域名列表,可能是多个域名,用换行符分隔。issuer_name:签发该证书的CA机构。not_before/not_after:证书开始、结束时间。serial_number:证书序列号,用于追溯或对比。
实战中我经常只提取域名和证书时间,方便快速成表:
curl -s "https://crt.sh/?q=1.2.3.4&output=json" | jq -r '.[] | .name_value' | sort -u这一套命令可以把该IP上历史签发过证书的所有域名枚举出来,运气好一步到位。
但crt.sh有局限:只覆盖启用HTTPS且证书在CT日志里的站点;纯HTTP站点不会出现在结果里。另外crt.sh查询负载高时经常超时,遇到请求失败就多试几次。
4.2 证书字段的处理技巧
如果返回结果里域名很碎、很多,需要清洗。常见操作:
- 去掉
*.前缀,统一成根域名或主域名。 - 过滤掉看起来无关的CDN、证书供应商域名。
- 结合时间倒序,优先看
not_before最新的证书。
我之前排查过某云数据库的IP,crt.sh返回了几十个域名,但其中大半是同一个CA签给负载均衡的临时证书,属于基础服务,不是业务站点。不经过筛选,结果反而会误导。
4.3 威胁情报平台看关联域名
证书日志之外,另一个重要数据源是“被动DNS”。运营商网络里会采集真实解析流量,当某个域名被解析到某IP时,平台就把这条记录缓存下来。通过这类数据,输入IP即可查询“历史上哪些域名解析到了这个IP”。
国内可以试试:
- 微步在线(x.threatbook.com)
- 奇安信威胁情报中心(ti.qianxin.com)
这些平台输入IP后,一般会有“相关域名”或者“解析记录”模块。页面展示效果各有不同,但通常能看到域名列表、最近解析时间、解析次数。
免费账号能看见的数据量有限,但对多数场景足够。做完这一步,把平台输出和crt.sh输出合并做交集,重合的域名就是确认度最高的。
4.4 主动取证书:openssl与curl
如果在线平台都没有收录,或者你想确认某个IP当前是否在给某域名提供HTTPS服务,可以主动去拉取证书。
连443端口并提取证书主域名:
echo | openssl s_client -connect 1.2.3.4:443 -servername 1.2.3.4 2>/dev/null | openssl x509 -noout -subject -ext subjectAltName如果服务器愿意响应,会打印出证书的Subject和SAN。但很多服务器会把SNI作为区分条件,你连上去时带什么servername,它就给什么证书。所以更常见的做法是直接把候选域名作为Host头或SNI来试:
curl -I -k -H "Host: example.com" https://1.2.3.4/或者用OpenSSL指定候选域名:
echo | openssl s_client -connect 1.2.3.4:443 -servername example.com 2>/dev/null | openssl x509 -noout -subject如果返回200、301或到达目标服务的登录页,基本能断定这个IP正在为example.com服务。需要强调的是:主动探测类行为请先确认你有权对目标系统做检测,别在未授权IP上做批量爆破或扫描。
5. 完整案例:从一个陌生IP还原域名
下面用一个脱敏案例,把所有步骤串起来。某天半夜,监控报告有台公网日志服务器收到异常HTTP请求,来源IP是103.xx.xx.72(末尾两位脱敏)。我要确认这个IP是不是自家某个域名绑定的服务器。
5.1 第一步:排除内网与保留地址
先在本地确认不是内网或保留网段:
ip addr连接的是公网IP,不属于RFC 1918定义的内网地址。接着查PTR:
dig -x 103.xx.xx.72返回显示没有PTR记录。这个结果意料之内,很多云厂商不配PTR,尤其对弹性IP。
5.2 第二步:whois确认归属
执行:
whois 103.xx.xx.72输出里看到netname是某云厂商的动态公网IP段,Organization也是该云厂商。说明这是一个云资源IP,可能是虚拟主机、负载均衡或数据库节点。
5.3 第三步:crt.sh枚举证书域名
执行:
curl -s "https://crt.sh/?q=103.xx.xx.72&output=json" | jq -r '.[] | .name_value' | sort -u结果有条理地列出了大约7个域名。筛掉明显是CDN和证书服务商自签的域名后,剩两个域名结构很像业务站点:payintra.example.net和static-assets.example.net。not_before显示其中一张证书是最近3个月签发的,另一张已经过期半年。
5.4 第四步:威胁情报平台补充
把IP输入微步在线,相关域名模块显示出一共出现过的域名有6个,其中3个和crt.sh结果重合,包括那个过期业务域名。此外多出一个当前仍在活跃解析的域名,叫old-backup.example.net,平台显示最近一周有解析行为。
这一步把线索从“证书显示过”推进到了“最近仍活跃”。
5.5 第五步:手工验证并归档
针对三个高置信域名中的两个,做了HTTPS请求:
curl -I -k -H "Host: payintra.example.net" https://103.xx.xx.72/ curl -I -k -H "Host: old-backup.example.net" https://103.xx.xx.72/第一个返回302到登录页,第二个返回一个备份服务页面。整个流程跑完,结论很明确:103.xx.xx.72是公司内部的支付联调环境出口和备份服务的共享IP,异常请求是外部扫描器扫到的,不是业务被入侵。
把过程整理成证据表:
| 证据来源 | 域名 | 活跃状态 |
|---|---|---|
| crt.sh | payintra.example.net | 证书有效,服务可访问 |
| 微步在线 | old-backup.example.net | 最近一周解析活跃 |
| whois | 云厂商动态网段 | 归属明确,可复盘 |
6. 常见坑与实操心得
6.1 99%的IP反查查不到“真正想要的域名”
遇到CDN、高防、对象存储网关,A记录解析到的IP是边缘节点,根本不是源站。你拿这个IP去crt.sh、威胁情报平台查,可能查出一堆不相干的域名,因为它们共用同一个CDN节点。这种情况别在“IP反查域名”上死磕,正确做法是:
- 查域名历史解析记录,看看源站IP有没有暴露过。
- 关注证书日志里有没有源站IP。
- 翻访问日志、邮件头、APP调用记录里的真实IP。
6.2 一个IP挂几百个域名时怎么选
云负载均衡、多站点虚拟主机场景下,crt.sh可能返回上百条记录。不要试图穷尽,筛选标准我一般定三条:
- 证书时间离当前最近。
- 域名命名规范和公司主体相关。
- 端口探测或Host头验证能通。
最后一条是关键,十年前的老域名大概率已经不通了,留着只是干扰项。
6.3 警惕证书日志里的“过期干扰项”
证书透明日志会保留所有历史证书,包括吊销、过期、测试申请的证书。看到某个域名被列出来,一定要看它的not_after,如果已经过期超过一年,只能说明这个IP“曾经”和该域名有关,不代表现在。反查时把时间线当第一过滤条件。
6.4 授权边界要先想清楚
无论是端口探测、SNI扫描还是抓取证书,都必须在本人控制或已获书面授权的范围内进行。对于外网IP,我建议优先使用公开数据和平台查询,能不动手就不动手;确需主动验证,先确认资产归属,确认不了就停止。这个原则不是保守,是自保。
7. 工具速查与最后一点经验
把整个流程涉及的工具收一张表,方便直接抄作业:
| 场景 | 工具/平台 | 入口或命令 | 说明 |
|---|---|---|---|
| 反查PTR | dig / nslookup / host | dig -x IP | 查反向解析记录 |
| 归属查询 | whois | whois IP | 看网段、组织、地域 |
| 证书域名枚举 | crt.sh | curl -s "https://crt.sh/?q=IP&output=json" | 按IP搜证书域名 |
| 被动DNS关联 | 微步在线、奇安信威胁情报等 | 网页或API | 看历史解析关联 |
| 端口连通验证 | telnet / nc / PowerShell | nc -vz IP 443 | 确认服务是否在线 |
| HTTPS证书抓取 | openssl / curl | openssl s_client -connect IP:443 | 主动取证书字段 |
| 历史解析记录 | 各类“历史解析”查询站 | 输入域名 | 辅助排查CDN隐藏源站 |
最后分享一点个人习惯:每次反查结束后,把结果记录成固定的文本格式,比如IP, 查询时间, PTR, crt.sh域名, 威胁情报域名, 最终结论。我过去三年的排查笔记里存了几百条这种记录,后来做资产梳理和应急响应时经常回去翻。别小看这个习惯,很多业务域名是悄悄变的,IP上的服务也可能会在几个月内迁移,这些变化在单次查询里看不出来,但拉成时间线以后,就是一个非常可靠的资产变更信号。等你遇到过三个月前还能访问的域名突然变成恶意站点、或者历史解析里藏着一个早已弃用的测试域名时,就知道这份记录有多值钱了。