3. 生产级VPC网络架构设计

生产级VPC不是把默认VPC改几个子网就完事,而是从地址规划开始,把“哪些资源需要被互联网访问、哪些只能被内部访问、哪些必须完全隔离”这三类需求,映射到不同子网、路由表和网络ACL上。本节以“某业务系统部署在AWS、需要跨两个可用区高可用、Web层对外、应用与数据库层仅内部可达”为例,完整走一遍VPC的设计与落地过程。

一、先定地址空间与子网切分

VPC的CIDR一旦创建就不能修改,所以规划要留足余量。示例选用 10.20.0.0/16,共65536个地址。按“每类子网在每个可用区各一份”的原则,在 ap-southeast-1a 和 ap-southeast-1b 两个可用区中切出六张子网:

子网名称可用区CIDR类型用途
pub-1a1a10.20.0.0/20公有ALB、NAT网关
pub-1b1b10.20.16.0/20公有ALB、NAT网关
app-1a1a10.20.32.0/20私有应用服务器
app-1b1b10.20.48.0/20私有应用服务器
db-1a1a10.20.64.0/20隔离RDS、缓存
db-1b1b10.20.80.0/20隔离RDS、缓存

每张子网4096个地址,AWS会保留前4个和后1个,实际可用约4091个。这里刻意把“私有”和“隔离”分开:私有子网有到NAT网关的路由,可以主动出网;隔离子网没有任何指向互联网的路由,只能被VPC内部访问。这是生产环境里保护数据库最直接的手段。

二、路由表决定流量走向

路由表是VPC内流量的“决策中心”,每张子网必须关联一张路由表。示例中需要三张:

  • 公有路由表:0.0.0.0/0 → Internet Gateway,本地路由 10.20.0.0/16 → local。关联 pub-1a、pub-1b。
  • 私有路由表:0.0.0.0/0 → NAT Gateway,本地路由保留。关联 app-1a、app-1b。
  • 隔离路由表:只有本地路由,无默认路由。关联 db-1a、db-1b。

NAT网关要放在公有子网,并绑定弹性IP。为了可用区容错,应在 pub-1a 和 pub-1b 各建一个NAT网关,然后让 app-1a 的路由表指向 1a 的NAT,app-1b 指向 1b 的NAT。这样单个可用区故障时,另一侧的应用仍能出网。如果只建一个NAT网关,虽然省钱,但该可用区故障会导致所有私有子网失去出网能力。

三、VPC端点让私有流量不出VPC

应用访问S3、DynamoDB、ECR、CloudWatch Logs时,如果走NAT网关,会产生NAT处理费和流量费,而且流量绕行公网。更优的做法是使用VPC端点:

  • 网关型端点:用于S3和DynamoDB,免费,通过修改路由表把目标前缀指向端点。
  • 接口型端点:用于ECR、Secrets Manager、SSM等,基于ENI,按小时和流量计费,需在私有/隔离子网中创建。

以S3网关端点为例,创建后需要在私有路由表和隔离路由表中添加一条 pl-xxxx(S3前缀列表)→ vpce-xxxx 的路由。这样应用上传对象时流量直接进入AWS骨干网,不经过NAT,也不占用公网带宽。接口型端点还要配合安全组,只允许来自应用安全组的443访问。

四、安全组与网络ACL的分工

安全组是有状态的、作用于实例/ENI的白名单,网络ACL是无状态的、作用于子网的黑白名单。生产环境里两者配合使用:安全组做精细的实例级控制,网络ACL做子网级的粗粒度兜底。

示例中的安全组规则:

ALB-SG   : 入站 443 来自 0.0.0.0/0;出站 8080 到 APP-SG
APP-SG   : 入站 8080 来自 ALB-SG;出站 3306 到 DB-SG,出站 443 到 0.0.0.0/0
DB-SG    : 入站 3306 来自 APP-SG;出站 无(或仅响应流量)

网络ACL方面,公有子网ACL允许 0.0.0.0/0 的80/443入站,以及1024-65535的返回流量;私有子网ACL只允许来自VPC CIDR的入站;隔离子网ACL只允许来自 10.20.32.0/20 和 10.20.48.0/20 的3306入站。注意网络ACL是无状态的,返回流量必须显式放行临时端口范围,否则会出现“请求发出去了但回不来”的问题。

排查网络ACL问题时,先看入站规则是否放行,再看出站规则是否放行了返回的临时端口(通常为1024-65535)。安全组不需要关心返回流量,因为它是有状态的。

五、整体流量路径

把上面的设计串起来,南北向和东西向流量的路径如下:

生产级VPC流量路径(10.20.0.0/16) Internet Internet Gateway ALB (pub-1a/1b) NAT Gateway ×2 App (app-1a/1b) RDS (db-1a/1b) VPC Endpoint S3 / ECR / Logs 8080 3306 出网 私有访问 南北向 东西向:ALB→App→RDS 全程不出VPC 流量不经过NAT 公有子网 私有子网 隔离子网

南北向流量从Internet进入IGW,到达公有子网的ALB,ALB再转发到私有子网的应用;应用访问数据库走VPC内部路由,不经过任何网关。应用需要访问S3或拉取镜像时,优先走VPC端点;只有访问外部第三方API时才走NAT网关。这样既保证了安全边界,也控制了成本。

六、落地检查清单

创建完成后,建议按以下顺序验证:

  1. 从公有子网的EC2能否通过IGW访问互联网(curl -I https://aws.amazon.com)。
  2. 从私有子网的EC2能否通过NAT访问互联网,且源IP显示为NAT的弹性IP。
  3. 从隔离子网的EC2尝试访问互联网,应当超时,确认无默认路由。
  4. 应用实例能否通过VPC端点访问S3,且NAT网关的流量监控中没有对应流量。
  5. 安全组和网络ACL的规则是否与设计一致,特别是临时端口范围。
不要为了省事把所有子网都关联到同一张路由表。公有、私有、隔离三类子网的路由行为必须不同,否则隔离就失去了意义。另外,网络ACL规则按编号从小到大匹配,一旦命中就停止,编号顺序要留出插入空间。

这套架构的核心思想是:用子网划分安全区域,用路由表控制流量方向,用NAT和VPC端点解决出网问题,用安全组和网络ACL做纵深防御。地址规划、可用区分布和路由设计一旦确定,后续扩容只需在对应子网中增加资源,不需要改动网络骨架。