第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等选项集 |
| 路由表 | 关联的路由表 |

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之间的私有网络互连,无需经过公网:

| 对等连接特性 | 说明 |
|---|---|
| 通信方式 | 私有网络, 不经过公网 |
| 延迟 | 极低(同区域<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 安全架构分层模型

四、实战配置/案例分析
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不重叠, 预留扩展空间 |
| 路由审计 | 定期核查路由表, 避免路由冲突 |
思考
- 安全组是状态型防火墙而ACL是无状态的,这在实际应用中有什么区别?
- 如果VPC的CIDR地址段与本地网络的地址段重叠,会导致什么问题?如何解决?
- 安全组默认拒绝所有,ACL默认允许所有,这种设计思路的利弊是什么?
- VPC对等连接不具有传递性,如果需要三个VPC互相通信,需要建立几条对等连接?
- NAT网关的SNAT和DNAT在VPC安全架构中各自承担什么角色?为什么不建议直接将实例暴露在公网?
下篇预告:第274篇:Overlay 网络中隧道终结与网关