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
2
3
4
5
6
7
┌─────────────────────────────────────────┐
│ VPC: 10.0.0.0/16 │
│ ┌──────────┐ ┌──────────┐ │
│ │ 子网 A │ │ 子网 B │ ← 你自由划分 │
│ │10.0.1.0/24│ │10.0.2.0/24│ │
│ └──────────┘ └──────────┘ │
└─────────────────────────────────────────┘

IPv6 双栈提示:AWS 推荐新建 VPC 时启用 IPv6 双栈。IPv6 地址全局可路由,可减少对 NAT 的依赖。2024 年 2 月起 AWS 对所有公有 IPv4 地址收费,IPv6 成为降本的重要手段。

2.2 IGW:互联网网关

项目说明
全称Internet Gateway
定义连接 VPC 与互联网的网关组件
关键特性一个 VPC 只能挂一个 IGW;免费;自动水平扩展

IGW 的核心职责:

1
2
3
4
5
6
7
IPv4 场景:
出站时:把资源的 私有 IP → 替换为 公有 IP → 发到互联网
入站时:把目标的 公有 IP → 替换为 私有 IP → 转给资源
这就是 1:1 静态 NAT(网络地址转换)

IPv6 场景:
IPv6 地址全局可路由,IGW 仅做路由转发,不做地址转换

⚠️ 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-xxxnat-xxx

速记口诀:

1
2
3
看到 0.0.0.0/0 → igw-xxx    👉 公有子网
看到 0.0.0.0/0 → nat-xxx 👉 私有子网
没有 0.0.0.0/0 👉 完全隔离子网

不看子网名字,不看有没有公有 IP,只看路由表。

2.4 NAT Gateway:私有资源的代理出口

项目说明
全称Network Address Translation Gateway
定义让私有子网资源安全出站访问互联网的代理服务
部署位置必须放在公有子网(因为它自己需要通过 IGW 出去)
费用约 $0.045/小时 + $0.045/GB 流量(us-east-1,价格因区域而异)

NAT Gateway 的工作过程:

1
2
3
4
5
6
7
私有子网 ECS 容器要访问 DockerHub 拉镜像:

ECS(私有 IP 10.0.2.x)
→ 路由表说 0.0.0.0/0 走 NAT Gateway
→ NAT Gateway 把源 IP 换成自己的 EIP
→ 通过 IGW 出去到互联网
→ DockerHub 看到的是 NAT Gateway 的公有 IP,不知道 ECS 的存在

NAT Gateway 只允许出站,外部无法主动发起连接进来。这就是 “ 私有 “ 的意义。

2.5 子网:VPC 里的房间

项目公有子网私有子网
本质区别路由表 0.0.0.0/0 → IGW路由表 0.0.0.0/0 → NAT GW
典型资源ALB、NAT Gateway、Bastion HostECS、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
2
3
第一层:路由表    → 决定流量能不能到达目标子网
第二层:NACL → 子网级别的粗粒度过滤(大多数场景保持默认即可)
第三层:安全组 → 资源级别的精细控制(最小权限原则)

⚠️ 安全组默认允许所有出站,新手更容易忘记的是入站规则的放行。按最小权限原则,只开放必要的端口和来源 IP 范围。

理解了各组件的职责后,接下来拆解一个核心误区——公有子网和公有 IP 的关系。

3. 公有子网 ≠ 公有 IP

这是新手最常踩的认知陷阱。

❌ 错误理解:” 公有子网嘛,里面的资源当然有公有 IP”

✅ 正确理解:公有子网只是路由可达 IGW,公有 IP 需要单独分配。两者是独立的事情。

3.1 通过 IGW 上网的两个必要条件

1
2
3
4
5
条件 1:路由表指向 IGW     ← 子网层面(路在不在)
条件 2:资源有公有 IP ← 资源层面(票在不在)

两个都满足 → ✅ 能上网
缺任何一个 → ❌ 上不了网
场景路由指向 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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
👤 用户浏览器


🌍 互联网


🚪 IGW(VPC 大门)


⚖️ ALB(公有子网,有公有 IP)

▼ ← VPC 内部通信,不经过任何网关
📦 ECS 容器(私有子网,无公有 IP)


🗃️ RDS 数据库(私有子网)

ALB 到 ECS 的流量走 VPC 内部网络(local 路由),不需要经过 IGW 或 NAT Gateway。ECS 不需要公有 IP 也能被 ALB 访问到。

4.2 出站流量:ECS 容器拉取镜像

1
2
3
4
5
6
7
8
9
10
11
12
13
📦 ECS 容器(私有子网,无公有 IP)

▼ ← 路由表: 0.0.0.0/0 → nat-xxx
🧑‍💼 NAT Gateway(公有子网,有 EIP)

▼ ← NAT GW 自己在公有子网,路由走 IGW
🚪 IGW


🌍 互联网


🐳 DockerHub / ECR Public

完整流程拆解:

步骤发生了什么源 IP目标 IP
① ECS 发请求容器想拉镜像10.0.2.x(私有)DockerHub
② 查路由表0.0.0.0/0 → nat-xxx
③ NAT Gateway把源 IP 替换为自己的 EIP52.x.x.x(公有)DockerHub
④ IGW转发到互联网52.x.x.xDockerHub
⑤ 响应返回DockerHub 回包给 NAT GW 的 EIPDockerHub52.x.x.x
⑥ NAT Gateway把目标 IP 换回 ECS 私有 IPDockerHub10.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 EndpointInterface Endpoint(PrivateLink)
支持的服务仅 S3 和 DynamoDBECR、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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
                   🌍 互联网

🚪 IGW

┌──────────────┼──────────────┐
│ │ │
┌──────┴──────┐ ┌────┴────┐ ┌───────┴───────┐
│ 🟢 公有子网 │ │ 🟢 公有 │ │ 🟢 公有 │
│ AZ-a │ │ AZ-b │ │ AZ-c │
│ │ │ │ │ │
│ ⚖️ ALB 节点 │ │ ⚖️ ALB │ │ ⚖️ ALB │
│ 🧑‍💼 NAT GW │ │ 🧑‍💼 NAT │ │ 🧑‍💼 NAT │
└──────┬──────┘ └────┬────┘ └───────┬───────┘
│ │ │
┌──────┴──────┐ ┌────┴────┐ ┌───────┴───────┐
│ 🔴 私有子网 │ │ 🔴 私有 │ │ 🔴 私有 │
│ AZ-a │ │ AZ-b │ │ AZ-c │
│ │ │ │ │ │
│ 📦 ECS │ │ 📦 ECS │ │ 📦 ECS │
│ 🗃️ RDS │ │ 🗃️ RDS │ │ │
│ (Primary) │ │(Standby)│ │ │
└─────────────┘ └─────────┘ └───────────────┘

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
2
3
4
5
6
7
场景:ECS 每天从 ECR 拉镜像、向 S3 写日志

NAT GW 固定费:$0.045/小时 × 720 = $32.4/月
流量费:100GB × $0.045/GB = $4.5/月
3 个 AZ:($32.4 + $4.5) × 3 = $110.7/月

一年下来:$1,328

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 fix

9. 新手避坑清单

#❌ 误区✅ 正解严重程度
1公有子网里的资源自动有公有 IP公有 IP 需要单独分配,子网只管路由🔴 高
2子网名字叫 “public” 就是公有子网路由表是唯一判定标准,名字只是标签🔴 高
3有了 IGW 就能上网还需要:路由指向 IGW + 资源有公有 IP + 安全组放行🔴 高
4NAT Gateway 放在私有子网必须放在公有子网,它自己也需要通过 IGW 出去🔴 高
5NAT Gateway 一个就够了生产环境每个 AZ 一个,否则单点故障🟡 中
6所有出站都走 NAT Gateway访问 S3/ECR 等 AWS 服务应走 VPC Endpoint🟡 中
7IGW 和 NAT Gateway 可以互相替代两个完全不同的组件,分工明确,大多数架构都需要🟡 中
8安全组默认拒绝出站安全组默认允许所有出站,容易忘的是入站放行🟡 中
9不用的 EIP 放着没事所有公有 IPv4 地址每小时收费 $0.005,及时释放🟢 低

10. 速查卡片

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
┌───────────────────────────────────────────────────────┐
│ AWS VPC 网络速查卡片 │
├─────────────────┬─────────────────────────────────────┤
│ IGW │ VPC 互联网网关,免费,IPv4 做 1:1 NAT │
│ NAT GW │ 代理出站,多对一 NAT,只出不进 │
│ 公有子网 │ 0.0.0.0/0 → IGW │
│ 私有子网 │ 0.0.0.0/0 → NAT GW │
│ 公有 IP │ 不自动分配!需手动开启或绑 EIP │
│ 安全组 │ 有状态,默认允许出站,入站需手动放行 │
│ NACL │ 无状态,子网级别,默认全部放行 │
│ VPC Endpoint │ 直连 AWS 服务,Gateway 型免费 │
│ Flow Logs │ 网络排查第一工具,看 ACCEPT/REJECT │
│ 路由表 │ 决定子网公/私的唯一标准 │
│ IPv4 收费 │ 2024.02 起所有公有 IPv4 $0.005/小时 │
└─────────────────┴─────────────────────────────────────┘

AWS 网络看起来组件很多,但核心就一件事——控制流量往哪走。路由表决定方向,IGW/NAT GW 决定出口,公有 IP 决定身份,安全组/NACL 决定放不放行,VPC Endpoint 决定走不走捷径。把这五层想清楚,任何网络问题都能从容排查。

11. 参考文档