6.11 云网络进阶——AWS VPC + 混合云 + 多云方案
预计阅读时间:13 分钟
📖 目录
学习目标
学完本章后,你将能够:
- 用 AWS CLI 创建 VPC、子网、路由表、IGW、NAT Gateway 等核心网络组件
- 对比 Site-to-Site VPN 与 Direct Connect 的带宽、延迟与成本,为混合云选型
- 用 Terraform 多 Provider 编排 AWS / Azure / GCP 多云网络互联
- 区分安全组与 NACL 的层级、状态性与规则评估顺序
- 用 Route 53 加权路由实现跨云 DNS 负载分发与故障转移
- 评估 Consul、Istio East-West Gateway 等跨云服务发现方案
前置知识
- 6.10:云网络基础 云网络基础——VPC、子网、安全组、NAT 网关等云网络核心概念
- 4.15:Terraform 入门 Terraform 入门——HCL 语法与云资源编排基础
- 4.14:运维故障案例集 运维故障案例集——网络链路类故障的排查思路
- 5.5:防火墙实战 防火墙实战——allow/deny 规则设计与顺序评估思维
一、AWS VPC 核心组件
VPC(Virtual Private Cloud)是 AWS 网络架构的基石。理解其核心组件是构建任何云上网络的前提。
1.1 子网(Subnet)
子网是 VPC 的 IP 地址分段,分为公有子网和私有子网:
- 公有子网:路由表关联 Internet Gateway(IGW),实例可直接访问互联网
- 私有子网:无 IGW 路由,实例仅能通过 NAT 访问外网,适合数据库、应用服务器等
# 使用 AWS CLI 创建 VPC
aws ec2 create-vpc --cidr-block 10.0.0.0/16 --tag-specifications \
'ResourceType=vpc,Tags=[{Key=Name,Value=prod-vpc}]'
# 创建公有子网
aws ec2 create-subnet --vpc-id vpc-0abc123 --cidr-block 10.0.1.0/24 \
--availability-zone ap-northeast-1a --tag-specifications \
'ResourceType=subnet,Tags=[{Key=Name,Value=public-subnet-1a}]'
# 创建私有子网
aws ec2 create-subnet --vpc-id vpc-0abc123 --cidr-block 10.0.2.0/24 \
--availability-zone ap-northeast-1a --tag-specifications \
'ResourceType=subnet,Tags=[{Key=Name,Value=private-subnet-1a}]'
1.2 路由表(Route Table)
路由表决定子网流量的走向。每个子网必须关联一个路由表:
# 创建路由表并关联子网
aws ec2 create-route-table --vpc-id vpc-0abc123
aws ec2 associate-route-table --route-table-id rtb-0def456 --subnet-id subnet-0abc123
# 添加到 IGW 的路由(公有子网)
aws ec2 create-route --route-table-id rtb-0def456 \
--destination-cidr-block 0.0.0.0/0 --gateway-id igw-0ghi789
1.3 NAT Gateway
NAT Gateway 允许私有子网中的实例访问互联网,同时阻止外部主动发起连接:
# 在公有子网创建 NAT Gateway
aws ec2 create-nat-gateway --subnet-id subnet-public-id \
--allocation-id eipalloc-0xxx --type public
1.4 Internet Gateway(IGW)
IGW 是 VPC 与互联网的连接点,水平扩展、高可用:
# 创建并附加 IGW
aws ec2 create-internet-gateway
aws ec2 attach-internet-gateway --internet-gateway-id igw-0ghi789 --vpc-id vpc-0abc123
1.5 VPC 组件关系图
| 组件 | 作用 | 关联对象 |
|---|---|---|
| 子网 | IP 地址分段 | VPC、路由表 |
| 路由表 | 流量转发规则 | 子网、路由条目 |
| IGW | 互联网出入 | VPC、公有子网路由 |
| NAT GW | 私有子网出站 | 公有子网、EIP |
| 安全组 | 实例级防火墙 | EC2 实例、ENI |
二、混合云网络——VPN 专线与 Direct Connect
混合云将本地数据中心与 AWS 云网络互联,核心方案包括 Site-to-Site VPN 和 Direct Connect。
2.1 Site-to-Site VPN
基于 IPSec 隧道的加密连接,适合快速部署:
# 创建虚拟私有网关(VGW)
aws ec2 create-vpn-gateway --type ipsec.1
# 创建 VPN 连接
aws ec2 create-vpn-connection --type ipsec.1 \
--customer-gateway-id cgw-0abc --vpn-gateway-id vgw-0def
# 下载 VPN 配置文件
aws ec2 get-vpn-connection-device-sample-configuration \
--vpn-connection-id vpn-0abc123 \
--vendor "Generic" \
--platform "Linux"
2.2 Direct Connect
专线连接提供稳定、低延迟的私有网络通道:
| 对比维度 | VPN | Direct Connect |
|---|---|---|
| 带宽 | 最高 1.25 Gbps | 1 / 10 / 100 / 400 Gbps |
| 延迟 | 受公网影响 | 稳定、可预测 |
| 安全性 | IPSec 加密 | 物理隔离(可叠加 VPN) |
| 部署时间 | 分钟级 | 数周 |
| 成本 | 低 | 高 |
2.3 Azure ExpressRoute 与 GCP Cloud Interconnect
三大云厂商的专线方案大同小异:
# Azure ExpressRoute 示例
az network express-route create --resource-group rg-prod \
--name prod-express-route --bandwidth 100 --peering-location "Amsterdam" \
--provider "Equinix" --sku-tier Standard
# GCP Cloud Interconnect 示例
gcloud compute interconnects attachments create partner-attach \
--region europe-west1 --router router-01 \
--cloud-router-config "hello=world"
三、多云网络互联——Terraform 多 Provider 方案
多云架构避免厂商锁定,Terraform 是实现多云基础设施编排的首选工具。
3.1 多 Provider 配置
# main.tf
terraform {
required_providers {
aws = {
source = "hashicorp/aws"
version = "~> 5.0"
}
azurerm = {
source = "hashicorp/azurerm"
version = "~> 3.0"
}
google = {
source = "hashicorp/google"
version = "~> 5.0"
}
}
}
provider "aws" {
region = "ap-northeast-1"
alias = "tokyo"
}
provider "azurerm" {
features {}
alias = "westeurope"
}
provider "google" {
project = "my-gcp-project"
region = "europe-west1"
alias = "europe"
}
3.2 跨云 VPC Peering 方案
# AWS VPC Peering(同区域/跨区域)
resource "aws_vpc_peering_connection" "cross_region" {
provider = aws.tokyo
vpc_id = aws_vpc.tokyo.id
peer_vpc_id = aws_vpc.london.id
peer_region = "eu-west-2"
auto_accept = false
tags = {
Name = "tokyo-london-peering"
}
}
# 跨云 VPN 隧道互联
resource "aws_vpn_connection" "to_azure" {
provider = aws.tokyo
vpn_gateway_id = aws_vpn_gateway.tokyo.id
customer_gateway_id = aws_customer_gateway.azure.id
type = "ipsec.1"
static_routes_only = true
}
resource "aws_vpn_connection_route" "azure_cidr" {
destination_cidr_block = "10.1.0.0/16"
vpn_connection_id = aws_vpn_connection.to_azure.id
}
3.3 多云网络拓扑设计
| 互联方式 | 适用场景 | 延迟 | 复杂度 |
|---|---|---|---|
| VPN Over Internet | 非关键业务、测试环境 | 中等 | 低 |
| 专线互联 | 生产核心链路 | 低 | 高 |
| SaaS 中间件 | API 级互联 | 高 | 中 |
| Service Mesh | 微服务跨云调用 | 低 | 高 |
四、云上安全组与 NACL 对比
AWS 提供两层网络防护机制,理解差异是架构设计的前提。
4.1 对比表
| 维度 | 安全组(SG) | 网络 ACL(NACL) |
|---|---|---|
| 层级 | 实例级 | 子网级 |
| 规则类型 | 仅允许规则(Allow) | 允许 + 拒绝规则 |
| 状态 | 有状态(自动允许回程) | 无状态(需双向配置) |
| 默认行为 | 默认拒绝所有入站 | 默认允许所有流量 |
| 规则评估 | 全部规则同时评估 | 按编号顺序依次评估 |
| 关联范围 | 多个实例 | 仅一个子网 |
4.2 配置示例
# 安全组 —— 只允许 SSH 和 HTTP 入站
aws ec2 authorize-security-group-ingress --group-id sg-0abc123 \
--protocol tcp --port 22 --cidr 0.0.0.0/0
aws ec2 authorize-security-group-ingress --group-id sg-0abc123 \
--protocol tcp --port 80 --cidr 0.0.0.0/0
# NACL —— 显式拒绝某 CIDR,放行其余
aws ec2 create-network-acl --vpc-id vpc-0abc123
aws ec2 create-network-acl-entry --network-acl-id acl-0def456 \
--rule-number 100 --protocol -1 --cidr-block 192.0.2.0/24 \
--rule-action deny --egress false
aws ec2 create-network-acl-entry --network-acl-id acl-0def456 \
--rule-number 200 --protocol -1 --cidr-block 0.0.0.0/0 \
--rule-action allow --egress false
AWS VPC 安全最佳实践
| 实践 | 说明 |
|---|---|
| 默认拒绝所有入站 | 安全组只添加 Allow 规则,不使用 Deny |
| 最小权限端口 | 仅开放必要端口(22/80/443),避免 0.0.0.0/0 全开 |
| 自引用安全组 | 安全组引用自身实现内部通信,无需维护 IP 列表 |
| NACL 辅助防护 | NACL 做子网级兜底(如阻止已知恶意 IP 段) |
| Flow Logs 审计 | 开启 VPC Flow Logs 记录所有网络流量 |
| Private Link | 访问 AWS 服务走 Private Link 而非公网 |
# 开启 VPC Flow Logs
aws ec2 create-flow-logs --resource-type VPC \
--resource-ids vpc-0abc123 \
--traffic-type ALL \
--log-destination-type cloud-watch-logs \
--log-group-name /vpc/flowlogs \
--deliver-logs-permission-arn arn:aws:iam::role/vpc-flowlogs-role
五、跨云 DNS 与服务发现
多云环境下,统一的 DNS 和服务发现机制是应用互通的关键。
5.1 各云厂商 DNS 服务
| 厂商 | DNS 服务 | 特点 |
|---|---|---|
| AWS | Route 53 | 支持加权/延迟/故障转移路由策略 |
| Azure | Azure DNS | 与 Azure Resource Manager 深度集成 |
| GCP | Cloud DNS | 全球 Anycast、低延迟 |
5.2 跨云 DNS 解析方案
# Route 53 权重路由 —— 同域名分流到多云
# main.tf
resource "aws_route53_record" "api" {
for_each = {
"aws" = aws_lb.app_alb.dns_name
"azure" = azurerm_lb.app_lb.fqdn
}
zone_id = aws_route53_zone.main.zone_id
name = "api.example.com"
type = "A"
weighted_routing_policy {
weight = each.key == "aws" ? 70 : 30
}
set_identifier = each.key
alias {
name = each.value
zone_id = each.key == "aws" ? aws_lb.app_alb.zone_id : ""
evaluate_target_health = true
}
}
5.3 服务发现工具对比
| 工具 | 适用场景 | 多云支持 |
|---|---|---|
| Consul | 传统微服务、VM 混合环境 | 原生支持 |
| Istio + East-West GW | Kubernetes 跨集群服务网格 | 支持 |
| AWS Cloud Map | AWS 原生服务发现 | 仅 AWS |
| CoreDNS | Kubernetes 集群内 DNS | 需额外插件 |
# Consul 跨数据中心配置示例
# /etc/consul/config.hcl
datacenter = "dc-tokyo"
primary_datacenter = "dc-tokyo"
# 跨 DC 发现
retry_join = [
"provider=aws tag_key=consul-server tag_value=dc-tokyo"
]
connect {
enabled = true
}
# DNS 回退配置
dns {
config {
service_conistency = "global"
}
}
多云架构成本优化策略
| 策略 | 说明 | 节省比例 |
|---|---|---|
| Reserved Instances | 预留 1-3 年实例 | 30-60% |
| Spot/Preemptible | 使用可抢占实例(无状态服务) | 60-90% |
| Right Sizing | 根据实际使用调整实例规格 | 20-40% |
| S3 Intelligent Tiering | 自动切换存储层级 | 30-50% |
| NAT Gateway 整合 | 减少 NAT Gateway 数量 | 30-50% |
| 跨区域流量优化 | 就近部署减少跨 AZ 流量 | 10-30% |
云网络架构设计原则
| 原则 | 说明 |
|---|---|
| 最小权限 | 安全组只开放必要端口,NACL 做兜底防护 |
| 高可用 | 多 AZ 部署,NAT Gateway 每 AZ 独立 |
| 成本优化 | 使用 VPC Endpoint 替代 NAT Gateway 访问 AWS 服务 |
| 可审计 | 开启 VPC Flow Logs,记录所有网络流量 |
| 隔离性 | 不同环境使用不同 VPC 或子网段 |
云网络故障排查命令速查
# AWS VPC 连通性排查
# 1. 检查安全组规则
aws ec2 describe-security-groups --group-ids sg-0abc123 --query 'SecurityGroups[*].IpPermissions'
# 2. 检查 NACL 规则
aws ec2 describe-network-acls --filters Name=vpc-id,Values=vpc-0abc123
# 3. 检查路由表
aws ec2 describe-route-tables --filters Name=vpc-id,Values=vpc-0abc123
# 4. 使用 Reachability Analyzer 验证路径
aws ec2 create-network-insights-path --source i-xxx --destination i-yyy --protocol TCP
aws ec2 start-network-insights-analysis --network-insights-path-id nip-xxx
# 5. 检查 VPC Flow Logs
aws logs filter-log-events --log-group-name /vpc/flowlogs --filter-pattern "REJECT"
常见错误
- NACL 规则顺序导致拒绝失效:NACL 按编号从小到大评估,若允许规则编号小于拒绝规则,拒绝规则永远不会生效。务必确保拒绝规则编号更小。
- VPN 隧道频繁断开:IPSec VPN 受公网质量影响,抖动或丢包会导致隧道重连。检查本地防火墙是否放行 UDP 500/4500 端口,确认双方 IKE/IPSec 参数完全匹配。
- 私有子网实例无法访问互联网:常见原因是 NAT Gateway 所在子网缺少到 IGW 的路由,或实例的路由表未指向 NAT Gateway。逐一检查路由表条目和安全组出站规则。
- VPC Peering 路由未配置:Peering 连接建立后仍需在双方路由表中添加对方 CIDR 的路由条目,否则流量无法互通。这是新手最常遗漏的步骤。
- Direct Connect 路由泄漏:BGP 会话中断后路由可能未及时收回,导致流量黑洞。启用 BFD(Bidirectional Forwarding Detection)可加速故障检测。
最佳实践
- 每个可用区部署独立 NAT Gateway:避免跨 AZ 流量产生额外费用,同时消除单点故障。使用 Terraform 模块批量部署,保持配置一致。
- 安全组遵循最小权限原则:仅开放必要的端口和协议,避免
0.0.0.0/0宽松规则。利用安全组引用自身实现自引用,简化内部通信配置。 - 使用 Terraform Workspace 或 Backend 管理多环境:为 dev/staging/prod 创建独立状态文件,避免误操作覆盖其他环境配置。配合远程 State Backend(如 S3 + DynamoDB)实现团队协作锁定。
- VPN 连接启用加密和日志:配置 CloudWatch Logs 监控隧道状态,设置告警在隧道 DOWN 时及时通知。生产环境建议配置双隧道冗余。
- DNS 服务使用健康检查和故障转移:Route 53 配置健康检查,当主端点不可用时自动将流量切换到备用端点,实现跨云高可用。
故障排查案例:VPC Peering 路由配置后仍不通
现象:两个 VPC 之间已建立 Peering 连接(active 状态),但从 VPC-A 的实例 ping VPC-B 的实例超时。
排查:检查 VPC-A 的路由表,确认有到 VPC-B CIDR(10.1.0.0/16)的路由指向 Peering 连接;检查 VPC-B 的路由表,发现缺少到 VPC-A CIDR(10.0.0.0/16)的路由条目。
根因:VPC Peering 是双向路由,必须在双方路由表中都添加对方 CIDR 的路由。新手常只在一侧配置路由,导致流量只能单向通过。
修复:① 在 VPC-B 的路由表中添加目标 10.0.0.0/16 → Peering 连接 ID 的路由条目;② 检查双方安全组是否放行了 ICMP 和业务端口;③ 使用 VPC Reachability Analyzer 验证端到端可达性。
# 验证双方路由表
aws ec2 describe-route-tables --filters "Name=vpc-id,Values=vpc-a-id" \
--query 'RouteTables[*].Routes[?DestinationCidrBlock==`10.1.0.0/16`]'
# VPC Reachability Analyzer(验证路径)
aws ec2 create-network-insights-path --source vpc-a-instance-id \
--destination vpc-b-instance-id --protocol TCP --destination-port 22
aws ec2 start-network-insights-analysis --network-insights-path-id
# 检查安全组入站规则
aws ec2 describe-security-groups --group-ids sg-0abc123 \
--query 'SecurityGroups[*].IpPermissions'
云上 NAT 成本优化
| 方案 | 月成本(估算) | 适用场景 |
|---|---|---|
| 每个 AZ 独立 NAT Gateway | $32 × AZ数 + 数据费 | 生产环境高可用 |
| 共享单 NAT Gateway | $32 + 数据费 | 开发/测试环境 |
| NAT 实例(EC2 替代) | 实例费 + 数据费 | 预算敏感、低流量 |
| VPC Endpoint(S3/DynamoDB) | 免费(同区域) | 访问 AWS 服务免 NAT |
# 使用 VPC Endpoint 替代 NAT Gateway 访问 S3(免费)
aws ec2 create-vpc-endpoint --vpc-id vpc-0abc123 \
--service-name com.amazonaws.ap-northeast-1.s3 \
--route-table-ids rtb-0def456
# 验证 Endpoint 是否生效
aws ec2 describe-vpc-endpoints --filters "Name=vpc-id,Values=vpc-0abc123"
练习题
- 设计 VPC 架构:为一个三层 Web 应用(Web / App / DB)设计 VPC,包含公有子网和私有子网,配置 IGW、NAT Gateway、路由表和安全组,使用 AWS CLI 或 Terraform 实现。
- 搭建跨云 VPN:在 AWS 和 Azure 之间建立 Site-to-Site VPN 连接,配置路由和安全组规则,验证两端虚拟机可以互相 ping 通。
- 多云 DNS 负载均衡:使用 Terraform 在 Route 53 配置加权路由策略,将
api.example.com的流量按 70/30 比例分发到 AWS ALB 和 Azure LB,并验证解析结果。
学习检查点
学完本章后,请检验自己是否掌握以下内容:
| 检查项 | 自测问题 | 验证方法 |
|---|---|---|
| 概念理解 | 能用自己的话解释云网络的 SDN 和 Overlay 网络原理 | 尝试向他人讲解 |
| 命令操作 | 能不查文档完成云网络的 VPC peering 和负载均衡配置 | 在终端实际执行 |
| 原理掌握 | 能说出云网络的流量工程和 QoS 保障原理 | 画出流程图 |
| 故障排查 | 能独立排查跨 VPC 通信失败或网络延迟高的问题 | 模拟故障并修复 |
| 最佳实践 | 能说明为什么需要设计合理的云网络 CIDR 规划 | 对比不同方案 |
本章总结
AWS 云网络由子网、路由表、IGW 与 NAT Gateway 等虚拟组件构成,它们通过路由规则协同决定流量的走向;混合云与多云场景则需在 VPN、Direct Connect 和跨云互联之间权衡带宽、延迟与成本。安全组与 NACL 分别提供实例级有状态和子网级无状态防护,配合 Route 53 加权路由与 Consul 等服务发现工具,可构建跨云高可用的网络架构。