VPC 核心概念

深入理解 Amazon Virtual Private Cloud (VPC) 的核心概念和工作原理。

什么是 VPC

VPC 的本质

虚拟私有云:

VPC 是你在 AWS 云中的私有网络空间:
├─ 逻辑隔离的网络环境
├─ 完全由你控制
├─ 类似于传统数据中心网络
├─ 但更灵活、可扩展
└─ 支持混合云架构

VPC 的作用:

1. 资源隔离
   ├─ 不同应用、环境的网络隔离
   ├─ 多租户隔离
   └─ 符合合规要求

2. 网络控制
   ├─ 自定义 IP 地址范围
   ├─ 创建子网
   ├─ 配置路由表
   └─ 设置网关

3. 安全边界
   ├─ 安全组(Security Groups)
   ├─ 网络 ACL
   ├─ 流量监控
   └─ 访问控制

VPC 的特性

关键特性:

完全可定制:
├─ IP 地址范围(CIDR)
├─ 子网划分
├─ 路由策略
├─ 网关配置
└─ 网络安全规则

高可用性:
├─ 跨多个可用区(AZ)
├─ 冗余网关
├─ 自动故障转移
└─ 弹性 IP 地址

灵活连接:
├─ Internet 连接
├─ VPN 连接
├─ Direct Connect
├─ VPC Peering
└─ Transit Gateway

可扩展性:
├─ 支持数千个实例
├─ 弹性网络接口
├─ 多个子网
└─ 灵活的 IP 分配

VPC 组件

1. CIDR 块(IP 地址范围)

CIDR 是什么:

CIDR (Classless Inter-Domain Routing):
├─ 定义 VPC 的 IP 地址范围
├─ 格式:IP地址/前缀长度
├─ 例如:10.0.0.0/16
└─ 决定 VPC 可用的 IP 数量

计算可用 IP:
├─ /16 = 65,536 个 IP 地址
├─ /24 = 256 个 IP 地址
├─ /28 = 16 个 IP 地址
└─ AWS 保留每个子网 5 个 IP

CIDR 规划原则:

选择合适的大小:
├─ /16:65,536 IP(推荐用于大型 VPC)
├─ /20:4,096 IP(中型 VPC)
├─ /24:256 IP(小型 VPC)
└─ /28:16 IP(最小推荐大小)

避免冲突:
├─ 不与本地网络冲突
├─ 不与其他 VPC 冲突
├─ 规划未来扩展空间
└─ 考虑 VPC Peering 需求

推荐的私有 IP 范围:
├─ 10.0.0.0/8(Class A)
├─ 172.16.0.0/12(Class B)
└─ 192.168.0.0/16(Class C)

CIDR 规划示例:

大型组织多 VPC 规划:

生产环境 VPC:
├─ VPC-Prod: 10.0.0.0/16
│   ├─ 可用 IP:65,536
│   └─ 用途:生产应用

开发环境 VPC:
├─ VPC-Dev: 10.1.0.0/16
│   ├─ 可用 IP:65,536
│   └─ 用途:开发测试

测试环境 VPC:
├─ VPC-Test: 10.2.0.0/16
│   ├─ 可用 IP:65,536
│   └─ 用途:QA 测试

管理 VPC:
└─ VPC-Mgmt: 10.3.0.0/16
    ├─ 可用 IP:65,536
    └─ 用途:运维工具、跳板机

2. 子网(Subnets)

子网的作用:

子网是 VPC 内的 IP 地址段:
├─ 将 VPC 划分为更小的网络
├─ 每个子网属于一个可用区(AZ)
├─ 提供资源隔离
└─ 实现安全分层

子网类型:
├─ 公有子网(Public Subnet)
│   ├─ 可以访问 Internet
│   ├─ 有公网 IP
│   └─ 通过 Internet Gateway
│
└─ 私有子网(Private Subnet)
    ├─ 不能直接访问 Internet
    ├─ 仅有私有 IP
    └─ 通过 NAT Gateway 访问外网(可选)

AWS 保留的 IP 地址:

每个子网 AWS 保留 5 个 IP:

示例:子网 10.0.1.0/24

保留地址:
├─ 10.0.1.0:网络地址
├─ 10.0.1.1:VPC 路由器
├─ 10.0.1.2:AWS DNS 服务器
├─ 10.0.1.3:AWS 预留(未来使用)
└─ 10.0.1.255:广播地址

可用地址:
├─ 10.0.1.4 - 10.0.1.254
└─ 共 251 个可用 IP

因此:
256 (总数) - 5 (保留) = 251 (可用)

子网规划最佳实践:

多可用区部署:
VPC: 10.0.0.0/16
├─ AZ-A 公有子网: 10.0.1.0/24
├─ AZ-A 私有子网: 10.0.11.0/24
├─ AZ-B 公有子网: 10.0.2.0/24
├─ AZ-B 私有子网: 10.0.12.0/24
├─ AZ-C 公有子网: 10.0.3.0/24
└─ AZ-C 私有子网: 10.0.13.0/24

优势:
├─ 高可用性
├─ 容错能力
├─ 灵活扩展
└─ 负载均衡

3. 路由表(Route Tables)

路由表的作用:

控制子网内流量的路由:
├─ 每个子网必须关联一个路由表
├─ 决定流量的目的地
├─ 支持多个路由规则
└─ 默认本地路由自动添加

路由表类型:
├─ 主路由表(Main Route Table)
│   ├─ VPC 创建时自动生成
│   └─ 未显式关联路由表的子网使用
│
└─ 自定义路由表
    ├─ 针对特定子网
    └─ 更精细的路由控制

路由规则评估:

路由匹配原则:最长前缀匹配

路由表示例:
目的地               目标
10.0.0.0/16        local
0.0.0.0/0          igw-xxx
192.168.0.0/24     pcx-xxx

流量路由决策:
├─ 10.0.5.100 → local(最长匹配 /16)
├─ 8.8.8.8 → igw-xxx(匹配 /0)
└─ 192.168.0.50 → pcx-xxx(最长匹配 /24)

优先级:
1. 最具体的路由(最长前缀)
2. local 路由优先级最高
3. 静态路由优先于传播路由

4. Internet Gateway (IGW)

IGW 的作用:

Internet Gateway 是 VPC 与 Internet 的桥梁:
├─ 水平扩展
├─ 高可用
├─ 自动冗余
└─ 无带宽限制

工作原理:
VPC 资源 → IGW → Internet
    │               │
    └─ 私有 IP      └─ 公有 IP

功能:
├─ NAT(网络地址转换)
├─ 路由
└─ 高可用(AWS 管理)

IGW vs NAT Gateway:

Internet Gateway:
├─ 用于公有子网
├─ 双向通信(入站 + 出站)
├─ 需要公网 IP 或 EIP
├─ 免费
└─ AWS 管理的高可用

NAT Gateway:
├─ 用于私有子网
├─ 单向通信(仅出站)
├─ 私有 IP → 公网 IP 转换
├─ 按小时和数据传输收费
└─ 需要部署在公有子网

5. NAT Gateway

NAT Gateway 详解:

用途:
让私有子网的资源访问 Internet,但不允许 Internet 主动访问它们

特性:
├─ 高可用(单 AZ)
├─ 自动扩展带宽(最高 45 Gbps)
├─ 需要弹性 IP(EIP)
├─ 部署在公有子网
└─ 受管服务(AWS 维护)

架构:
私有子网 EC2 → NAT Gateway → IGW → Internet
  (私有IP)      (EIP)          (公网)

成本:
├─ 按小时收费:$0.045/小时
├─ 数据处理费:$0.045/GB
└─ 高可用需要每个 AZ 一个

NAT Gateway vs NAT Instance:

NAT Gateway(推荐):
├─ AWS 托管服务
├─ 自动高可用(单 AZ)
├─ 自动扩展带宽
├─ 无需管理
├─ 更高性能
└─ 成本较高

NAT Instance(不推荐):
├─ 自己管理 EC2
├─ 需要手动配置高可用
├─ 带宽受实例类型限制
├─ 需要维护和打补丁
├─ 可能成为瓶颈
└─ 成本较低(仅 EC2 费用)

选择建议:
✓ 生产环境:NAT Gateway
✓ 开发/测试:NAT Instance(成本敏感)
✓ 高可用:每个 AZ 一个 NAT Gateway

6. 弹性 IP (Elastic IP)

EIP 特性:

弹性 IP 地址:
├─ 静态公网 IPv4 地址
├─ 可以重新关联到不同资源
├─ 掩盖实例故障
├─ 账户级别拥有
└─ 跨可用区使用

使用场景:
├─ NAT Gateway
├─ 需要固定公网 IP 的 EC2
├─ 网络接口
└─ 故障转移

成本:
├─ 关联到运行实例:免费
├─ 未使用或关联到停止实例:收费
└─ 每个账户限制 5 个(可申请增加)

VPC 架构模式

单层架构

简单架构:

┌─────────────────────────────────┐
│         VPC (10.0.0.0/16)       │
│                                 │
│  ┌───────────────────────────┐ │
│  │  Public Subnet (10.0.1.0/24) │
│  │                             │ │
│  │  ┌──────┐  ┌──────┐       │ │
│  │  │ Web  │  │ App  │       │ │
│  │  └──────┘  └──────┘       │ │
│  └─────────────┬───────────────┘ │
│                │                 │
│         ┌──────▼──────┐         │
│         │     IGW     │         │
│         └─────────────┘         │
└─────────────────────────────────┘

特点:
├─ 所有资源在公有子网
├─ 直接暴露到 Internet
├─ 配置简单
└─ 安全性较低

适用场景:
├─ 简单的静态网站
├─ 开发/测试环境
└─ 概念验证(POC)

双层架构

经典三层架构:

┌────────────────────────────────────────────┐
│            VPC (10.0.0.0/16)               │
│                                            │
│  ┌──────────────────┐  ┌─────────────────┐│
│  │ Public Subnet    │  │ Private Subnet  ││
│  │ (10.0.1.0/24)   │  │ (10.0.11.0/24) ││
│  │                  │  │                 ││
│  │  ┌──────┐       │  │  ┌──────┐      ││
│  │  │ Web  │       │  │  │ App  │      ││
│  │  └──────┘       │  │  └──────┘      ││
│  │      ↓          │  │      ↓         ││
│  │  ┌──────┐       │  │  ┌──────┐      ││
│  │  │ ELB  │       │  │  │  DB  │      ││
│  │  └──────┘       │  │  └──────┘      ││
│  └─────┬────────────┘  └────────┬───────┘│
│        │                        │        │
│        │      ┌────────┐        │        │
│        └─────►│  IGW   │        │        │
│               └────────┘        │        │
│                                 │        │
│               ┌────────┐        │        │
│               │NAT GW  │◄───────┘        │
│               └────────┘                 │
└────────────────────────────────────────────┘

特点:
├─ Web 层在公有子网
├─ 应用和数据层在私有子网
├─ NAT Gateway 提供出站访问
└─ 更好的安全隔离

适用场景:
├─ 生产 Web 应用
├─ 典型的三层架构
└─ 需要数据库保护的应用

多层高可用架构

企业级架构:

┌─────────────────────────────────────────────────────────────┐
│                   VPC (10.0.0.0/16)                         │
│                                                             │
│  AZ-A                             AZ-B                      │
│  ┌─────────────────┐              ┌─────────────────┐      │
│  │ Public-A        │              │ Public-B        │      │
│  │ 10.0.1.0/24    │              │ 10.0.2.0/24    │      │
│  │  ┌────────┐    │              │  ┌────────┐    │      │
│  │  │  Web   │    │              │  │  Web   │    │      │
│  │  └────────┘    │              │  └────────┘    │      │
│  │  ┌────────┐    │              │  ┌────────┐    │      │
│  │  │NAT GW-A│    │              │  │NAT GW-B│    │      │
│  │  └────────┘    │              │  └────────┘    │      │
│  └────────┬────────┘              └────────┬────────┘      │
│           │                                │               │
│  ┌────────┴────────┐              ┌────────┴────────┐      │
│  │ Private-A       │              │ Private-B       │      │
│  │ 10.0.11.0/24   │              │ 10.0.12.0/24   │      │
│  │  ┌────────┐    │              │  ┌────────┐    │      │
│  │  │  App   │    │              │  │  App   │    │      │
│  │  └────────┘    │              │  └────────┘    │      │
│  └─────────────────┘              └─────────────────┘      │
│           │                                │               │
│  ┌────────┴────────┐              ┌────────┴────────┐      │
│  │ Data-A          │              │ Data-B          │      │
│  │ 10.0.21.0/24   │              │ 10.0.22.0/24   │      │
│  │  ┌────────┐    │              │  ┌────────┐    │      │
│  │  │RDS Pri │    │◄─────────────┤  │RDS Stan│    │      │
│  │  └────────┘    │              │  └────────┘    │      │
│  └─────────────────┘              └─────────────────┘      │
│                                                             │
│              ┌─────────────────┐                           │
│              │  Internet GW    │                           │
│              └─────────────────┘                           │
└─────────────────────────────────────────────────────────────┘

特点:
├─ 跨多个可用区
├─ 每个 AZ 有独立的 NAT Gateway
├─ 应用层冗余部署
├─ RDS 多 AZ 主备
└─ 负载均衡器分发流量

适用场景:
├─ 关键生产应用
├─ 需要高可用的服务
└─ 符合合规要求

VPC 设计原则

1. 高可用设计

多 AZ 部署:

原则:
├─ 至少使用 2 个可用区
├─ 每个层在每个 AZ 都有资源
├─ 使用负载均衡器
└─ 数据库使用 Multi-AZ

示例:
Web 层:
├─ AZ-A: 2 个 EC2
├─ AZ-B: 2 个 EC2
└─ ALB 分发流量

App 层:
├─ AZ-A: 2 个 EC2
├─ AZ-B: 2 个 EC2
└─ 内部 ALB

数据层:
├─ RDS Multi-AZ
├─ ElastiCache 多节点
└─ 自动故障转移

2. 安全分层

最小权限网络访问:

层次化安全:
├─ DMZ(公有子网)
│   └─ 仅暴露必要的服务
├─ 应用层(私有子网)
│   └─ 只接受来自 Web 层的流量
└─ 数据层(私有子网)
    └─ 只接受来自应用层的流量

安全组规则:
Web → Internet: 允许 80, 443
App → Web: 允许应用端口
DB → App: 允许数据库端口

3. 可扩展设计

预留扩展空间:

CIDR 规划:
├─ 使用较大的 VPC CIDR(如 /16)
├─ 子网使用较小的 CIDR(如 /24)
├─ 预留 CIDR 用于未来子网
└─ 避免后期无法扩展

子网规划:
├─ 每个 AZ 预留多个子网 CIDR
├─ 为新服务预留空间
└─ 考虑未来的服务增长

理解这些核心概念是设计和管理 VPC 的基础!