🕸️ 第六章 Web与云计算的关系
📄 一句话概括

VPC 把【隔开一台机器】升级成【隔开一整张网】;而一个子网是公有还是私有,只在路由表里那一行。

📝 本节和前面几节的关系

上一节说私有云要独占机器。但在公有云上,也有一块【属于你的网】——这就是 VPC。教材 6-4 的并列关键词只有【VPC】,但它是理解云上安全的第一块砖。

一、VPC 是什么

VPC(虚拟私有云):在公有云上,用软件划出来的一块逻辑上独占的网。

注意【逻辑上】三个字。 底下的物理机器还是厂商的、还是与别人共用的——但在这张网里,从外面看进来,它就是你自己的一整张内网。

VPC 里的六个关键词:

默认是隔离的,连通要自己开。 这句话是整个 VPC 设计的前提——新建一个 VPC,外面进不来;想让什么通,自己加一条规则。 这和自己机房那种【一张大网谁都看得见谁】是完全相反的设计。

二、公有子网与私有子网:差别只在路由表

这是 VPC 里最常被误解的一点。

【公有】和【私有】不是子网的属性,是路由表的属性。 同一个子网,把 0.0.0.0/0 → 互联网网关 那条路由删掉,它立刻就变成私有;加回去,它又变回公有。子网的名字不起任何作用。

一台机器要能被公网访问,三件事缺一不可:

  1. 它所在子网的路由表里,有 0.0.0.0/0 → 互联网网关 这一行
  2. 它自己有一个公网 IP
  3. 它的安全组放行了对应的端口

反过来也成立:把数据库放进私有子网、不给公网 IP——外面就是摸不到它。 这是云上保住数据库最常用的一招。

三、CIDR:网段怎么写、能装多少地址

VPC 和子网都用 CIDR 表示,斜杠后面的数字表示【前多少位是网络号】:

但云厂商每个子网还要预留 5 个地址(网络号、网关、DNS、广播等),所以 /20 子网实际可用 4096 − 5 = 4091 个。

这个【扣 5 个】的细节很重要:给子网划得太小,比如 /28(16 个地址),扣掉 5 个只剩 11 个可用——一台上数据库、一台跑应用、一台做跳板机,就快满了。

四、安全组与网络 ACL:两层闸门

都是【防火墙】,但挂的位置和脾气不一样:

日常主要用安全组,网络 ACL 当子网级的兜底。 为什么要有两层?因为纵深防御——万一某台机器起的时候忘了挂安全组,子网那一层的 ACL 还能拦一道。

安全组的【有状态】是最省事的一点:你写一条【允许 443 进来】,回程流量不用再写规则,自动就通了。这一点和传统防火墙不一样,很多新手会在这里多写一条没用的规则。

五、VPC 和私有云,别搞混

这两个词很像,但说的是两件事:

所以 VPC 不是私有云。 它是一个在公有云上【把网隔开】的工具——隔开的是网络,不是硬件。

顺序上,通常是先选公有云还是私有云(6-3),再在公有云上划 VPC(6-4)。 这个层次关系搞清楚了,云的架构图就看得懂了。

六、动手 Demo:VPC 到底隔开了什么

把网段的算法自己跑一遍,再看一句话——一个子网的公有与私有,只在路由表里那一行。

total = 2 ** (32 - 16)
sub = 2 ** (32 - 20)
print("  10.0.0.0/16 -> 2^(32-16) = %d 个地址" % total)
print("  切成 /20     -> 2^(32-20) = %d 个地址" % sub)
print("  最多切 %d 个 /20" % (total // sub))
print("  每个 /20 实际可用 = %d - 5 = %d 个" % (sub, sub - 5))
print()
print("  公有还是私有,就看路由表里有没有这一行:")
print("    0.0.0.0/0 -> 互联网网关")
print("  有 = 公有子网;没有 = 私有子网。名字不算数。")

实跑输出:

--------------------------------------------------------------------
VPC 里的六个词
--------------------------------------------------------------------

  词            一句话
  --------------------------------------------------------
  VPC           你在云上的一块私有网,网段自己定
  子网          从 VPC 里切出来的一段,绑一个可用区
  公有子网      路由表里有 0.0.0.0/0 → 互联网网关
  私有子网      路由表里没有通往互联网的路由
  安全组        挂在机器上,只写允许,有状态
  网络 ACL      挂在子网上,可写允许与拒绝,无状态

  记住一句话:公有还是私有,不是子网的属性,是【路由表】的属性。
  同一个子网,把 0.0.0.0/0 → 互联网网关 那条路由删掉,它立刻就变私有。

  一个 /16 的网段能装多少地址:

    10.0.0.0/16 → 2^(32-16) = 2^16 = 65536 个地址

  切成 4 个 /20 的子网,每个:
    2^(32-20) = 2^12 = 4096 个地址

  但云厂商每个子网要预留 5 个地址(网络号、网关、DNS 等):
    4096 - 5 = 4091 个可用

    65536 ÷ 4096 = 16——一个 /16 最多切 16 个 /20。

  一台机器什么时候能被公网访问?三件事缺一不可:

    ① 它所在子网的路由表里,有 0.0.0.0/0 → 互联网网关
    ② 它自己有一个公网 IP
    ③ 它的安全组放行了对应的端口

  反过来说:把数据库放进私有子网、不给公网 IP——外面就是摸不到它。

  对比项        安全组                网络 ACL
  ------------------------------------------------------------
  挂在哪        机器上(网卡)        子网上
  规则类型      只有允许,没有拒绝    允许和拒绝都能写
  有没有状态    有,回包自动放行      无,回包要单独写
  匹配方式      全部规则都看一遍      按编号从小到大

看第三行:一个 /16 能切 16 个 /20。规划网段的时候,先算这一步,能避免后面【子网不够用、又要重建】的麻烦——在云上,网段一旦定下来,改起来很贵。 看第四行:每个子网要扣掉 5 个地址。小网段(/28、/29)扣完之后所剩无几,这是新手最容易踩的坑。 看最后三行:公有私有取决于路由表,不取决于名字。记住这句,任何 VPC 的问题都能从【看路由表】开始查——这也是排障时最有效的一步。

30 秒实验

  1. 打开云厂商控制台(或者找一张它的架构图),看 VPC 和子网画在哪一层。
  2. 看它的安全组默认规则——默认是不是【拒绝一切入站】。
  3. 自己算一下:10.0.0.0/24 能装多少个地址?扣掉预留的 5 个还剩多少?

常见误区

  1. 错误:VPC 就是私有云。——纠正:不是。 VPC 是公有云里逻辑隔离的一段网,物理机器还是厂商的、还是与别人共用。它隔开的是网络,不是硬件。
  2. 错误:把机器放进私有子网,它就安全了。——纠正:私有子网只是第一步。 安全组、IAM 权限、磁盘加密、系统补丁,一个都不能少。私有子网解决的是【外面连不上】,不是【里面就安全】。
  3. 错误:安全组和网络 ACL 功能重复,配一个就行。——纠正:它们挂的位置不同(机器 vs 子网),规则特性也不同(有状态 vs 无状态)。日常主要用安全组,ACL 当子网级的兜底,这就是纵深防御。
自测三问(点开对答案) 1. 一个子网是公有还是私有,由什么决定? —— **路由表。** 有 `0.0.0.0/0 → 互联网网关` 的是公有子网,没有的是私有子网。**子网的名字不起任何作用。** 2. 安全组和网络 ACL 最大的两个差别是什么? —— ① **挂在哪**——安全组挂机器、网络 ACL 挂子网;② **有没有状态**——安全组有状态(回包自动放行),网络 ACL 无状态(回包要单独写)。另外安全组只有允许规则,网络 ACL 允许和拒绝都能写。 3. 10.0.0.0/16 切成 /20,能切几个?每个多少个地址? —— 2^(32−16) = 65536,2^(32−20) = 4096,**65536 ÷ 4096 = 16 个**。注意每个子网云厂商还要预留 5 个地址,**实际可用 4091 个**。

相关笔记