3、虚拟私有云(VPC)实战:VPC规划、子网划分、路由表、NAT网关、安全组与ACL
说实话,VPC 是云上网络的基石。很多新手上来就开干,结果业务一上线就发现网络不通,或者 IP 不够用。我刚开始带团队时也踩过类似的坑,后来总结了一套方法论,今天跟你聊聊。
3.1 VPC 规划:别急着动手,先画张图
我个人习惯,在创建 VPC 之前,先在白板上画清楚拓扑。你要想清楚几个问题:
- 业务规模:未来 3 年预计有多少台服务器?
- 环境隔离:开发、测试、生产要不要分开?
- 地域与可用区:要不要跨可用区容灾?
举个例子,我去年帮一家电商公司做架构。他们初期只有 20 台机器,我直接规划了一个 /16 的 VPC(65536 个 IP)。当时有人觉得浪费,结果半年后业务暴涨,幸好当初留了余量。
3.2 子网划分:把大饼切成小块
VPC 建好了,接下来就是划分子网。子网说白了就是 VPC 里的小网络段。为什么要划?因为不同子网可以放不同角色。
我一般这样分:
| 子网名称 | CIDR 示例 | 用途 |
|---|---|---|
| public-subnet-1 | 10.0.1.0/24 | Web 服务器、负载均衡 |
| private-subnet-1 | 10.0.2.0/24 | 应用服务器、数据库 |
| data-subnet-1 | 10.0.3.0/24 | 缓存、消息队列 |
你想想看,公网子网放 Web,私网子存放数据库,天然就隔离了。我在项目中遇到过有人把所有东西塞一个子网里,结果安全组规则写了一百多条,维护起来想哭。
3.3 路由表:数据包的导航地图
子网划好了,但数据怎么走?这就靠路由表了。每个子网必须关联一张路由表,告诉流量「往哪去」。
典型的公网子网路由表长这样:
目标网段 下一跳
0.0.0.0/0 igw-xxxxx(互联网网关)
10.0.0.0/16 local
私网子网的路由表则不同:
目标网段 下一跳
10.0.0.0/16 local
0.0.0.0/0 nat-xxxxx(NAT 网关)
嗯,这里要注意:路由表是有优先级的。最精确匹配优先,如果两条路由都匹配,走更具体的那条。我曾经见过一个案例,有人配了 0.0.0.0/0 指向 NAT,又配了 10.0.0.0/8 指向对等连接,结果流量全乱了。
3.4 NAT 网关:让私网机器也能上网
私网子网里的机器没有公网 IP,但有时候需要访问外网(比如下载补丁、调用 API)。这时候就需要 NAT 网关。
NAT 网关的工作原理很简单:它把私网 IP 转换成自己的公网 IP,然后发出去。回来的流量再转回来。
我建议你这样做:
- 在公网子网里创建一个 NAT 网关
- 分配一个弹性公网 IP 给它
- 在私网路由表里加一条 0.0.0.0/0 -> NAT 网关
3.5 安全组:云上的第一道防火墙
安全组是实例级别的防火墙。说白了,它控制谁可以访问你的云服务器。
我常用的安全组规则:
| 方向 | 协议 | 端口 | 源/目标 | 说明 |
|---|---|---|---|---|
| 入站 | TCP | 22 | 0.0.0.0/0 | SSH 访问(生产环境建议限制 IP) |
| 入站 | TCP | 80, 443 | 0.0.0.0/0 | Web 服务 |
| 入站 | TCP | 3306 | 10.0.1.0/24 | 只允许 Web 子网访问数据库 |
| 出站 | ALL | ALL | 0.0.0.0/0 | 允许所有出站流量 |
安全组有个特点:默认拒绝所有入站,允许所有出站。你只需要配置「允许」的规则就行。而且安全组是有状态的——你允许了入站请求,回包自动放行,不用额外配出站规则。
3.6 网络 ACL:子网级别的访问控制
安全组是实例级别的,网络 ACL 是子网级别的。它俩配合使用,效果更好。
网络 ACL 是无状态的。什么意思?你配了入站规则允许 80 端口,出站规则也得配允许回包,否则流量回不来。
我一般这样用:
- 安全组:控制实例之间的细粒度访问
- 网络 ACL:做子网级别的粗粒度过滤,比如封禁某个 IP 段
3.7 完整实战:搭建一个三层架构
好了,理论说完了,咱们动手搭一个典型的三层架构:
- 创建 VPC:CIDR 10.0.0.0/16
- 创建子网:
- 公网子网:10.0.1.0/24(可用区 A)、10.0.2.0/24(可用区 B)
- 私网子网:10.0.3.0/24(可用区 A)、10.0.4.0/24(可用区 B)
- 数据子网:10.0.5.0/24(可用区 A)、10.0.6.0/24(可用区 B)
- 配置路由:
- 公网路由表:0.0.0.0/0 -> 互联网网关
- 私网路由表:0.0.0.0/0 -> NAT 网关
- 创建 NAT 网关:放在公网子网,分配弹性 IP
- 配置安全组:
- Web 安全组:开放 80/443
- App 安全组:只允许 Web 安全组访问
- DB 安全组:只允许 App 安全组访问 3306
- 配置网络 ACL:拒绝来自非信任区域的 SSH 访问
这套架构我用了很多年,稳定可靠。你想想看,Web 层暴露在外,App 层和 DB 层躲在后面,即使 Web 被攻击,数据库也是安全的。