第273篇:虚拟网络:VPC、子网、安全组、ACL

关键词:VPC、子网、安全组、ACL、网络隔离、云网络、多租户


一、引言

在云计算环境中,虚拟私有云(VPC, Virtual Private Cloud)是云网络的核心抽象概念。VPC为每个租户提供了一个逻辑隔离的网络环境,租户可以在其中自主规划子网、配置路由、设置安全策略,仿佛拥有一台专属的物理路由器。

理解VPC、子网、安全组和ACL这四个核心概念及其相互关系,是使用和管理云网络的基础。

二、核心概念

2.1 VPC(Virtual Private Cloud)

VPC是云平台为租户提供的隔离网络空间:

VPC的核心特性:

特性 说明
网络隔离 不同VPC之间默认完全隔离
CIDR规划 租户自主选择IP地址段
路由可控 自定义路由表和路由策略
边界网关 通过NAT网关/弹性IP连接公网
对等连接 VPC之间可通过对等连接互通

2.2 子网(Subnet)

子网是VPC内的逻辑子划分:

子网的关键属性:

属性 说明
CIDR 子网的IP地址范围,必须是VPC CIDR的子集
可用区 子网绑定到特定可用区(AZ)
网关 子网网关(默认路由下一跳)
DHCP选项 DNS、NTP等选项集
路由表 关联的路由表

子网(Subnet) - 图示

2.3 安全组(Security Group)

安全组是绑定到实例(VM)的虚拟防火墙:

安全组的特点: - 状态型防火墙:允许响应流量自动回传 - 实例级别:绑定到单个VM的网卡 - 默认拒绝:默认规则为拒绝所有入站和出站流量 - 白名单机制:只允许明确放行的流量

2.4 ACL(Access Control List)

ACL是子网级别的访问控制列表:

ACL与安全组的区别:

特性 安全组 ACL
作用范围 实例(VM)级别 子网级别
状态检测 有(状态型) 无(无状态)
默认规则 拒绝所有 允许所有
规则方向 入站+出站 入站+出站
规则数量 较多(每实例) 较少(每子网)
应用场景 细粒度实例保护 子网粗粒度控制

三、技术细节

3.1 VPC 路由表

路由表类型:

类型 说明
主路由表 VPC创建时自动生成,关联默认子网
自定义路由表 用户手动创建,可关联到指定子网

路由条目优先级:

优先级 路由类型 说明
系统路由 本地路由、公网路由 不可修改
用户路由 自定义静态路由 用户配置
动态路由 VPC对等连接、专线 自动生成

3.2 安全组规则

安全组规则格式:

字段 说明 示例
方向 入站(Inbound)/出站(Outbound) Inbound
协议 TCP/UDP/ICMP/ALL TCP
端口范围 端口或端口范围 22, 80, 443, 8000-9000
源/目的 IP/CIDR/安全组 0.0.0.0/0, sg-xxx
策略 允许(Allow)/拒绝(Deny) Allow

常用安全组规则模板:

场景 规则
Web服务器 入站: TCP 80,443 源0.0.0.0/0
SSH管理 入站: TCP 22 源管理IP
数据库 入站: TCP 3306 源应用安全组
全放行(测试) 入站: ALL 源0.0.0.0/0

3.3 ACL 规则

ACL规则格式:

字段 说明 示例
规则编号 规则优先级(越小越优先) 100, 200, 300
方向 入站/出站 入站
策略 允许/拒绝 允许
协议 TCP/UDP/ICMP/ALL TCP
端口 目的端口 80
源/目的 IP/CIDR 10.0.1.0/24

3.4 VPC 对等连接与专线接入

VPC对等连接(Peering Connection):

对等连接实现两个VPC之间的私有网络互连,无需经过公网:

VPC 对等连接与专线接入 - 图示

对等连接特性 说明
通信方式 私有网络, 不经过公网
延迟 极低(同区域<1ms)
带宽 与VPC内带宽一致
CIDR限制 两侧CIDR不能重叠
传递性 不支持(无传递性,A连B,B连C≠A连C)
跨区域 支持跨区域对等连接

VPC专线接入(Direct Connect):

专线类型 带宽 延迟 适用场景
专用通道 1Gbps~100Gbps 低 混合云, 大规模数据传输
虚拟接口 逻辑隔离 低 多租户专线复用
IPsec VPN 受限于公网 中 小规模远程接入

3.5 NAT 网关

NAT网关实现VPC内私有子网访问公网的能力:

NAT类型 说明 适用场景
SNAT(源NAT) 私有IP→公网IP映射 私有子网访问互联网
DNAT(目的NAT) 公网IP:端口→私有IP:端口映射 公网访问私有子网服务
SNAT+DNAT组合 双向NAT 完整的内外网互通

NAT网关配置示例:

# 1. 创建NAT网关
openstack nat gateway create --router vpc-router nat-gw-01

# 2. 添加SNAT规则(私有子网访问公网)
openstack nat rule create --type snat \
    --internal-ip 10.0.1.0/24 \
    --floating-ip-mode auto \
    nat-gw-01

# 3. 添加DNAT规则(公网访问内部服务)
openstack nat rule create --type dnat \
    --internal-ip 10.0.1.10 \
    --internal-port 80 \
    --protocol tcp \
    --floating-ip 1.2.3.4 \
    --floating-port 80 \
    nat-gw-01

3.6 VPC 路由策略深度解析

路由优先级与冲突处理:

路由类型 优先级 说明
本地路由 最高 VPC内子网间自动路由, 不可删除
对等连接路由 高 对等VPC的CIDR路由
静态路由 中 用户自定义路由
动态路由 中 OSPF/BGP学习到路由
默认路由 低 0.0.0.0/0, 匹配所有剩余流量

路由冲突排查方法:

# 1. 查看VPC路由表
openstack routing table list --vpc vpc-a

# 2. 检查路由重叠
# 如果VPC-A有10.0.0.0/16和10.0.1.0/24两条路由
# 长前缀(10.0.1.0/24)优先匹配

# 3. 检查对等连接路由
openstack network peer show peer-a-b
# 确认自动注入的路由条目

3.7 VPC 安全架构分层模型

VPC 安全架构分层模型 - 图示

四、实战配置/案例分析

4.1 华为云 VPC 配置示例

# 1. 创建VPC
openstack network create --provider-physical-network datacentre \
    --provider-network-type vxlan \
    vpc-tenant-a

# 2. 创建子网
openstack subnet create --network vpc-tenant-a \
    --subnet-range 192.168.0.0/24 \
    --gateway 192.168.0.1 \
    --dns-nameserver 100.125.1.250 \
    subnet-web

# 3. 创建安全组
openstack security group create --description "Web Server SG" web-sg

# 4. 添加安全组规则
openstack security group rule create --proto tcp \
    --dst-port 80 --remote-ip 0.0.0.0/0 web-sg
openstack security group rule create --proto tcp \
    --dst-port 443 --remote-ip 0.0.0.0/0 web-sg
openstack security group rule create --proto tcp \
    --dst-port 22 --remote-ip 10.0.0.0/8 web-sg

# 5. 创建ACL
openstack network acl create --name subnet-acl-01 subnet-acl

# 6. 添加ACL规则
openstack network acl rule create --direction ingress \
    --protocol tcp --port-min 80 --port-max 80 \
    --ethertype IPv4 --action allow --priority 100 \
    --remote-ip 0.0.0.0/0 subnet-acl-01

4.2 故障案例:安全组规则冲突导致SSH无法连接

现象:某租户反映新创建的ECS实例无法通过SSH连接,但安全组中已放行TCP 22端口。

排查过程:

# 1. 检查安全组规则
openstack security group rule list web-sg

# 发现两条规则:
# 规则1: priority=1, Allow TCP 22 from 10.0.0.0/8
# 规则2: priority=1, Deny TCP 22 from 0.0.0.0/0

# 两条规则优先级相同, Deny规则先匹配(0.0.0.0/0匹配所有IP)

# 2. 检查ACL
openstack network acl rule list
# 子网ACL有一条deny规则拦截了所有入站SSH

# 3. 排查VPC路由
openstack routing table list
# 路由正常

根因:安全组规则中同时存在Allow和Deny规则,且Deny规则的源地址范围更大(0.0.0.0/0),导致所有SSH连接被拒绝。

解决: 1. 删除Deny规则或调整规则优先级 2. 将Allow规则优先级设得比Deny规则更高 3. 建议使用"默认拒绝+显式允许"的安全组设计模式

4.3 故障案例:VPC对等连接路由缺失

现象:两个VPC已建立对等连接,但VPC-A中的VM无法访问VPC-B中的VM。

排查过程:

# 1. 检查对等连接状态
openstack network peer list
# 对等连接状态为Active

# 2. 检查路由表
openstack routing table list --vpc vpc-a
# VPC-A的路由表中没有到VPC-B的路由条目

# 3. 手动添加路由
openstack routing table route create --vpc vpc-a \
    --destination 172.16.0.0/16 \
    --nexthop peer-link-id \
    route-to-vpc-b

根因:VPC对等连接创建后,需要在两侧VPC的路由表中手动添加对端CIDR的路由条目(某些云平台自动添加,但本环境为手动模式)。

解决: 1. 在VPC-A的路由表中添加指向VPC-B CIDR的路由 2. 在VPC-B的路由表中添加指向VPC-A CIDR的路由 3. 确认两侧安全组已放行对端网段的流量

五、总结

组件 作用层级 隔离粒度 默认策略
VPC 租户级 租户间隔离 默认隔离
子网 VPC内 可用区级 子网内互通
安全组 实例级 实例级 默认拒绝
ACL 子网级 子网级 默认允许
对等连接 VPC间 VPC间私有互通 需手动配置路由
NAT网关 VPC边界 内外网隔离 按需配置
最佳实践 说明
最小权限原则 安全组只开放必要的端口
分层防御 VPC→子网ACL→安全组多层防护
管理IP白名单 SSH/RDP仅允许管理IP访问
定期审计 定期检查安全组规则
CIDR规划 VPC间CIDR不重叠, 预留扩展空间
路由审计 定期核查路由表, 避免路由冲突

思考

  1. 安全组是状态型防火墙而ACL是无状态的,这在实际应用中有什么区别?
  2. 如果VPC的CIDR地址段与本地网络的地址段重叠,会导致什么问题?如何解决?
  3. 安全组默认拒绝所有,ACL默认允许所有,这种设计思路的利弊是什么?
  4. VPC对等连接不具有传递性,如果需要三个VPC互相通信,需要建立几条对等连接?
  5. NAT网关的SNAT和DNAT在VPC安全架构中各自承担什么角色?为什么不建议直接将实例暴露在公网?

下篇预告:第274篇:Overlay 网络中隧道终结与网关