AWS 网络架构解析
在 AWS 上部署任何应用时,三个网络问题必然出现:服务怎么被用户访问?容器怎么访问外部 API?数据库怎么不暴露到公网?
答案都在 VPC 网络架构中。IGW、NAT Gateway、路由表、安全组、公有/私有子网构成这套架构的核心支柱。
1. 全景架构图
%%{init: {'theme': 'base', 'themeVariables': { 'primaryColor': '#3B82F6', 'primaryTextColor': '#1E3A5F', 'primaryBorderColor': '#2563EB', 'lineColor': '#60A5FA', 'secondaryColor': '#10B981', 'tertiaryColor': '#F59E0B'}}}%%
flowchart TB
Internet["互联网"]
subgraph VPC ["VPC - 私有网络"]
IGW["IGW - 互联网网关"]
subgraph PublicSubnet ["公有子网 - 路由 0.0.0.0/0 到 IGW"]
ALB["ALB 负载均衡器 - 自带公有 IP"]
NATGW["NAT Gateway - 绑定 EIP"]
EC2_no_ip["EC2 无公有 IP - 无法上网"]
end
subgraph PrivateSubnet ["私有子网 - 路由 0.0.0.0/0 到 NAT GW"]
ECS["ECS 容器 - 无公有 IP"]
RDS["RDS 数据库 - 完全隔离"]
end
end
Internet <-->|"双向通信"| IGW
IGW <-->|"有公有 IP,放行"| ALB
IGW <-->|"有 EIP,放行"| NATGW
IGW -.->|"没公有 IP,拒绝"| EC2_no_ip
ECS -->|"出站请求"| NATGW
NATGW -->|"代理转发"| IGW
ALB -->|"VPC 内部转发"| ECS
classDef gateway fill:#F59E0B,stroke:#D97706,color:#fff
classDef pub fill:#10B981,stroke:#059669,color:#fff
classDef priv fill:#3B82F6,stroke:#2563EB,color:#fff
classDef blocked fill:#EF4444,stroke:#DC2626,color:#fff
class IGW,NATGW gateway
class ALB pub
class ECS,RDS priv
class EC2_no_ip blocked核心逻辑:外部流量从 IGW 进入 ALB,再转给私有子网的 ECS;ECS 出站则通过 NAT Gateway 借道 IGW。
2. 核心组件拆解
2.1 VPC:私有网络空间
| 项目 | 说明 |
|---|---|
| 全称 | Virtual Private Cloud |
| 定义 | 在 AWS 中划出的一块完全隔离的私有网络空间 |
| 类比 | 一栋大楼,你拥有整栋楼,里面怎么隔房间你说了算 |
| 关键属性 | 一个 CIDR 网段,比如 10.0.0.0/16(65536 个内网 IP) |
1 | ┌─────────────────────────────────────────┐ |
IPv6 双栈提示:AWS 推荐新建 VPC 时启用 IPv6 双栈。IPv6 地址全局可路由,可减少对 NAT 的依赖。2024 年 2 月起 AWS 对所有公有 IPv4 地址收费,IPv6 成为降本的重要手段。
2.2 IGW:互联网网关
| 项目 | 说明 |
|---|---|
| 全称 | Internet Gateway |
| 定义 | 连接 VPC 与互联网的网关组件 |
| 关键特性 | 一个 VPC 只能挂一个 IGW;免费;自动水平扩展 |
IGW 的核心职责:
1 | IPv4 场景: |
⚠️ IGW 只做转换和转发,不会给任何资源分配公有 IP。资源必须自己有公有 IP(IPv4 场景),IGW 才知道怎么映射。
在标准单 VPC 架构中,IGW 是唯一的互联网出口。但在更复杂的多 VPC 架构中,Transit Gateway + 共享 NAT 也可以作为出站路径。
2.3 路由表:流量导航规则
| 项目 | 说明 |
|---|---|
| 定义 | 一组规则,决定网络流量走哪条路 |
| 关键作用 | 区分公有/私有子网的唯一标准 |
每个子网必须关联一个路由表。路由表里最关键的是 0.0.0.0/0 这条路由——它定义了去互联网的流量走哪里。
| 路由规则 | 公有子网 | 私有子网 |
|---|---|---|
10.0.0.0/16 → local | ✅ VPC 内部互通 | ✅ VPC 内部互通 |
0.0.0.0/0 → ??? | → igw-xxx | → nat-xxx |
速记口诀:
1 | 看到 0.0.0.0/0 → igw-xxx 👉 公有子网 |
不看子网名字,不看有没有公有 IP,只看路由表。
2.4 NAT Gateway:私有资源的代理出口
| 项目 | 说明 |
|---|---|
| 全称 | Network Address Translation Gateway |
| 定义 | 让私有子网资源安全出站访问互联网的代理服务 |
| 部署位置 | 必须放在公有子网(因为它自己需要通过 IGW 出去) |
| 费用 | 约 $0.045/小时 + $0.045/GB 流量(us-east-1,价格因区域而异) |
NAT Gateway 的工作过程:
1 | 私有子网 ECS 容器要访问 DockerHub 拉镜像: |
NAT Gateway 只允许出站,外部无法主动发起连接进来。这就是 “ 私有 “ 的意义。
2.5 子网:VPC 里的房间
| 项目 | 公有子网 | 私有子网 |
|---|---|---|
| 本质区别 | 路由表 0.0.0.0/0 → IGW | 路由表 0.0.0.0/0 → NAT GW |
| 典型资源 | ALB、NAT Gateway、Bastion Host | ECS、RDS、ElastiCache |
| 设计意图 | 放需要被外界直接访问的组件 | 放需要被保护、不暴露的组件 |
| 自动有公有 IP? | ❌ 需要另外分配 | ❌ 没有 |
Lambda 连接 VPC 时使用 Hyperplane ENI(而非传统 ENI),出站同样需要 NAT Gateway 或 VPC Endpoint。
2.6 安全组与网络 ACL:流量的两道关卡
路由表决定流量 “ 走哪条路 “,安全组和网络 ACL 决定流量 “ 放不放行 “。
| 对比项 | 安全组(Security Group) | 网络 ACL(NACL) |
|---|---|---|
| 作用层级 | 资源级别(ENI) | 子网级别 |
| 状态 | 有状态——允许入站后,响应自动放行 | 无状态——入站和出站规则独立评估 |
| 默认行为 | 拒绝所有入站,允许所有出站 | 允许所有入站和出站 |
| 规则类型 | 只有允许规则 | 有允许和拒绝规则 |
| 规则评估 | 评估所有规则后放行 | 按编号顺序匹配,首条命中即生效 |
| 典型用法 | 控制 EC2/RDS/ECS 的端口访问 | 在子网层面做粗粒度 IP 黑名单 |
三层防护的协作关系:
1 | 第一层:路由表 → 决定流量能不能到达目标子网 |
⚠️ 安全组默认允许所有出站,新手更容易忘记的是入站规则的放行。按最小权限原则,只开放必要的端口和来源 IP 范围。
理解了各组件的职责后,接下来拆解一个核心误区——公有子网和公有 IP 的关系。
3. 公有子网 ≠ 公有 IP
这是新手最常踩的认知陷阱。
❌ 错误理解:” 公有子网嘛,里面的资源当然有公有 IP”
✅ 正确理解:公有子网只是路由可达 IGW,公有 IP 需要单独分配。两者是独立的事情。
3.1 通过 IGW 上网的两个必要条件
1 | 条件 1:路由表指向 IGW ← 子网层面(路在不在) |
| 场景 | 路由指向 IGW | 有公有 IP | 能上网? |
|---|---|---|---|
| A | ✅ | ✅ | ✅ |
| B | ✅ | ❌ | ❌ |
| C | ❌ | ✅ | ❌ |
| D | ❌ | ❌ | ❌ |
3.2 公有 IP 的三种获取方式
| 方式 | 说明 | 默认状态 |
|---|---|---|
| 子网级别 “ 自动分配公有 IP” | 子网内启动的实例自动获得 | 默认关闭 |
| 启动实例时手动选择 | 创建 EC2 时选 Enable | 默认跟随子网设置 |
| 弹性 IP(EIP) | 创建后手动绑定,IP 固定不变 | 需要手动操作 |
⚠️ IPv4 收费变更:自 2024 年 2 月 1 日起,AWS 对所有公有 IPv4 地址收取 $0.005/小时(约 $3.6/月),无论是否绑定到资源。ALB、NAT Gateway 等自带公有 IP 的组件也产生 IPv4 地址费用。
概念和误区理清后,下面用两条实际数据路径把整套架构串起来。
4. 两条核心数据流
4.1 入站流量:用户访问网站
1 | 👤 用户浏览器 |
ALB 到 ECS 的流量走 VPC 内部网络(local 路由),不需要经过 IGW 或 NAT Gateway。ECS 不需要公有 IP 也能被 ALB 访问到。
4.2 出站流量:ECS 容器拉取镜像
1 | 📦 ECS 容器(私有子网,无公有 IP) |
完整流程拆解:
| 步骤 | 发生了什么 | 源 IP | 目标 IP |
|---|---|---|---|
| ① ECS 发请求 | 容器想拉镜像 | 10.0.2.x(私有) | DockerHub |
| ② 查路由表 | 0.0.0.0/0 → nat-xxx | — | — |
| ③ NAT Gateway | 把源 IP 替换为自己的 EIP | 52.x.x.x(公有) | DockerHub |
| ④ IGW | 转发到互联网 | 52.x.x.x | DockerHub |
| ⑤ 响应返回 | DockerHub 回包给 NAT GW 的 EIP | DockerHub | 52.x.x.x |
| ⑥ NAT Gateway | 把目标 IP 换回 ECS 私有 IP | DockerHub | 10.0.2.x |
数据流走通之后,一个自然的优化切入点是:ECS 访问 AWS 自家服务时,能不能绕过 NAT Gateway?
5. VPC Endpoint:绕过 NAT 的省钱通道
ECS 访问 S3、ECR 等 AWS 服务时,默认走 NAT Gateway → IGW → 互联网再绕回 AWS 网络,既慢又贵。VPC Endpoint 提供了一条 VPC 内部直达 AWS 服务的私有通道。
5.1 两种 Endpoint 类型对比
| 对比项 | Gateway Endpoint | Interface Endpoint(PrivateLink) |
|---|---|---|
| 支持的服务 | 仅 S3 和 DynamoDB | ECR、CloudWatch、SQS 等 100+ 服务 |
| 实现方式 | 在路由表中添加一条规则 | 在子网中创建 ENI |
| 费用 | 完全免费 | ~$7.2/月($0.01/小时)+ $0.01/GB |
| 可用区 | 不限 | 建议每个 AZ 部署一个 |
5.2 流量路径对比
%%{init: {'theme': 'base', 'themeVariables': { 'primaryColor': '#3B82F6', 'primaryTextColor': '#1E3A5F', 'primaryBorderColor': '#2563EB', 'lineColor': '#60A5FA', 'secondaryColor': '#10B981', 'tertiaryColor': '#F59E0B'}}}%%
flowchart LR
subgraph Without ["不用 Endpoint - 绕远路"]
A1["ECS"] --> B1["NAT GW"] --> C1["IGW"] --> D1["互联网"] --> E1["S3/ECR"]
end
subgraph With ["用 Endpoint - 直达"]
A2["ECS"] --> E2["S3/ECR"]
end
classDef detour fill:#EF4444,stroke:#DC2626,color:#fff
classDef direct fill:#10B981,stroke:#059669,color:#fff
class A1,B1,C1,D1,E1 detour
class A2,E2 direct对于频繁访问 S3/ECR 的工作负载,配置 VPC Endpoint 后,NAT Gateway 的流量费用可降低 50% 以上。Gateway Endpoint(S3/DynamoDB)完全免费,是必配项。
6. 生产架构案例
6.1 典型三层架构
1 | 🌍 互联网 |
RDS Multi-AZ 只有主实例(Primary)+ 一个备用实例(Standby),不是三个 AZ 各一份。Aurora 存储层跨 3 AZ 自动复制,但计算实例默认只有 1 个 Writer + 可选 Reader。图中 AZ-c 没有 RDS 实例是真实情况。
每个 AZ 都放一个 NAT Gateway 的原因:
- NAT Gateway 是单 AZ 组件
- 如果 AZ-a 挂了,只部署在 AZ-a 的 NAT GW 会导致所有私有子网断网
- 生产环境每个 AZ 独立放一个 NAT GW,实现高可用
6.2 组件部署位置
| 组件 | 部署位置 | 原因 |
|---|---|---|
| ALB | 公有子网 | 需要被外部用户直接访问 |
| NAT Gateway | 公有子网 | 它自己需要通过 IGW 出站 |
| ECS 容器 | 私有子网 | 不需要被外部直接访问,通过 ALB 接收流量 |
| RDS 数据库 | 私有子网 | 绝对不能暴露到公网 |
| ElastiCache | 私有子网 | 缓存层只在 VPC 内部使用 |
| Bastion Host | 公有子网 | SSH 跳板机,需要从外部连入(或用 SSM 替代) |
7. 费用陷阱与省钱技巧
7.1 各组件费用
⚠️ 以下价格以 us-east-1 为例,其他区域价格不同,请以 AWS 官网定价页 为准。
| 组件 | 费用 | 备注 |
|---|---|---|
| VPC | 免费 | — |
| IGW | 免费 | — |
| 子网 | 免费 | — |
| 路由表 | 免费 | — |
| NAT Gateway | ~$32/月 + 流量费 | 每个 AZ 一个,三个 AZ ≈ $100/月 |
| 公有 IPv4 地址 | $0.005/小时(≈$3.6/月) | 2024.02 起所有公有 IPv4 均收费 |
| Gateway Endpoint | 免费 | S3/DynamoDB 专用 |
| Interface Endpoint | ~$7.2/月 + $0.01/GB | 每个 AZ 的 ENI 费用 |
7.2 NAT Gateway 账单陷阱
1 | 场景:ECS 每天从 ECR 拉镜像、向 S3 写日志 |
7.3 四种省钱手段
| 方法 | 节省效果 | 说明 |
|---|---|---|
| Gateway Endpoint(S3/DynamoDB) | S3/DynamoDB 流量费降为 $0 | 完全免费,必配项 |
| Interface Endpoint(ECR/CW 等) | NAT 流量费大幅降低 | 有小时费 ~$7/月,但省下的 NAT 流量费远超 |
| 开发环境用单 AZ NAT GW | 节省 2/3 NAT GW 费用 | 仅限非生产环境 |
| 启用 IPv6 双栈 | 减少公有 IPv4 地址费用 | 长期趋势,新项目建议直接规划 |
8. 排查利器:VPC Flow Logs
网络不通时,第一步不是猜,而是看日志。VPC Flow Logs 记录 VPC 中网络接口的流量信息,是排查网络问题的第一工具。
| 项目 | 说明 |
|---|---|
| 记录内容 | 源/目标 IP、端口、协议、数据包数、字节数、ACCEPT/REJECT |
| 输出目标 | CloudWatch Logs、S3、或 Kinesis Data Firehose |
| 粒度 | 可在 VPC / 子网 / ENI 三个级别开启 |
| 费用 | 发送到 S3 约 $0.25/GB,发送到 CloudWatch 约 $0.50/GB |
典型排查流程:
%%{init: {'theme': 'base', 'themeVariables': { 'primaryColor': '#3B82F6', 'primaryTextColor': '#1E3A5F', 'primaryBorderColor': '#2563EB', 'lineColor': '#60A5FA', 'secondaryColor': '#10B981', 'tertiaryColor': '#F59E0B'}}}%%
flowchart TD
Start["ECS 访问外部 API 超时"] --> Step1["开启 Flow Logs 查看"]
Step1 --> Check{"日志中是 ACCEPT 还是 REJECT?"}
Check -->|"REJECT"| Fix1["检查安全组 / NACL 规则"]
Check -->|"ACCEPT 但超时"| Fix2["检查路由表是否正确指向 NAT GW"]
Check -->|"流量未出现"| Fix3["检查 DNS 解析和应用层配置"]
classDef start fill:#EF4444,stroke:#DC2626,color:#fff
classDef decision fill:#F59E0B,stroke:#D97706,color:#fff
classDef fix fill:#10B981,stroke:#059669,color:#fff
class Start start
class Check decision
class Fix1,Fix2,Fix3 fix9. 新手避坑清单
| # | ❌ 误区 | ✅ 正解 | 严重程度 |
|---|---|---|---|
| 1 | 公有子网里的资源自动有公有 IP | 公有 IP 需要单独分配,子网只管路由 | 🔴 高 |
| 2 | 子网名字叫 “public” 就是公有子网 | 路由表是唯一判定标准,名字只是标签 | 🔴 高 |
| 3 | 有了 IGW 就能上网 | 还需要:路由指向 IGW + 资源有公有 IP + 安全组放行 | 🔴 高 |
| 4 | NAT Gateway 放在私有子网 | 必须放在公有子网,它自己也需要通过 IGW 出去 | 🔴 高 |
| 5 | NAT Gateway 一个就够了 | 生产环境每个 AZ 一个,否则单点故障 | 🟡 中 |
| 6 | 所有出站都走 NAT Gateway | 访问 S3/ECR 等 AWS 服务应走 VPC Endpoint | 🟡 中 |
| 7 | IGW 和 NAT Gateway 可以互相替代 | 两个完全不同的组件,分工明确,大多数架构都需要 | 🟡 中 |
| 8 | 安全组默认拒绝出站 | 安全组默认允许所有出站,容易忘的是入站放行 | 🟡 中 |
| 9 | 不用的 EIP 放着没事 | 所有公有 IPv4 地址每小时收费 $0.005,及时释放 | 🟢 低 |
10. 速查卡片
1 | ┌───────────────────────────────────────────────────────┐ |
AWS 网络看起来组件很多,但核心就一件事——控制流量往哪走。路由表决定方向,IGW/NAT GW 决定出口,公有 IP 决定身份,安全组/NACL 决定放不放行,VPC Endpoint 决定走不走捷径。把这五层想清楚,任何网络问题都能从容排查。