子域名基础05_Web与网络层

子域名挖掘前置基础 05:Web 与网络层

本篇定位:前面四篇讲的都是 DNS 层------域名怎么解析、记录是什么、委派怎么运作。但子域名解析到 IP 之后,背后跑的是 Web 和网络服务。本篇讲子域名背后的 Web 与网络层------CDN、负载均衡、网络架构图、HTTP/HTTPS 与 TLS 基础。这些知识决定了你拿到的 IP 是不是目标真实服务器。

阅读建议:本篇只讲基础概念和原理。CDN 绕过技巧、TLS 证书挖掘价值这些"实战方法"留到后续子域名搜集方法章节。


一、CDN 介绍与 CDN 调度

子域名挖掘里有一个高频问题------为什么你 nslookup 拿到的 IP,往往不是目标的真实服务器?答案就是 CDN。

1.1 什么是 CDN

CDN(Content Delivery Network,内容分发网络)是通过全球分布的边缘节点缓存和加速内容交付的架构。

要理解 CDN,先理解没有 CDN 时的痛点:用户访问 www.example.com,DNS 解析到源站 IP(比如在美国的一台服务器),全球用户都打到这台服务器------离得远的用户延迟高、服务器压力大、网络一旦中断所有人都访问不了。

CDN 的解法是在源站和用户之间加一层"缓存节点":

角色 位置 作用
源站 目标企业自己的服务器 真正的内容来源,CDN 的"上游"
边缘节点 CDN 服务商全球分布的节点 缓存源站内容,用户就近访问
用户 任意地理位置 访问时被调度到最近的边缘节点

工作流程是:用户请求 → 被调度到最近的边缘节点 → 边缘节点缓存命中就直接返回、未命中就回源站取一份缓存起来再返回。这样源站 IP 被隐藏在 CDN 后面,用户看到的是边缘节点的 IP。

关键认知:CDN 的本质是"中间缓存层"。源站 IP 被隐藏------这就是为什么子域名挖掘里,拿到一个走 CDN 的子域名 IP,不能直接当成目标真实 IP 去扫端口。

1.2 CDN 的调度核心:智能 DNS

CDN 怎么知道用户在哪儿、该返回哪个节点 IP?靠的是智能 DNS。

普通 DNS 查询返回的是固定 IP,不管你从哪查都一样。但 CDN 的 DNS 不一样------它返回哪个 IP,取决于查询者的来源 IP。这就是"智能"二字的含义:DNS 应答会根据查询者地理位置变化。
#mermaid-svg-3LA7avpmvvmmGPhf{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-3LA7avpmvvmmGPhf .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-3LA7avpmvvmmGPhf .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-3LA7avpmvvmmGPhf .error-icon{fill:#552222;}#mermaid-svg-3LA7avpmvvmmGPhf .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-3LA7avpmvvmmGPhf .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-3LA7avpmvvmmGPhf .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-3LA7avpmvvmmGPhf .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-3LA7avpmvvmmGPhf .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-3LA7avpmvvmmGPhf .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-3LA7avpmvvmmGPhf .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-3LA7avpmvvmmGPhf .marker{fill:#333333;stroke:#333333;}#mermaid-svg-3LA7avpmvvmmGPhf .marker.cross{stroke:#333333;}#mermaid-svg-3LA7avpmvvmmGPhf svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-3LA7avpmvvmmGPhf p{margin:0;}#mermaid-svg-3LA7avpmvvmmGPhf .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-3LA7avpmvvmmGPhf .cluster-label text{fill:#333;}#mermaid-svg-3LA7avpmvvmmGPhf .cluster-label span{color:#333;}#mermaid-svg-3LA7avpmvvmmGPhf .cluster-label span p{background-color:transparent;}#mermaid-svg-3LA7avpmvvmmGPhf .label text,#mermaid-svg-3LA7avpmvvmmGPhf span{fill:#333;color:#333;}#mermaid-svg-3LA7avpmvvmmGPhf .node rect,#mermaid-svg-3LA7avpmvvmmGPhf .node circle,#mermaid-svg-3LA7avpmvvmmGPhf .node ellipse,#mermaid-svg-3LA7avpmvvmmGPhf .node polygon,#mermaid-svg-3LA7avpmvvmmGPhf .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-3LA7avpmvvmmGPhf .rough-node .label text,#mermaid-svg-3LA7avpmvvmmGPhf .node .label text,#mermaid-svg-3LA7avpmvvmmGPhf .image-shape .label,#mermaid-svg-3LA7avpmvvmmGPhf .icon-shape .label{text-anchor:middle;}#mermaid-svg-3LA7avpmvvmmGPhf .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-3LA7avpmvvmmGPhf .rough-node .label,#mermaid-svg-3LA7avpmvvmmGPhf .node .label,#mermaid-svg-3LA7avpmvvmmGPhf .image-shape .label,#mermaid-svg-3LA7avpmvvmmGPhf .icon-shape .label{text-align:center;}#mermaid-svg-3LA7avpmvvmmGPhf .node.clickable{cursor:pointer;}#mermaid-svg-3LA7avpmvvmmGPhf .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-3LA7avpmvvmmGPhf .arrowheadPath{fill:#333333;}#mermaid-svg-3LA7avpmvvmmGPhf .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-3LA7avpmvvmmGPhf .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-3LA7avpmvvmmGPhf .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-3LA7avpmvvmmGPhf .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-3LA7avpmvvmmGPhf .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-3LA7avpmvvmmGPhf .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-3LA7avpmvvmmGPhf .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-3LA7avpmvvmmGPhf .cluster text{fill:#333;}#mermaid-svg-3LA7avpmvvmmGPhf .cluster span{color:#333;}#mermaid-svg-3LA7avpmvvmmGPhf div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-3LA7avpmvvmmGPhf .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-3LA7avpmvvmmGPhf rect.text{fill:none;stroke-width:0;}#mermaid-svg-3LA7avpmvvmmGPhf .icon-shape,#mermaid-svg-3LA7avpmvvmmGPhf .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-3LA7avpmvvmmGPhf .icon-shape p,#mermaid-svg-3LA7avpmvvmmGPhf .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-3LA7avpmvvmmGPhf .icon-shape .label rect,#mermaid-svg-3LA7avpmvvmmGPhf .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-3LA7avpmvvmmGPhf .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-3LA7avpmvvmmGPhf .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-3LA7avpmvvmmGPhf :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} DNS 解析

api.example.com
返回 1.2.3.4

(北京边缘节点)
HTTPS 请求

SNI: api.example.com
缓存命中
缓存未命中

回源请求
返回内容
缓存 + 返回
DNS 解析
返回 5.6.7.8

(纽约边缘节点)
HTTPS 请求
用户(北京)
CDN 的智能 DNS

(根据用户 IP 的地理位置

返回最近的边缘节点 IP)
北京边缘节点

IP: 1.2.3.4

(缓存层)
源站/回源地址

Host: api.example.com

(可能是 LB 或真实服务器)
用户(纽约)
纽约边缘节点

IP: 5.6.7.8

从挖掘者视角解读:

角色 作用 挖掘意义
智能 DNS(红) 根据用户地理位置返回最近的边缘节点 IP 你拿到的 IP 取决于你从哪查------北京查和纽约查不同
边缘节点(橙) 缓存层,用户看到的 IP 直接扫端口没意义,你扫的是 CDN 节点不是目标
源站(绿) 真实后端服务器 找到源站 IP 是绕过 CDN 的核心目标

1.3 CDN 调度对子域名挖掘的影响

影响点 说明
地理位置差异 在北京查和纽约查同一个子域名,返回的 IP 不同
多 IP 结果 同一子域名在不同时间解析到不同 IP
不能直接扫端口 扫的是 CDN 节点,不是目标
必要时多地域验证 用多个地理位置的 DNS 节点交叉查询

关键认知:识别 CDN 不是为了"绕过"这一步就搞定,而是为了给每个子域打上"是否走 CDN"的标记。这个标记决定了后续每个子域的处理方式------走 CDN 的不能直接扫端口,没走 CDN 的可以直接扫。

1.4 CDN 检测的基础信号(只讲概念)

如何判断一个子域名是否走了 CDN?基础信号有:

信号类型 说明
CNAME 链含 CDN 关键词 cloudflare、akamai、fastly、cloudfront、wangsu(网宿)
多地域解析不同 IP 在不同地理位置查同一域名,返回不同 IP
IP 归属是 CDN 服务商 IP 归属查显示运营商是 CDN 而非目标企业
响应头含 CDN 特征 cf-ray(Cloudflare)、x-akamai、x-amz-cf-id

CDN 绕过的具体思路(历史 DNS、邮件服务器、SSL 证书等)留到后续"主动探测"章节展开。


二、负载均衡

CDN 是公网入口层的加速,再往里就是负载均衡。负载均衡决定了"一个域名背后可能挂了多少台服务器"。

2.1 什么是负载均衡

负载均衡(Load Balancing)是把进入的流量分发到多台后端服务器的技术。目的是分摊压力、提高可用性、做横向扩展。

要理解负载均衡,先理解没有它时的痛点:一台服务器扛不住高峰流量、一旦宕机服务就中断、没法动态扩容。负载均衡的解法是在服务器集群前面加一个"分发器"------所有请求先到分发器,由它按一定策略转发给后端某一台服务器。用户看到的只是分发器的 IP,后端服务器对用户不可见。

2.2 两种负载均衡模式

这两种模式的根本区别是工作在 OSI 模型的哪一层------四层只看网络层信息(IP+端口),七层会拆开 HTTP 请求看内容。

模式 工作层级 看什么做分发 挖掘意义
L4(四层 LB) 传输层 只根据 IP+端口转发,不解析 HTTP 内容 同一 IP 上可能承载多种协议(HTTP、MySQL、Redis 都可能)
L7(七层 LB) 应用层 解析 HTTP 请求,根据 Host 头或 URL 路径分发 同一 IP+端口上可能托管多个子域名------IP 反查能发现更多子域

简单记忆:L4 只看信封(IP+端口),L7 拆开信封看内容(Host 头、URL)。L7 能基于 Host 头分发是关键------这意味着一个 IP 可以托管多个子域名,是 IP 反查发现新子域的原理基础。

2.3 常见负载均衡实现

类型 说明 典型实现 特点
硬件负载均衡 专用硬件设备 F5 BIG-IP 性能强、贵、企业级
软件负载均衡 跑在通用服务器上 LVS、Nginx、HAProxy 灵活、成本低、最常见
云负载均衡 云厂商提供 阿里云 SLB、AWS ELB/ALB 弹性伸缩、按量付费

2.4 负载均衡的调度算法(基础)

分发器用什么策略选后端服务器?常见的几种:

算法 怎么选 对挖掘的影响
轮询 按顺序一台一台轮 多次请求可能打到不同后端
最少连接 选当前连接数最少的 高负载时倾向打到空闲服务器
IP Hash 同一来源 IP 固定打到同一台 同一 IP 的请求总到同一后端,行为稳定
加权 按权重比例分发 配置强的后端分得多

挖掘关注:负载均衡意味着同一域名背后有多台后端、同一域名多次请求可能返回不同内容。这是正常的,不是异常------做 HTTP 探测时要意识到这一点。

2.5 对子域名挖掘的意义

影响点 说明
一个域名对应多个 IP 负载均衡会让你拿到多个 IP,都是 LB 的,不是后端的
一个 IP 承载多个子域 L7 LB 下,一个 IP 可能托管多个子域名------IP 反查能发现更多子域
后端服务器不可见 LB 后面的真实服务器 IP 从外部看不到,是正常的

关键认知:负载均衡让你看到的 IP 是 LB 的公网 IP,不是后端服务器的真实 IP。这和 CDN 一样------你拿到的是"入口",不是"目标"。


三、网络架构图:从用户到后端的全景

把 CDN 和负载均衡串起来,就是一个完整的网络架构。这一节用一张图展示从用户到后端的完整链路。

3.1 整体网络架构图

真实世界的 Web 系统不只有 CDN 和 LB,中间还可能有 WAF、反向代理等层。下面是一张更完整的链路图:
#mermaid-svg-7pNgNv1iWcDK98yf{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-7pNgNv1iWcDK98yf .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-7pNgNv1iWcDK98yf .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-7pNgNv1iWcDK98yf .error-icon{fill:#552222;}#mermaid-svg-7pNgNv1iWcDK98yf .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-7pNgNv1iWcDK98yf .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-7pNgNv1iWcDK98yf .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-7pNgNv1iWcDK98yf .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-7pNgNv1iWcDK98yf .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-7pNgNv1iWcDK98yf .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-7pNgNv1iWcDK98yf .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-7pNgNv1iWcDK98yf .marker{fill:#333333;stroke:#333333;}#mermaid-svg-7pNgNv1iWcDK98yf .marker.cross{stroke:#333333;}#mermaid-svg-7pNgNv1iWcDK98yf svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-7pNgNv1iWcDK98yf p{margin:0;}#mermaid-svg-7pNgNv1iWcDK98yf .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-7pNgNv1iWcDK98yf .cluster-label text{fill:#333;}#mermaid-svg-7pNgNv1iWcDK98yf .cluster-label span{color:#333;}#mermaid-svg-7pNgNv1iWcDK98yf .cluster-label span p{background-color:transparent;}#mermaid-svg-7pNgNv1iWcDK98yf .label text,#mermaid-svg-7pNgNv1iWcDK98yf span{fill:#333;color:#333;}#mermaid-svg-7pNgNv1iWcDK98yf .node rect,#mermaid-svg-7pNgNv1iWcDK98yf .node circle,#mermaid-svg-7pNgNv1iWcDK98yf .node ellipse,#mermaid-svg-7pNgNv1iWcDK98yf .node polygon,#mermaid-svg-7pNgNv1iWcDK98yf .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-7pNgNv1iWcDK98yf .rough-node .label text,#mermaid-svg-7pNgNv1iWcDK98yf .node .label text,#mermaid-svg-7pNgNv1iWcDK98yf .image-shape .label,#mermaid-svg-7pNgNv1iWcDK98yf .icon-shape .label{text-anchor:middle;}#mermaid-svg-7pNgNv1iWcDK98yf .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-7pNgNv1iWcDK98yf .rough-node .label,#mermaid-svg-7pNgNv1iWcDK98yf .node .label,#mermaid-svg-7pNgNv1iWcDK98yf .image-shape .label,#mermaid-svg-7pNgNv1iWcDK98yf .icon-shape .label{text-align:center;}#mermaid-svg-7pNgNv1iWcDK98yf .node.clickable{cursor:pointer;}#mermaid-svg-7pNgNv1iWcDK98yf .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-7pNgNv1iWcDK98yf .arrowheadPath{fill:#333333;}#mermaid-svg-7pNgNv1iWcDK98yf .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-7pNgNv1iWcDK98yf .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-7pNgNv1iWcDK98yf .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-7pNgNv1iWcDK98yf .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-7pNgNv1iWcDK98yf .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-7pNgNv1iWcDK98yf .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-7pNgNv1iWcDK98yf .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-7pNgNv1iWcDK98yf .cluster text{fill:#333;}#mermaid-svg-7pNgNv1iWcDK98yf .cluster span{color:#333;}#mermaid-svg-7pNgNv1iWcDK98yf div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-7pNgNv1iWcDK98yf .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-7pNgNv1iWcDK98yf rect.text{fill:none;stroke-width:0;}#mermaid-svg-7pNgNv1iWcDK98yf .icon-shape,#mermaid-svg-7pNgNv1iWcDK98yf .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-7pNgNv1iWcDK98yf .icon-shape p,#mermaid-svg-7pNgNv1iWcDK98yf .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-7pNgNv1iWcDK98yf .icon-shape .label rect,#mermaid-svg-7pNgNv1iWcDK98yf .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-7pNgNv1iWcDK98yf .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-7pNgNv1iWcDK98yf .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-7pNgNv1iWcDK98yf :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 1. DNS 解析

api.example.com
返回 IP
2. HTTPS 请求

SNI: api.example.com
过滤后
回源请求

Host: api.example.com
分发请求
浏览器
DNS 系统

(递归→根→TLD→权威)
WAF

(可选层)

拦截恶意请求
CDN 节点

(可选层)

缓存 + 加速
负载均衡器

(LB)
反向代理

(Nginx 等)

(可选层)
后端服务器集群

(真实 IP 隐藏在这里)

3.2 每一层的角色

层 作用 是否一定存在 你能看到的
DNS 系统 域名→IP 翻译 一定 解析出的 IP
WAF 检测拦截恶意请求 可选 有时通过响应头能识别
CDN 节点 缓存、加速、隐藏源站 可选 你拿到的 IP 经常是这里的
负载均衡器 流量分发到后端 大型站点常有 LB 的公网 IP
反向代理 路由、限流、鉴权 常与 LB 合一 一般看不到
后端服务器集群 真正处理业务逻辑 一定 从外部看不到

3.3 为什么你拿到的 IP 往往不是目标真实 IP

关键认知 :你 ping、nslookup 看到的 IP 是 CDN 节点或负载均衡器的,不是目标后端服务器的。这就是为什么 IP 归属分析如此重要------你必须先判断"这个 IP 是 CDN 的还是目标的",否则后续的端口扫描、漏洞扫描全打在 CDN/LB 上,毫无意义。

3.4 不是所有网站都走全套链路

上面的架构图是"完整链路",但现实中不同规模的网站链路不同:

网站规模 典型链路 你拿到的 IP 性质
小网站/个人站 浏览器 → 后端服务器 真实服务器 IP,可直接扫端口
中型企业站 浏览器 → LB → 后端集群 LB 的 IP,不是后端真实 IP
大型站点 浏览器 → CDN → WAF → LB → 后端 CDN 节点 IP,需要绕过找源站
云原生应用 浏览器 → CDN → 云 LB → K8s → Pod CDN 或云 LB 的 IP

关键认知:拿到一个子域的 IP 后,第一件事不是扫端口,而是判断"这个 IP 处于链路的哪一层"。不同层级的 IP,后续处理方式完全不同。

3.5 子域名挖掘里的"真实 IP"问题

子域名挖掘能发现子域名和解析 IP,但这些 IP 的"性质"各不相同:

IP 性质 怎么判断 后续处理
CDN 节点 CNAME 含 CDN 关键词、IP 归属是 CDN 不扫端口,要绕 CDN 找源站
负载均衡器 IP 归属是云厂商、响应特征 可扫端口,但打的是 LB
真实服务器 IP 归属是目标企业、非 CDN 高价值,直接扫端口
共享主机 一个 IP 上有多个域名 IP 反查发现更多子域

四、HTTP/HTTPS 与 TLS 证书基础

子域名发现不只是 DNS 的事。一个子域名有 A 记录,不代表它上面跑着 Web 服务------可能只是一个邮件服务器、一个 VPN 入口。你需要做 HTTP 探测来判断"这个子域名上到底有没有服务、是什么服务"。

4.1 HTTP 与 HTTPS 的基本区别

协议 说明 端口 安全性
HTTP 超文本传输协议,明文传输 80 内容可被中间人看到、篡改
HTTPS HTTP + TLS 加密 443 内容加密,防窃听防篡改

两者的本质区别是有没有 TLS 这层加密。HTTP 的请求行、请求头、请求体全是明文,任何能抓到包的人都能看到你访问了什么、提交了什么。HTTPS 在 HTTP 下面加了一层 TLS,先把数据加密再传,中间人只能看到加密后的密文。

挖掘关注:子域名挖掘做 HTTP 探测时,同一个子域名要同时试 80 和 443 端口------有些站点只在 80 提供 HTTP,有些只在 443 提供 HTTPS,还有些 80 会 301 跳转到 443。

4.2 HTTPS 的大致流程

本篇只讲大致流程,不讲握手细节。TLS 握手涉及密钥交换、加密套件协商等,这些对子域名挖掘不是核心。我们关心的是"这个流程里有哪些信息可以收集"。
服务器 浏览器 服务器 浏览器 #mermaid-svg-GY4VhNOxi211ww3N{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-GY4VhNOxi211ww3N .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-GY4VhNOxi211ww3N .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-GY4VhNOxi211ww3N .error-icon{fill:#552222;}#mermaid-svg-GY4VhNOxi211ww3N .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-GY4VhNOxi211ww3N .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-GY4VhNOxi211ww3N .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-GY4VhNOxi211ww3N .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-GY4VhNOxi211ww3N .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-GY4VhNOxi211ww3N .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-GY4VhNOxi211ww3N .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-GY4VhNOxi211ww3N .marker{fill:#333333;stroke:#333333;}#mermaid-svg-GY4VhNOxi211ww3N .marker.cross{stroke:#333333;}#mermaid-svg-GY4VhNOxi211ww3N svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-GY4VhNOxi211ww3N p{margin:0;}#mermaid-svg-GY4VhNOxi211ww3N .actor{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-GY4VhNOxi211ww3N text.actor>tspan{fill:black;stroke:none;}#mermaid-svg-GY4VhNOxi211ww3N .actor-line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);}#mermaid-svg-GY4VhNOxi211ww3N .innerArc{stroke-width:1.5;stroke-dasharray:none;}#mermaid-svg-GY4VhNOxi211ww3N .messageLine0{stroke-width:1.5;stroke-dasharray:none;stroke:#333;}#mermaid-svg-GY4VhNOxi211ww3N .messageLine1{stroke-width:1.5;stroke-dasharray:2,2;stroke:#333;}#mermaid-svg-GY4VhNOxi211ww3N #arrowhead path{fill:#333;stroke:#333;}#mermaid-svg-GY4VhNOxi211ww3N .sequenceNumber{fill:white;}#mermaid-svg-GY4VhNOxi211ww3N #sequencenumber{fill:#333;}#mermaid-svg-GY4VhNOxi211ww3N #crosshead path{fill:#333;stroke:#333;}#mermaid-svg-GY4VhNOxi211ww3N .messageText{fill:#333;stroke:none;}#mermaid-svg-GY4VhNOxi211ww3N .labelBox{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-GY4VhNOxi211ww3N .labelText,#mermaid-svg-GY4VhNOxi211ww3N .labelText>tspan{fill:black;stroke:none;}#mermaid-svg-GY4VhNOxi211ww3N .loopText,#mermaid-svg-GY4VhNOxi211ww3N .loopText>tspan{fill:black;stroke:none;}#mermaid-svg-GY4VhNOxi211ww3N .loopLine{stroke-width:2px;stroke-dasharray:2,2;stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);}#mermaid-svg-GY4VhNOxi211ww3N .note{stroke:#aaaa33;fill:#fff5ad;}#mermaid-svg-GY4VhNOxi211ww3N .noteText,#mermaid-svg-GY4VhNOxi211ww3N .noteText>tspan{fill:black;stroke:none;}#mermaid-svg-GY4VhNOxi211ww3N .activation0{fill:#f4f4f4;stroke:#666;}#mermaid-svg-GY4VhNOxi211ww3N .activation1{fill:#f4f4f4;stroke:#666;}#mermaid-svg-GY4VhNOxi211ww3N .activation2{fill:#f4f4f4;stroke:#666;}#mermaid-svg-GY4VhNOxi211ww3N .actorPopupMenu{position:absolute;}#mermaid-svg-GY4VhNOxi211ww3N .actorPopupMenuPanel{position:absolute;fill:#ECECFF;box-shadow:0px 8px 16px 0px rgba(0,0,0,0.2);filter:drop-shadow(3px 5px 2px rgb(0 0 0 / 0.4));}#mermaid-svg-GY4VhNOxi211ww3N .actor-man line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-GY4VhNOxi211ww3N .actor-man circle,#mermaid-svg-GY4VhNOxi211ww3N line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;stroke-width:2px;}#mermaid-svg-GY4VhNOxi211ww3N :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 1. ClientHello(含 SNI: 我要访问哪个域名)2. ServerHello + 证书(含域名、SAN、颁发机构、有效期)3. 密钥交换4. 加密的 HTTP 请求5. 加密的 HTTP 响应

每一步发生了什么:

步骤 做什么 信息暴露
1. ClientHello 浏览器告诉服务器"我要访问哪个域名"(SNI)、支持哪些加密套件 SNI 明文传输------中间人能看到你要访问的域名
2. ServerHello + 证书 服务器返回选定的加密套件、服务器证书 证书含域名、SAN、颁发机构、有效期------这些都能看到
3. 密钥交换 双方协商出对称密钥 后续内容用这个密钥加密
4. 加密请求 浏览器发送加密后的 HTTP 请求 中间人看不到内容
5. 加密响应 服务器返回加密后的 HTTP 响应 中间人看不到内容

关键认知 :HTTPS 加密的是步骤 4 和 5 的内容,但步骤 1 的 SNI 和步骤 2 的证书是明文传输的。这就是为什么你能从网络流量里抓到 TLS 证书信息------证书本身不是秘密。

4.3 TLS 流程里能收集的信息

信息 在哪 挖掘价值
SNI ClientHello 里 暴露客户端要访问的域名
证书域名 证书的 CN 字段 这个 IP 上跑着哪个域名的服务
SAN 证书的 Subject Alternative Name 一张证书可能覆盖多个子域名
颁发机构 证书的 Issuer 字段 Let's Encrypt 说明自动化部署,自签名说明测试环境
有效期 证书的 Not Before / Not After 刚签发说明活跃部署,过期未续签说明被遗忘的服务

4.4 SNI 是什么

SNI(Server Name Indication,服务器名称指示)是 TLS 握手时客户端告诉服务器"我要访问哪个域名"的扩展字段。

要理解 SNI 解决什么问题,先看没有它的情况:一台服务器(一个 IP)上托管了 a.com 和 b.com 两个 HTTPS 站点,每张证书不同。但 TLS 握手时服务器不知道你要访问哪个域名------它应该返回哪张证书?没法决定。早期 TLS 没办法解决,只能"一个 IP 配一张证书"。

SNI 的解法:客户端在 ClientHello 里带上"我要访问 a.com",服务器据此返回 a.com 的证书。这样一个 IP 上就能托管多个 HTTPS 站点。

挖掘意义:SNI 让"一个 IP 托管多域名"成为可能。反过来,你拿一个 IP 去查所有指向它的域名(IP 反查),可能翻出同一台服务器上托管的、目标企业其他业务线的子域。

4.5 SAN 是什么

SAN(Subject Alternative Name,证书主体可选名称字段)是证书里列出"这张证书覆盖哪些域名"的字段。

要理解 SAN 解决什么问题,先看没有它的情况:一张证书只能绑定一个域名(CN 字段写的那个)。你有 api.example.com、staging-api.example.com、admin-api.example.com 三个子域要上 HTTPS,就要签三张证书、配三次。SAN 的解法:把多个域名都写进一张证书的 SAN 字段里,一张证书覆盖多个子域。

挖掘意义 :一张证书的 SAN 里可能藏着多个你不知道的子域名。你查一张 api.example.com 的证书,SAN 里可能写着 staging-api.example.com、admin-api.example.com------这些是你之前不知道的子域名。这就是"证书透明度日志"挖掘子域名的原理。

4.6 HTTP 状态码的语义

不是背状态码含义,而是理解每个状态码对挖掘者意味着什么:

状态码 通用含义 对挖掘者的意义
200 正常响应 服务存在,可继续探测
301/302 重定向 重定向链可能暴露新的子域名
401 未授权 需要登录认证------往往是登录页或受限接口,价值高
403 禁止访问 有内容但你没权限------往往是管理后台、内部系统,价值最高
404 不存在 这个路径没有服务,但也可能是 WAF 拦截的假信号
502/503 后端故障 服务可能临时下线,但域名仍在,值得监控

关键认知 :401/403 之所以价值高,是因为它说明"这里有东西,只是不让你看"------这和 404"确实没有"完全不同。401/403 往往指向管理后台或内部接口,是后续重点突破目标。另外 301/302 重定向链可能暴露新的子域名:比如 app.example.com 重定向到 sso.example.com 做登录------这个 sso 子域名可能不在你之前的列表里。


五、本篇小结

概念 一句话
CDN 源站和用户之间的缓存层,让你拿到的 IP 不是目标真实 IP
CDN 调度 智能 DNS 根据用户地理位置返回最近的边缘节点 IP
负载均衡 在服务器集群前加分发器,你看到的是 LB 的 IP
L4 vs L7 L4 只看 IP+端口,L7 看 HTTP 内容(含 Host 头)
网络架构 浏览器 → DNS → WAF → CDN → LB → 反代 → 后端,真实 IP 藏最里
不同规模链路不同 小站直连后端,大站走全套链路,IP 性质不同
HTTP/HTTPS HTTP 明文、HTTPS 加密,子域名要 HTTP 探测判断有没有服务
TLS 证书 SNI 和证书明文传输,SAN 可能覆盖多个子域名
SNI 让一个 IP 托管多域名,IP 反查能发现更多子域
状态码 401/403 价值最高("有但不让你看"),301/302 可能暴露新子域

下一篇我们讲云与基础设施------云架构、WAF、ASN。


附:本篇关键术语速查

术语 简明解释
CDN 内容分发网络,源站和用户之间的缓存层
源站 CDN 背后的真实后端服务器
边缘节点 CDN 的缓存节点,用户看到的 IP 是这里的
回源 CDN 缓存未命中时,向源站发请求
智能 DNS CDN 根据用户地理位置返回最近节点 IP 的 DNS
负载均衡 在服务器集群前加分发器,分发流量到多台后端
L4 负载均衡 工作在传输层,只看 IP+端口转发
L7 负载均衡 工作在应用层,看 HTTP 内容(含 Host 头)转发
调度算法 LB 选后端服务器的策略(轮询、最少连接、IP Hash 等)
反向代理 位于 LB 和后端之间的中间层,做路由、限流、鉴权
HTTP 明文 Web 协议,端口 80
HTTPS HTTP + TLS 加密,端口 443
TLS 传输层安全协议,HTTPS 的加密基础
SNI TLS 握手时客户端告诉服务器要访问哪个域名,明文传输
SAN 证书覆盖的域名列表字段,一张证书可覆盖多个子域
证书透明度 公开记录所有签发证书的日志系统
状态码 HTTP 响应码,标识请求结果
相关推荐
花青泽1 小时前
子域名挖掘全局流程
web安全
sogw-三叶草️4 小时前
HITCON CTF 2014 — stkof · Unsafe Unlink
网络·安全·web安全·pwn·堆·二进制安全·堆漏洞
Seraphina3615 小时前
SQLI-labs(一)黑盒全流程
sql·安全·web安全
花青泽1 天前
Web安全信息收集--总
安全·web安全
花青泽1 天前
子域名基础01_地址与域名基础
web安全
花青泽1 天前
子域名基础02_DNS解析流程_简单版
web安全
花青泽1 天前
子域名基础03_DNS解析流程_详细版
web安全
剑胆凌锋2 天前
等级保护测评工程师的困境
网络·安全·web安全·网络安全·职场和发展
Bruce_Liuxiaowei2 天前
2026年10月第1周网络安全形势周报
安全·web安全