3、虚拟私有云(VPC)实战:VPC规划、子网划分、路由表、NAT网关、安全组与ACL

说实话,VPC 是云上网络的基石。很多新手上来就开干,结果业务一上线就发现网络不通,或者 IP 不够用。我刚开始带团队时也踩过类似的坑,后来总结了一套方法论,今天跟你聊聊。

3.1 VPC 规划:别急着动手,先画张图

我个人习惯,在创建 VPC 之前,先在白板上画清楚拓扑。你要想清楚几个问题:

  • 业务规模:未来 3 年预计有多少台服务器?
  • 环境隔离:开发、测试、生产要不要分开?
  • 地域与可用区:要不要跨可用区容灾?

举个例子,我去年帮一家电商公司做架构。他们初期只有 20 台机器,我直接规划了一个 /16 的 VPC(65536 个 IP)。当时有人觉得浪费,结果半年后业务暴涨,幸好当初留了余量。

核心原则:VPC 的 CIDR 一旦创建就不能改。宁可大一点,别抠门。

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,私网子存放数据库,天然就隔离了。我在项目中遇到过有人把所有东西塞一个子网里,结果安全组规则写了一百多条,维护起来想哭。

小技巧:每个子网至少预留 5 个 IP,AWS 和阿里云都会占用前几个 IP 做网关和 DHCP。

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,然后发出去。回来的流量再转回来。

我建议你这样做:

  1. 在公网子网里创建一个 NAT 网关
  2. 分配一个弹性公网 IP 给它
  3. 在私网路由表里加一条 0.0.0.0/0 -> NAT 网关
避坑指南:我曾经在双可用区部署时,只在一个可用区建了 NAT 网关。结果那个可用区挂了,整个私网都上不了网。后来我改成每个可用区一个 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 段
实战经验:网络 ACL 的规则编号是 1-32766,按编号从小到大匹配。一旦匹配就执行,不再往下看。我习惯把常用规则放前面(编号 100、200),拒绝规则放后面(编号 32766)。

3.7 完整实战:搭建一个三层架构

好了,理论说完了,咱们动手搭一个典型的三层架构:

  1. 创建 VPC:CIDR 10.0.0.0/16
  2. 创建子网
    • 公网子网: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)
  3. 配置路由
    • 公网路由表:0.0.0.0/0 -> 互联网网关
    • 私网路由表:0.0.0.0/0 -> NAT 网关
  4. 创建 NAT 网关:放在公网子网,分配弹性 IP
  5. 配置安全组
    • Web 安全组:开放 80/443
    • App 安全组:只允许 Web 安全组访问
    • DB 安全组:只允许 App 安全组访问 3306
  6. 配置网络 ACL:拒绝来自非信任区域的 SSH 访问

这套架构我用了很多年,稳定可靠。你想想看,Web 层暴露在外,App 层和 DB 层躲在后面,即使 Web 被攻击,数据库也是安全的。

最后说一句:VPC 规划没有标准答案,但有一条铁律——最小权限原则。能不开的端口别开,能不暴露的服务别暴露。云上安全,从 VPC 开始。