8.7 VPC、子网、安全组
一句话
VPC 是你的逻辑数据中心:CIDR 一旦定下几乎改不了,子网决定 “能放下多少机器/IP”,安全组决定 “谁能进”,NACL 只做子网级粗筛;三者叠加才是真正的暴露面,而暴露面由最小的那一层决定。
先定 CIDR:这一步错了,后面全是补丁
| 决策 | 建议 | 代价 |
|---|---|---|
| 地址段 | 从 10.0.0.0/8 里切,一个环境一块(如 prod /16、staging /16) | 一旦与办公网/其他 VPC 重叠,对等连接直接不可用 |
| 预留增长 | 至少留 4 倍余量(/16 有 65k 地址,够撑很久) | 太小要重建 VPC = 迁移全部资源 |
| 跨环境隔离 | prod / staging / dev 用不同网段 | 共网段会导致 “测试连到生产” |
| 混合云 | 与 IDC 网段规划一起做 | 后期改 IDC 网段成本更高 |
现实中最贵的错误:VPC 用了 192.168.0.0/16,与公司办公网撞车,导致 VPN/专线永远连不通,只能全量重建。
子网:按 AZ 切,按用途分
| 类型 | 放什么 | 路由 | 说明 |
|---|---|---|---|
| 公有子网 | 负载均衡、NAT 网关、跳板机 | 0.0.0.0/0 → IGW | 直接有公网路径 |
| 私有子网 | 应用、数据库、缓存 | 0.0.0.0/0 → NAT GW(或不通) | 只能出、不能进 |
| 隔离子网 | 数据库(严格场景) | 无默认路由 | 只允许同 VPC 内访问 |
两条容量纪律:
- 每个可用区至少一个子网,否则跨 AZ 高可用无从谈起(见 5.3 地域与可用区)。
- 单子网可用 IP 数 = 2^(32−掩码) − 保留地址(AWS 每个子网保留 5 个)。
/28只有 11 个可用 IP,跑几个 Pod 就耗尽——K8s 节点池的子网至少/24。
安全组 vs NACL:一个有状态,一个无状态
| 维度 | 安全组(SG) | 网络 ACL |
|---|---|---|
| 作用对象 | 实例/ENI | 子网 |
| 状态 | 有状态(回包自动放行) | 无状态(回包要显式放行) |
| 规则 | 只支持允许 | 允许 + 拒绝 |
| 评估 | 全部规则合并 | 按序号,命中即停 |
| 典型用途 | 精细的最小暴露 | 子网级粗筛(如整体封禁某段) |
用安全组做精细控制,用 NACL 做兜底,反过来会很痛苦:NACL 无状态,一旦忘记放行高位端口回包,就会出现 “单向通” 的诡异现象。
分层放行:引用安全组,而不是 CIDR
Internet → LB(443) → app(8080, 仅来自 LB 的 SG) → db(5432, 仅来自 app 的 SG)
| 写法 | 好处 | 坏处 |
|---|---|---|
sg-app 允许来自 sg-lb 的 8080 | 机器扩容自动生效,不写死 IP | 需要标签/命名规范 |
sg-app 允许来自 10.0.1.0/24 的 8080 | 直观 | 子网一变就失效,且范围过大 |
sg-db 允许 0.0.0.0/0:5432 | “先跑通” | 数据库直接暴露公网,最常见的入侵入口 |
入口层的四层/七层选型(LB 放在哪、是否终结 TLS)见 8.9 四层与七层负载均衡。
连通性排查顺序
| 现象 | 查什么 | 命令/位置 |
|---|---|---|
| 同 VPC 不同子网不通 | 路由表是否有本地路由、NACL 是否拦截 | 子网关联的路由表 / NACL 规则 |
| 出公网不通 | 私有子网是否有 NAT 路由、NAT GW 是否在可用 AZ | 路由表 0.0.0.0/0 指向 |
| 入站不通 | 安全组入站规则、目标端口是否监听 | ss -lntp、SG inbound |
| 跨 VPC 不通 | 对等连接是否建立、两边路由是否回指、CIDR 是否重叠 | Peering 状态 + 双向路由 |
| 偶发超时 | 安全组规则数量过多(部分实现按包匹配)、连接跟踪表满 | SG 数量、conntrack(见 8.8 NAT 与端口映射) |
反模式
| 反模式 | 后果 |
|---|---|
| VPC CIDR 与办公网/IDC 重叠 | 专线、VPN、对等连接全部不可用,只能重建 |
| 所有资源放公有子网 | 每台机器都需要公网 IP,暴露面放大且成本更高 |
数据库安全组开 0.0.0.0/0 | 被扫描后直接爆破,最常见的数据泄露路径 |
| 用 NACL 做精细规则 | 无状态导致回包被拦,排障成本极高 |
子网用 /28 | IP 耗尽,扩容时才发现 |
| 网状 VPC 对等(N² 连接) | 连接数爆炸、路由难维护;应改 hub-spoke 或中转网关 |
| 安全组按 CIDR 写死应用地址 | 扩容/换网段即失效,最终没人敢改 |
三条铁律
🔑 CIDR 先规划再创建;重叠的 VPC 无法 “改一下”,只能重建。
🔑 私有子网 + NAT 出网是默认形态;给业务机器公网 IP 是例外,不是常态。
🔑 安全组引用安全组,把 “谁能访问我” 表达成服务关系,而不是 IP 段。
自检
Q1 新 VPC 与办公网都是 192.168.0.0/16,会有什么后果?
▸ 答案:私有地址冲突:同一条 VPN/专线上,两个相同网段的路由无法区分,对等连接也无法建立(云厂商直接拒绝重叠 CIDR 的 peering)。后果是 “办公网访问不了云上资源”,且无法通过改路由解决,只能重建 VPC 或重建办公网。这就是 “CIDR 必须先规划” 的原因——它几乎是唯一不可逆的网络决策。
Q2 为什么说 “安全组有状态、NACL 无状态” 会直接影响排障?
▸ 答案:安全组会自动放行已建立连接的回包,所以只需配 “入站 443” 就能双向通;NACL 不记状态,回程的高位端口必须显式放行,否则出现 “SYN 到了、回包被丢” 的单向不通。排障时如果只看 NACL 的入站规则,会漏掉出站临时端口——这是 “NACL 配了却不通” 的典型原因。
Q3 私有子网的机器要访问公网(拉镜像、调外部 API),需要什么?
▸ 答案:需要 NAT 网关 + 路由:私有子网路由表 0.0.0.0/0 指向 NAT GW,NAT GW 放在公有子网并绑定 EIP。两个坑:① NAT GW 是按可用区的,跨 AZ 部署的私有子网要各自有 NAT(否则单 AZ 故障就断网);② NAT 只允许出向,外部无法主动连入——需要入向就加 LB,不要给机器绑公网 IP。
Q4 安全组规则写成 “允许 10.0.0.0/8 访问 3306”,有什么问题?
▸ 答案:范围过大,等于整个内网(含所有环境、所有租户)都能连数据库;一旦某台测试机被攻陷,数据库就在射程内。正确写法是 “允许来自 sg-app 的 3306”,把范围收窄到 “服务关系” 而不是 “网段”。这也是零信任的起点:默认拒绝,按身份(SG/标签)放行。
Q5 两个 VPC 要互通,选择对等连接还是中转网关?
▸ 答案:少量且稳定(2–3 个)用对等连接,简单、低延迟、无额外费用;规模上去(>5 个 VPC 或需要与 IDC 互联)用 hub-spoke + 中转网关,否则 N² 的对等连接会让路由与安全策略无法维护。判断依据是 “连接数增长时,配置量是线性还是平方”,以及 “是否需要对流量做集中审计”。
关联
- 前置:8.8 NAT 与端口映射
- 并列:8.9 四层与七层负载均衡
- 下游:5.3 地域与可用区