📌 核心知识点
VPC 实战指南
📖 VPC 基础知识
Amazon Virtual Private Cloud (VPC) 是 AWS 的虚拟化网络层,让您在 AWS 云中创建逻辑隔离的网络环境。
🖼️ VPC 图解补充

看图重点:多区域架构决策会先影响 VPC 的 CIDR 与互联策略。

看图重点:VPC 子网设计一般按 AZ 复制,保证故障隔离。

看图重点:VPC 安全治理里 SG 是实例级边界,和路由/子网职责不同。

看图重点:公网子网模式简单但暴露面更大,适合边缘入口层。

看图重点:私网部署结合 NAT/Endpoint 是更常见的生产网络模式。

看图重点:大流量出网时 NAT 会成为成本和带宽关键点。

看图重点:访问 AWS 托管服务可走私网 Endpoint,减少公网路径依赖。
VPC 是什么?
VPC 是您在 AWS 中的虚拟数据中心。每个 AWS 用户都应该对 VPC 概念有基本的了解,但只有少数人需要深入了解所有细节。VPC 配置可以非常简单或极其复杂,取决于您的网络和安全需求。
所有现代 AWS 账户(2013-12-04 之后创建)都是 "EC2-VPC" 账户,支持 VPC,所有实例都会在默认 VPC 中运行。
VPC 架构示例 (10.0.0.0/16)
├── 公有子网 (10.0.1.0/24) - 面向互联网
│ ├── Internet Gateway - 互联网出入口
│ ├── NAT Gateway - 私有子网的出站代理
│ └── ALB/ELB - 负载均衡器
├── 私有子网 (10.0.10.0/24) - 应用层
│ ├── EC2 应用服务器
│ └── Lambda (VPC 内)
├── 数据库子网 (10.0.20.0/24) - 数据层
│ ├── RDS 实例
│ └── ElastiCache
├── 路由表 (Route Tables)
├── 安全组 (Security Groups)
└── 网络 ACL (NACLs)

看图重点:先看子网分层,再看路由路径,最后看 SG/NACL 的流量控制边界。

看图重点:私有子网出网通常走 NAT Gateway,入站不能反向直连私有实例。
子网规划
CIDR 块设计
生产环境推荐 (10.0.0.0/16 = 65,536 个 IP):
├── 公有子网 AZ-a: 10.0.1.0/24 (251 个可用 IP)
├── 公有子网 AZ-b: 10.0.2.0/24 (251 个可用 IP)
├── 公有子网 AZ-c: 10.0.3.0/24 (251 个可用 IP)
├── 私有子网 AZ-a: 10.0.10.0/24 (251 个可用 IP)
├── 私有子网 AZ-b: 10.0.11.0/24 (251 个可用 IP)
├── 私有子网 AZ-c: 10.0.12.0/24 (251 个可用 IP)
├── 数据库子网 AZ-a: 10.0.20.0/24 (251 个可用 IP)
├── 数据库子网 AZ-b: 10.0.21.0/24 (251 个可用 IP)
└── 数据库子网 AZ-c: 10.0.22.0/24 (251 个可用 IP)
# 注意:每个子网 AWS 保留 5 个 IP 地址
# .0 = 网络地址
# .1 = VPC 路由器
# .2 = DNS 服务器
# .3 = 预留
# .255 = 广播地址(VPC 不支持广播,但保留)
多可用区设计
为了高可用,每种子网类型应跨多个可用区:
| 子网类型 | AZ-a | AZ-b | AZ-c | 用途 |
|---|---|---|---|---|
| 公有子网 | 10.0.1.0/24 | 10.0.2.0/24 | 10.0.3.0/24 | ALB, NAT GW |
| 私有子网 | 10.0.10.0/24 | 10.0.11.0/24 | 10.0.12.0/24 | 应用服务器 |
| 数据库子网 | 10.0.20.0/24 | 10.0.21.0/24 | 10.0.22.0/24 | RDS 子网组 |
安全组 vs NACL
安全组 (Security Groups)
安全组是您服务器的第一道防线。使用 CLB、ALB 或其他负载均衡时,通常只需要开放 22 端口(SSH)和应用端口。安全组默认拒绝所有入站流量。
- 有状态: 出站响应自动允许
- 实例级别: 绑定到 ENI(网络接口)
- 只允许规则: 不能添加拒绝规则
- 全部评估: 所有规则都会被评估
# Terraform 示例 - Web 服务器安全组
resource "aws_security_group" "web" {
name = "web-sg"
vpc_id = aws_vpc.main.id
ingress {
from_port = 80
to_port = 80
protocol = "tcp"
cidr_blocks = ["0.0.0.0/0"]
}
ingress {
from_port = 443
to_port = 443
protocol = "tcp"
cidr_blocks = ["0.0.0.0/0"]
}
egress {
from_port = 0
to_port = 0
protocol = "-1"
cidr_blocks = ["0.0.0.0/0"]
}
}
💡 最佳实践: 使用其他安全组作为源,而不是 CIDR。这样只有源安全组中的主机被允许访问:
# 允许来自 ALB 安全组的流量
ingress {
from_port = 8080
to_port = 8080
protocol = "tcp"
security_groups = [aws_security_group.alb.id]
}
网络 ACL (NACLs)
- 无状态: 需要同时配置入站和出站规则
- 子网级别: 应用于整个子网的所有流量
- 允许和拒绝规则: 可以明确拒绝流量
- 按序号评估: 从小到大,第一个匹配的规则生效
对比总结
| 特性 | 安全组 | NACL |
|---|---|---|
| 级别 | 实例/ENI | 子网 |
| 状态 | 有状态 | 无状态 |
| 规则类型 | 只允许 | 允许+拒绝 |
| 规则评估 | 全部评估 | 按序号顺序 |
| 默认行为 | 拒绝入站,允许出站 | 允许所有 |
端口卫生
好习惯是为每种服务选择不同的非常规端口:
# 示例端口分配
Web 前端: 3010
后端服务 A: 3020
后端服务 B: 3021
PostgreSQL: 5432 (标准端口)
# 优点:
# 1. 明确服务清单
# 2. 防止意外暴露(如默认 80 端口的 Apache)
VPC Flow Logs
VPC Flow Logs 允许您监控 VPC 的网络流量,用于安全监控、性能评估和取证调查。
# 创建 Flow Logs
aws ec2 create-flow-logs \
--resource-type VPC \
--resource-ids vpc-xxx \
--traffic-type ALL \
--log-destination-type cloud-watch-logs \
--log-group-name /vpc/flow-logs
# 或发送到 S3
aws ec2 create-flow-logs \
--resource-type VPC \
--resource-ids vpc-xxx \
--traffic-type ALL \
--log-destination-type s3 \
--log-destination arn:aws:s3:::my-flow-logs-bucket
VPN 和 Direct Connect
Site-to-Site VPN
适用于快速部署、中小规模连接:
本地数据中心 <---> VPN 隧道 <---> AWS VPC
|
加密的 IPsec 连接
带宽上限约 1.25 Gbps
延迟较高(通过互联网)
AWS Direct Connect
适用于大型企业,需要稳定高带宽和低延迟:
本地数据中心 <---> Direct Connect <---> AWS VPC
|
专用物理连接
1 Gbps 或 10 Gbps
延迟低且稳定
选择建议
| 场景 | 推荐方案 |
|---|---|
| 快速启动、低成本 | Site-to-Site VPN |
| 高带宽、低延迟 | Direct Connect |
| 高可用混合架构 | Direct Connect + VPN 备份 |
VPC 端点
Gateway 端点 (免费)
用于 S3 和 DynamoDB:
aws ec2 create-vpc-endpoint \
--vpc-id vpc-xxx \
--service-name com.amazonaws.ap-southeast-2.s3 \
--route-table-ids rtb-xxx
Interface 端点 (PrivateLink,收费)
用于其他 AWS 服务,在子网中创建 ENI:
aws ec2 create-vpc-endpoint \
--vpc-id vpc-xxx \
--vpc-endpoint-type Interface \
--service-name com.amazonaws.ap-southeast-2.ec2 \
--subnet-ids subnet-xxx
IPv6 支持
VPC 支持 IPv6,但有一些注意事项:
- AWS 分配 IPv6 CIDR 块,不能使用自己的
- 使用 Egress-Only Internet Gateway 实现仅出站的 IPv6 流量
- 安全组和路由表需要为 IPv4 和 IPv6 分别配置
# 为 VPC 分配 IPv6 CIDR
aws ec2 associate-vpc-cidr-block \
--vpc-id vpc-xxx \
--amazon-provided-ipv6-cidr-block
⚠️ 常见陷阱
1. CIDR 冲突
# ❌ 错误:与本地网络或其他 VPC 重叠
VPC A: 10.0.0.0/16
VPC B: 10.0.0.0/16 # 无法对等连接!
本地网络: 10.0.0.0/8 # 冲突!
# ✅ 正确:规划不重叠的 CIDR
VPC A: 10.0.0.0/16
VPC B: 10.1.0.0/16
VPC C: 10.2.0.0/16
2. VPC Peering 数据传输费用
VPC 对等连接的数据传输费用可能很高!某些工作负载可能导致成本过高。
3. 安全组绑定到 VPC
安全组绑定到特定 VPC。如果在多个 VPC 中使用基础设施,确保配置/部署工具考虑到这一点。
4. RDS 需要子网组
新建 RDS 实例需要至少两个跨 AZ 的子网。如果使用自定义 VPC,确保提前创建子网组。
5. 删除默认 VPC
如果删除了默认 VPC,可以通过 CLI 或控制台重新创建:
aws ec2 create-default-vpc
6. VPN 凭证泄露
如果 VPN 凭证丢失或泄露,必须删除并重建 VPN 端点。无法仅更换凭证。
7. NAT Gateway 费用
托管 NAT Gateway 很方便,但按 GB 收费。如果传输大量数据(TB 级别),考虑:
- 使用自建 NAT 实例
- 使用 VPC 端点直接访问 AWS 服务(如 S3)
# 创建 S3 端点,避免 NAT Gateway 费用
aws ec2 create-vpc-endpoint \
--vpc-id vpc-xxx \
--service-name com.amazonaws.ap-southeast-2.s3 \
--route-table-ids rtb-xxx
💡 最佳实践
1. 使用多个 AZ
# 至少跨 2-3 个可用区部署
availability_zones:
- ap-southeast-2a
- ap-southeast-2b
- ap-southeast-2c
2. 私有子网优先
- 数据库、应用服务器放在私有子网
- 只有 ALB、NAT Gateway、Bastion Host 放在公有子网
3. 最小权限安全组
# ❌ 不要这样做
0.0.0.0/0 -> 所有端口
# ✅ 应该这样做
10.0.0.0/16 -> 端口 443
sg-alb-xxx -> 端口 8080
4. 使用 VPC 端点
为 S3、DynamoDB 等服务创建 VPC 端点,既安全又省钱。
5. 规划 CIDR
VPC 创建后 CIDR 不能修改(只能添加)。建议使用 /16 网段,为未来扩展预留空间。
6. Bastion Host
通过 VPN 或 Bastion Host 访问私有资源,不要直接暴露服务:
互联网 → VPN/Bastion → 私有子网服务
📚 本章小结
- VPC 是 AWS 网络的基础,每个 AWS 用户都需要基本了解
- 合理规划子网 CIDR,避免与其他网络冲突
- 安全组(有状态)和 NACL(无状态)配合使用
- 多可用区设计是高可用的关键
- 使用 VPC 端点减少 NAT Gateway 费用
- 启用 VPC Flow Logs 进行安全监控和故障排查