4. 子网设计与安全分区

在 AWS 中,VPC 提供的是逻辑隔离的网络容器,而真正决定“谁能进、谁能出、谁完全不能出”的,是子网设计与子网级边界控制的组合。一个常见的误区是:只要把资源放进私有子网就安全了。实际上,私有子网的安全边界来自路由表、NAT 网关、安全组和网络 ACL 的协同,而不是子网名称本身。本节围绕四类子网与三类网关,说明如何把“安全分区”落到可执行的路由与访问控制上。

四类子网的本质区别:看路由表,不看名字

子网的类型由它的路由表决定,而不是由控制台里的标签决定。判断标准只有一条:该子网的路由表中是否存在指向 Internet Gateway(IGW)的默认路由 0.0.0.0/0。

  • 公有子网:路由表含 0.0.0.0/0 → IGW。子网内资源若分配了公网 IP 或弹性 IP,可被互联网直接访问,也可主动访问互联网。典型用途是 Application Load Balancer、NAT 网关、堡垒机。
  • 私有子网:路由表含 0.0.0.0/0 → NAT 网关。资源没有公网 IP,互联网无法主动连入,但资源可主动出站访问互联网(如拉取补丁、调用外部 API)。典型用途是应用服务器、容器节点。
  • 隔离子网:路由表中没有任何指向 IGW 或 NAT 的默认路由,只有本地路由 local(以及可能的 VPC 对等、Transit Gateway 路由)。资源完全无法访问互联网,互联网也无法访问它。典型用途是数据库、密钥管理、合规审计节点。
  • 仅出站子网:路由表含 0.0.0.0/0 → Egress-only IGW。这是 IPv6 场景下的“私有子网等价物”,允许 IPv6 出站、禁止 IPv6 入站。
记忆口诀:看默认路由指向谁——指向 IGW 是公有,指向 NAT 是私有,什么都不指是隔离,指向 Egress-only IGW 是仅出站。

三类网关的职责与选型

Internet Gateway(IGW)是 VPC 与互联网之间的双向网关,附加到 VPC 上,本身高可用、无需管理带宽。它同时承担公网入站和出站,是公有子网的唯一出口。一个 VPC 只能附加一个 IGW。

NAT 网关部署在公有子网中,需要绑定弹性 IP,为私有子网提供单向出站能力:内部发起的连接可以建立,外部无法主动发起连接进入。NAT 网关按可用区部署,跨 AZ 使用会产生跨区流量费用,因此生产环境通常每个 AZ 各建一个 NAT 网关,并让同 AZ 私有子网路由到同 AZ 的 NAT。

Egress-only Internet Gateway只处理 IPv6 流量,语义与 NAT 网关一致:允许 IPv6 出站、阻止 IPv6 入站。它不消耗弹性 IP,也不按小时计费,是 IPv6 私有出站的标准做法。注意:它不能用于 IPv4,IPv4 出站仍必须用 NAT 网关。

子网级边界控制:安全组与网络 ACL 的分工

子网级边界控制由两层组成,职责不同,不能互相替代:

维度安全组(Security Group)网络 ACL(NACL)
作用对象实例/弹性网卡子网
状态有状态,返回流量自动放行无状态,入站和出站需分别配置
规则类型仅允许规则允许 + 拒绝规则
规则顺序全部评估按编号从小到大,命中即停
典型用途精细控制应用端口子网级粗粒度封禁、合规隔离

实践中的分工是:安全组做精细的实例级访问控制,NACL 做子网级的兜底与显式拒绝。例如隔离子网可以用 NACL 显式拒绝所有来自 0.0.0.0/0 的入站,只允许来自应用子网 CIDR 的数据库端口,形成“双保险”。

一个可落地的三层分区示例

假设 VPC 网段为 10.0.0.0/16,规划三个可用区,每区三个子网:

VPC: 10.0.0.0/16

公有子网  10.0.0.0/20   (AZ-a)  路由: 0.0.0.0/0 -> IGW
私有子网  10.0.16.0/20  (AZ-a)  路由: 0.0.0.0/0 -> NAT-A
隔离子网  10.0.32.0/20  (AZ-a)  路由: 仅 local

公有子网  10.0.48.0/20  (AZ-b)  路由: 0.0.0.0/0 -> IGW
私有子网  10.0.64.0/20  (AZ-b)  路由: 0.0.0.0/0 -> NAT-B
隔离子网  10.0.80.0/20  (AZ-b)  路由: 仅 local

公有子网  10.0.96.0/20  (AZ-c)  路由: 0.0.0.0/0 -> IGW
私有子网  10.0.112.0/20 (AZ-c)  路由: 0.0.0.0/0 -> NAT-C
隔离子网  10.0.128.0/20 (AZ-c)  路由: 仅 local

对应的安全组策略示例:

  • ALB 安全组:入站 443 来自 0.0.0.0/0;出站到应用安全组。
  • 应用安全组:入站 8080 仅来自 ALB 安全组;出站到数据库安全组 3306,以及 443 到 0.0.0.0/0(经 NAT 出站)。
  • 数据库安全组:入站 3306 仅来自应用安全组;出站为空。

这样,数据库位于隔离子网且安全组只接受应用层来源,即使 NAT 或 IGW 配置被误改,数据库也不会暴露到互联网。

路由与流量的可视化关系

下图把四类子网、三类网关与流量方向放在同一张关系图中,帮助快速判断“某类子网能否出站、能否被入站”。

VPC 10.0.0.0/16 子网分区与网关流量关系 Internet Internet Gateway 双向 · IPv4/IPv6 Egress-only IGW 仅 IPv6 出站 NAT Gateway 仅 IPv4 出站 公有子网 10.0.0.0/20 0.0.0.0/0 → IGW ALB / NAT / 堡垒机 私有子网 10.0.16.0/20 0.0.0.0/0 → NAT 应用服务器 / 容器 隔离子网 10.0.32.0/20 仅 local 路由 数据库 / KMS / 审计 双向 出站 IPv6 出站 应用 → 数据库 3306(安全组放行) 双向公网流量 IPv4 单向出站 IPv6 单向出站 VPC 内部访问

设计时的关键判断点

第一,NAT 网关必须放在公有子网,且其路由表要指向 IGW,否则私有子网无法出站。第二,隔离子网不要挂 NAT 路由,一旦挂上就退化为私有子网,失去隔离语义。第三,NACL 是无状态的,如果只放行入站 3306 而不放行出站高位端口,返回流量会被丢弃,这是排障中最常见的“连不上”原因。第四,Egress-only IGW 只解决 IPv6,双栈环境中 IPv4 出站仍需 NAT 网关,两者要同时配置。

常见错误:把数据库放在“私有子网”并认为它不可从互联网访问。如果该子网路由表指向 NAT,且安全组误放行 0.0.0.0/0:3306,虽然互联网无法主动连入(因为 NAT 不支持入站),但同 VPC 内被攻陷的实例仍可直连数据库。真正的隔离应同时依赖隔离子网 + 安全组来源限制。

最后,子网划分要与可用区对齐:每个 AZ 至少一个公有子网和一个私有子网,NAT 网关按 AZ 部署,避免单点。隔离子网可按合规要求集中部署,也可按 AZ 分散以支持多可用区数据库。路由表、安全组、NACL 三者共同构成子网级边界,任何一层配置错误都会让安全分区失效,因此变更后应通过 VPC Flow Logs 或 Reachability Analyzer 验证实际连通性,而不是仅凭控制台显示判断。