深色模式
VPC 与子网规划
摘要:VPC 是云上的私有网络边界,网段一旦定下就很难改。本文给出一套可直接套用的网段规划方法、公有/私有子网划分原则和跨可用区高可用拓扑,并附上互通性验证命令。
适用环境
bash
# 一台位于目标 VPC 内的 Linux 云服务器
ip addr show | grep -E "inet |^[0-9]"
ip route
which mtr traceroute ping1
2
3
4
2
3
4
操作步骤
一、先定网段,留足扩展空间
原则:大网段 + 小子网,一次规划到位,避免后期无法扩容。
| 环境 | 推荐 VPC 网段 | 说明 |
|---|---|---|
| 生产 | 10.10.0.0/16 | 6.5 万个地址,足够多年扩展 |
| 预发 | 10.20.0.0/16 | 与生产不重叠,便于对等连接 |
| 测试 | 10.30.0.0/16 | 同上 |
| 开发 | 10.40.0.0/16 | 同上 |
注意
生产、预发、测试之间若将来要做对等连接(Peering)或专线打通,网段绝不能重叠,否则路由无法生效。这是规划阶段最容易忽略、后期最难修复的问题。
二、按「可用区 × 层级」划分子网
以生产 VPC 10.10.0.0/16 为例,两个可用区(AZ-A / AZ-B):
text
AZ-A:
公有子网 10.10.0.0/24 # 负载均衡、NAT 网关、堡垒机
应用子网 10.10.1.0/24 # App 层
数据子网 10.10.2.0/24 # 数据库、缓存
AZ-B:
公有子网 10.10.10.0/24
应用子网 10.10.11.0/24
数据子网 10.10.12.0/24
预留: 10.10.100.0/22 # 未来扩展1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
每个 /24 有 251 个可用地址(云厂商会预留前几个),足够一般业务使用。
三、创建 VPC 与子网
bash
# 创建 VPC
aws ec2 create-vpc --cidr-block 10.10.0.0/16 --tag-specifications \
'ResourceType=vpc,Tags=[{Key=Name,Value=prod-vpc},{Key=env,Value=prod}]'
# 创建子网(指定可用区)
aws ec2 create-subnet --vpc-id vpc-0abc --cidr-block 10.10.1.0/24 \
--availability-zone ap-east-1a
aws ec2 create-subnet --vpc-id vpc-0abc --cidr-block 10.10.11.0/24 \
--availability-zone ap-east-1b
# 创建并关联路由表(公有子网需要一条指向 Internet 网关的默认路由)
aws ec2 create-route-table --vpc-id vpc-0abc
aws ec2 create-internet-gateway
aws ec2 attach-internet-gateway --internet-gateway-id igw-0abc --vpc-id vpc-0abc
aws ec2 create-route --route-table-id rtb-0abc \
--destination-cidr-block 0.0.0.0/0 --gateway-id igw-0abc
aws ec2 associate-route-table --route-table-id rtb-0abc --subnet-id subnet-0abc1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
四、私有子网如何出网
应用子网里的机器需要下载软件源,但不应该被公网直接访问,用 NAT 网关:
bash
# 1) 在公有子网申请弹性公网 IP 并创建 NAT 网关
aws ec2 allocate-address --domain vpc
aws ec2 create-nat-gateway --subnet-id subnet-public --allocation-id eipalloc-0abc
# 2) 私有子网路由表加一条默认路由指向 NAT 网关
aws ec2 create-route --route-table-id rtb-private \
--destination-cidr-block 0.0.0.0/0 --nat-gateway-id nat-0abc1
2
3
4
5
6
2
3
4
5
6
五、验证网络连通性
bash
# 1) 本机 IP 与网卡
ip addr show | grep inet
# 2) 同子网互通(应该直连,无 NAT)
ping -c 3 10.10.1.21
# 3) 跨可用区互通
ping -c 3 10.10.11.20
# 4) 到公网出网
curl -sS -o /dev/null -w "%{http_code}\n" https://example.com
# 5) 逐跳看在哪里断
traceroute -n 10.10.11.20
mtr -r -c 10 10.10.11.20
# 6) 确认路由表生效
ip route | grep default1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
验证
- [ ] 每台机器的 IP 落在预期子网内,且与安全组、路由表对应
- [ ] 私有子网的机器能访问公网(走 NAT),但公网无法直连进来
- [ ] 跨可用区两两互通,延迟在预期范围
- [ ] 生产/预发/测试 VPC 网段无重叠,已用文档记录
常见坑
- 网段拍得太小:一开始给
/24的 VPC,业务起来后子网不够分,只能新建 VPC 迁移,代价极高。 - 环境间网段重叠:等到要做对等连接时才发现冲突,只能整体改网段。
- 子网跨可用区:子网是可用区级概念,跨 AZ 的子网无法保证高可用,务必一个 AZ 一个子网。
- 忘了给子网预留地址:云厂商每个子网会扣掉 5 个地址,规划容量时要算进去。
- 把数据库放公有子网:一旦路由表配错就会直接暴露在公网,务必放私有子网并由安全组限制来源。