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 入站。
三类网关的职责与选型
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 配置被误改,数据库也不会暴露到互联网。
路由与流量的可视化关系
下图把四类子网、三类网关与流量方向放在同一张关系图中,帮助快速判断“某类子网能否出站、能否被入站”。
设计时的关键判断点
第一,NAT 网关必须放在公有子网,且其路由表要指向 IGW,否则私有子网无法出站。第二,隔离子网不要挂 NAT 路由,一旦挂上就退化为私有子网,失去隔离语义。第三,NACL 是无状态的,如果只放行入站 3306 而不放行出站高位端口,返回流量会被丢弃,这是排障中最常见的“连不上”原因。第四,Egress-only IGW 只解决 IPv6,双栈环境中 IPv4 出站仍需 NAT 网关,两者要同时配置。
0.0.0.0/0:3306,虽然互联网无法主动连入(因为 NAT 不支持入站),但同 VPC 内被攻陷的实例仍可直连数据库。真正的隔离应同时依赖隔离子网 + 安全组来源限制。最后,子网划分要与可用区对齐:每个 AZ 至少一个公有子网和一个私有子网,NAT 网关按 AZ 部署,避免单点。隔离子网可按合规要求集中部署,也可按 AZ 分散以支持多可用区数据库。路由表、安全组、NACL 三者共同构成子网级边界,任何一层配置错误都会让安全分区失效,因此变更后应通过 VPC Flow Logs 或 Reachability Analyzer 验证实际连通性,而不是仅凭控制台显示判断。