2. VPC网络基础与诊断对象建模

在开始排查任何 AWS 网络问题之前,必须先回答一个更基础的问题:一个数据包从源到目的地,究竟会经过哪些对象?如果对 VPC 内部组成与交互关系没有清晰模型,故障诊断就会退化为“到处乱查”。本节的目标是把 VPC 拆解成可诊断的对象集合,并建立两条主线:一条是网络路径模型(包怎么走),另一条是故障域模型(问题可能出在哪一层)。

一、VPC 的组成对象与职责边界

VPC 本身是一个逻辑隔离的虚拟网络,它由若干可独立配置的对象共同构成。理解每个对象的职责,是定位故障的前提。

  • VPC:定义地址空间(CIDR,例如 10.0.0.0/16),是所有子网、路由表、网关的容器,也是隔离边界。
  • 子网(Subnet):VPC CIDR 的细分(如 10.0.1.0/24),绑定在某个可用区。子网决定资源的 IP 归属,并决定它是公有还是私有——但注意,“公有/私有”不是子网自身的属性,而是由路由表决定的。
  • 路由表(Route Table):决定子网内流量“下一跳去哪”。每个子网关联一张路由表,路由表包含本地路由(local)、网关路由、对等连接路由等。
  • 网关:Internet Gateway(IGW)提供公网双向访问;NAT Gateway 让私有子网单向访问公网;Virtual Private Gateway / Transit Gateway 连接混合云或多 VPC。
  • 安全组(Security Group):作用于弹性网卡(ENI)的有状态虚拟防火墙,只支持允许规则,返回流量自动放行。
  • 网络 ACL(NACL):作用于子网的无状态防火墙,支持允许和拒绝规则,入站和出站需分别显式放行。

这里有一个诊断中极易混淆的关键点:安全组是有状态的,NACL 是无状态的。这意味着如果 NACL 只放行了入站 443 而没有放行出站的高位端口(1024–65535),TCP 三次握手会失败,而安全组不会出现这种问题。排查时若发现“安全组看起来没问题但连接仍不通”,应优先怀疑 NACL 的出站规则。

二、网络路径模型:一个包要经过哪些关卡

把上述对象串起来,就得到一条完整的判定链。以“公网客户端访问 EC2 上的 HTTPS 服务”为例,数据包依次经过:

  1. IGW 进入 VPC;
  2. 命中子网关联的路由表,确认目标子网可达;
  3. 进入子网边界时,先经过 NACL 入站规则;
  4. 到达 ENI 时,经过 安全组入站规则;
  5. 到达实例;
  6. 返回流量按相反顺序:安全组自动放行(有状态),但 NACL 出站规则必须显式允许。

这条链上的每一环都是一个独立的故障域。诊断的核心方法就是:沿路径逐跳验证,而不是同时怀疑所有对象。

VPC 网络路径与故障域模型 公网客户端 Internet Internet GW 公网入口 VPC 10.0.0.0/16 路由表 Route Table 0.0.0.0/0 → IGW 10.0.0.0/16 → local 公有子网 10.0.1.0/24 NACL(无状态) 入站:允许 443 出站:需显式放行 安全组(有状态) 入站:允许 443 返回流量自动放行 EC2 实例 ENI 10.0.1.15 返回路径:NACL 出站必须放行 故障域分层 ① 路由层:路由表缺失/错误 ② 网关层:IGW/NAT 未挂载 ③ 子网边界:NACL 拦截 ④ 实例边界:安全组拦截 ⑤ 实例内部:服务未监听 诊断顺序:由外向内逐层验证 每层独立可测,避免同时怀疑 Reachability Analyzer 可自动逐跳

三、故障域模型:把“可能出错的地方”结构化

路径模型回答“包怎么走”,故障域模型回答“哪里可能断”。两者结合,才能形成可操作的诊断策略。基于上面的路径,可以把 VPC 网络故障划分为五个层次:

故障域典型症状首选验证手段
路由层目标不可达、超时检查子网关联路由表、目标 CIDR 匹配
网关层公网不通、私有子网无法出网确认 IGW 已附加、NAT 位于公有子网且有 EIP
NACL 层入站通但返回失败、间歇性丢包核对入站与出站规则、临时端口范围
安全组层连接被拒绝、特定端口不通检查入站规则源、协议、端口
实例层端口未监听、进程异常实例内 ss/netstat、服务日志

这个分层模型的价值在于:它把“网络不通”这个模糊问题,转化为一组可独立验证的假设。例如,如果从公网访问超时,但同子网内实例互访正常,那么路由层和 NACL 层大概率没问题,应重点检查 IGW 附加状态和安全组入站规则。

四、用 Reachability Analyzer 验证路径模型

AWS 提供的 Reachability Analyzer 正是基于上述路径模型工作的。它接收源(如 ENI、IGW)和目标(如 ENI、IP),自动沿路径逐跳分析,并明确指出在哪一跳被阻断。例如,一次典型分析可能返回:

Path: igw-0abc123 → subnet-0def456 → eni-0ghi789
Status: NOT REACHABLE
Blocking component: sg-0jkl012 (Security Group)
Reason: Inbound rule does not allow TCP 443 from 0.0.0.0/0

这类输出直接对应故障域模型中的某一层,极大缩短了定位时间。但要注意:Reachability Analyzer 只分析配置层面的可达性,它不会检测实例内部服务是否监听,也不会检测操作系统防火墙。因此它验证的是“路径是否被 AWS 配置阻断”,而不是“服务是否真的可用”。

建模建议:在排查前,先用一句话描述预期路径,例如“公网 → IGW → 公有子网路由表 → NACL → 安全组 → EC2:443”。然后逐段问“这一段由谁控制、当前配置是什么”。这种“路径 + 控制点”的写法,比笼统地说“检查网络配置”有效得多。

五、常见误区与诊断纪律

  • 把子网当成防火墙:子网本身不过滤流量,过滤发生在 NACL 和安全组。
  • 忽略 NACL 的无状态性:只放行入站而忘记出站临时端口,是返回流量失败的常见原因。
  • 同时修改多个对象:一次只改一个变量,否则无法判断是哪个改动生效。
  • 只看安全组不看路由:安全组允许不代表路由可达,两者是“与”关系。