第4章:AWS网络与VPC设计——VPC、子网、路由表、NAT网关、安全组与网络ACL的实战配置

说到AWS的VPC,我脑子里第一个蹦出来的词就是「虚拟数据中心」。说白了,VPC就是你在AWS云上圈出来的一块私有网络空间。你可以在里面跑EC2、RDS、Lambda这些资源,完全由你说了算。

我记得刚入行那会儿,有个同事把数据库直接丢在公有子网里,结果被扫了端口。嗯,从那以后,我对VPC设计就特别较真。今天咱们就把VPC、子网、路由表、NAT网关、安全组和网络ACL这几个核心组件,一个一个掰开揉碎了讲清楚。

4.1 VPC与子网:你的网络地基

VPC是AWS网络架构的基石。你创建VPC时,需要指定一个CIDR块,比如10.0.0.0/16。这个范围决定了你的VPC能容纳多少IP地址。

重要原则:VPC的CIDR块一旦创建就不能修改。所以规划时一定要留足余量。我个人习惯用/16的掩码,这样有65536个IP,足够大多数场景使用。

子网是VPC的下一级划分。每个子网必须关联一个可用区(AZ)。这意味着你可以通过子网实现跨AZ的高可用部署。

子网分两种:

  • 公有子网:关联了互联网网关(IGW),路由表中有一条指向IGW的默认路由(0.0.0.0/0)。
  • 私有子网:没有直接通往互联网的路由。通常通过NAT网关或VPC端点访问外部服务。

我在项目中遇到过一个问题:有人把子网CIDR设成了10.0.0.0/24,结果只够256个IP,业务一扩容就炸了。你想想看,一个生产环境的VPC,子网至少得给/20才稳妥。

4.2 路由表:流量怎么走,你说了算

路由表决定了网络流量的走向。每个子网必须关联一张路由表。你可以把路由表想象成一张「交通地图」——数据包到了子网,路由表告诉它下一步该往哪走。

路由表的核心规则:

  • 本地路由:VPC创建时自动生成,目标为VPC的CIDR块,下一跳为local。这条路由不能删除。
  • 自定义路由:你手动添加的路由,比如指向IGW、NAT网关、VPC对等连接、VPN网关等。

我的经验:路由表遵循最长前缀匹配原则。比如目标IP是10.0.1.5,同时有两条路由:10.0.0.0/16和10.0.1.0/24,那么会匹配更精确的10.0.1.0/24。这个细节在排错时特别有用。

举个例子,一个典型的公有子网路由表长这样:

目的地            下一跳
10.0.0.0/16      local
0.0.0.0/0        igw-xxxxxxxx

而私有子网的路由表,通常会把0.0.0.0/0指向NAT网关:

目的地            下一跳
10.0.0.0/16      local
0.0.0.0/0        nat-xxxxxxxx

4.3 NAT网关:私有子网的「出海口」

私有子网里的EC2实例没有公网IP,但它们有时候需要访问互联网——比如下载补丁、拉取Docker镜像。这时候就需要NAT网关。

NAT网关部署在公有子网中,它有一个弹性IP。私有子网的路由表把0.0.0.0/0指向NAT网关,流量就通过NAT网关转发出去。注意,NAT网关只支持出站流量,外部无法主动访问私有子网里的资源。

避坑指南:我曾经踩过一个坑——NAT网关是单AZ的。如果它所在的AZ挂了,所有依赖它的私有子网都无法访问互联网。解决方案是:在每个AZ都部署一个NAT网关,并让对应AZ的私有子网路由指向本AZ的NAT网关。这样实现了AZ级别的容灾。

NAT网关的带宽上限是45 Gbps,但价格不便宜。如果预算有限,可以考虑NAT实例(EC2自建),但维护成本更高。我个人建议生产环境用NAT网关,省心。

4.4 安全组:实例级别的防火墙

安全组是AWS最常用的网络安全控制手段。它工作在实例级别,说白了就是给EC2、RDS这些资源配一个「门禁」。

安全组的特点:

  • 有状态:允许入站流量后,出站响应自动放行,不需要额外规则。
  • 只支持允许规则:你不能写一条「拒绝」规则。所有流量默认拒绝,只有明确允许的才放行。
  • 可以引用其他安全组:比如允许来自某个安全组的所有流量,这在多层架构中非常实用。

举个例子,一个Web服务器的安全组规则:

入站规则:
类型: HTTP (80)    来源: 0.0.0.0/0
类型: HTTPS (443)  来源: 0.0.0.0/0
类型: SSH (22)     来源: 你的办公IP/32

出站规则:
类型: 所有流量     目标: 0.0.0.0/0

我的习惯:安全组规则尽量细化。比如SSH只允许特定IP,而不是整个VPC。另外,我经常用安全组引用——让应用层的安全组只允许来自负载均衡器安全组的流量,这样更安全。

4.5 网络ACL:子网级别的访问控制

网络ACL(NACL)是子网级别的防火墙。它和安全组最大的区别是:NACL是无状态的,而且同时支持允许和拒绝规则。

NACL的规则按编号从小到大依次评估。一旦匹配到某条规则,就立即执行,不再继续匹配。所以规则编号要留出间隔,方便后续插入新规则。

一个典型的NACL配置:

规则编号 类型 协议 端口范围 来源/目标 允许/拒绝
100 HTTP TCP 80 0.0.0.0/0 允许
110 HTTPS TCP 443 0.0.0.0/0 允许
120 SSH TCP 22 10.0.0.0/8 允许
* 所有流量 所有 所有 0.0.0.0/0 拒绝

注意:NACL的无状态特性意味着你需要同时配置入站和出站规则。比如允许入站HTTP流量,出站也要允许临时端口(1024-65535)的响应流量。这个细节经常被忽略,导致服务不通。

4.6 实战配置:搭建一个三层架构VPC

好了,理论讲完了,咱们来点实际的。假设我们要搭建一个经典的三层架构:Web层、应用层、数据库层。

步骤是这样的:

  1. 创建VPC:CIDR为10.0.0.0/16
  2. 创建子网
    • 公有子网A:10.0.1.0/24,AZ-a
    • 公有子网B:10.0.2.0/24,AZ-b
    • 私有子网A(应用层):10.0.3.0/24,AZ-a
    • 私有子网B(应用层):10.0.4.0/24,AZ-b
    • 私有子网C(数据库层):10.0.5.0/24,AZ-a
    • 私有子网D(数据库层):10.0.6.0/24,AZ-b
  3. 创建互联网网关:关联到VPC。
  4. 创建NAT网关:部署在公有子网A,分配弹性IP。
  5. 配置路由表
    • 公有子网路由表:0.0.0.0/0 → IGW
    • 私有子网路由表:0.0.0.0/0 → NAT网关
  6. 配置安全组
    • Web安全组:允许80/443来自0.0.0.0/0,允许SSH来自办公IP
    • 应用安全组:允许来自Web安全组的流量
    • 数据库安全组:允许来自应用安全组的3306端口
  7. 配置网络ACL:作为额外防线,限制子网间的非必要流量。

关键点:数据库层绝对不要放在公有子网里。我曾经见过有人图方便把RDS放在公有子网,结果被扫了数据库端口。安全组和NACL虽然能挡住一部分,但最佳实践是物理隔离——私有子网+安全组+NACL三层防护。

4.7 排错与最佳实践

VPC排错是AWS认证考试的常客,也是日常运维的必修课。我总结了几条经验:

  • 流量不通?先看路由表:检查子网关联的路由表是否有正确的默认路由。
  • 再看安全组:安全组是否有允许入站/出站的规则。
  • 最后看NACL:NACL的无状态特性经常导致问题,特别是临时端口没放行。
  • VPC Flow Logs是你的好帮手:开启Flow Logs,可以查看所有被允许或拒绝的流量,排错神器。

我的建议:在VPC设计阶段就开启Flow Logs,不要等到出问题再开。另外,用标签(Tag)给VPC、子网、路由表打上清晰的标记,比如Environment: ProductionTier: Web。这在资源多的时候能救命。

最后说一句:VPC设计没有银弹。每个业务场景都不一样,但核心原则是相通的——最小权限、分层隔离、高可用。你把这些原则吃透了,VPC这块基本就稳了。