Cloud Firewall
🛡️ 云防火墙核心概念与应用图解教程
↓
0. 引言:云防火墙 vs 传统防火墙
云防火墙是专为云计算环境设计的网络安全解决方案,它利用软件定义网络(SDN)技术,在云端提供流量过滤、访问控制和威胁防御功能。
与传统硬件防火墙相比,云防火墙具有以下核心优势:
- 弹性扩展:无需购买昂贵的硬件,随业务流量自动扩容。
- 按需付费:降低初期投入成本,按使用量计费。
- 集成化管理:与云平台(如VPC、虚拟机)深度集成,通过API实现自动化运维。
- 多层防御:支持ACL、安全组、NAT等多种防御机制组合使用。
💡 关键理解:云防火墙不是单一产品,而是多个安全组件的组合,包括网络 ACL、安全组、NAT 网关等,形成多层防御体系。
1. 访问控制列表 (ACL)
核心概念
网络ACL(Network ACL) 是一个子网级别的无状态包过滤防火墙。它控制进出子网的数据流,作为安全组之外的额外安全层。
🔑 关键特性
- 作用范围: 子网(Subnet)级别。
- 无状态(Stateless): 返回流量不会自动被允许,必须显式配置出站规则。
- 规则优先级: 按数字顺序处理规则,匹配即停止。
- 支持拒绝规则: 可以显式拒绝特定流量(DENY)。
⚠️ 注意:由于 ACL 是无状态的,如果你允许入站端口 80,还需要显式允许出站临时端口(如 1024-65535)用于返回响应。
# 示例:ACL 配置场景
# 目标:仅允许特定管理IP访问子网,拒绝恶意IP段
Inbound Rules (入站规则):
100 ALLOW TCP 22 (SSH) FROM 203.0.113.5/32 (Admin IP)
200 DENY ALL FROM 198.51.100.0/24 (Malicious Subnet)
300 ALLOW ALL TRAFFIC
* DENY ALL (默认隐式规则)
# 目标:仅允许特定管理IP访问子网,拒绝恶意IP段
Inbound Rules (入站规则):
100 ALLOW TCP 22 (SSH) FROM 203.0.113.5/32 (Admin IP)
200 DENY ALL FROM 198.51.100.0/24 (Malicious Subnet)
300 ALLOW ALL TRAFFIC
* DENY ALL (默认隐式规则)
如图1所示:ACL在子网边界进行流量过滤。
2. 安全组 (Security Group)
核心概念
安全组 是一个虚拟防火墙,用于控制一个或多个实例(如虚拟机)的入站和出站流量。它是云安全中最常用的组件。
🔑 关键特性
- 作用范围: 实例(Instance/ENI)级别。
- 有状态(Stateful): 如果允许入站流量,则自动允许相应的出站响应流量(反之亦然)。
- 默认策略: 默认拒绝所有入站流量,允许所有出站流量。
- 仅支持允许规则: 不能显式配置 DENY 规则。
✅ 优势:安全组的有状态特性大大简化了配置,你只需允许入站的 HTTP 请求,响应流量会自动被允许。
# 示例:Web服务器安全组配置
# 场景:部署一个对外提供HTTP/HTTPS服务的Web服务器
Inbound Rules (入站):
- Protocol: TCP, Port: 80 (HTTP), Source: 0.0.0.0/0 (Anywhere)
- Protocol: TCP, Port: 443 (HTTPS), Source: 0.0.0.0/0 (Anywhere)
- Protocol: TCP, Port: 22 (SSH), Source: 192.168.1.10/32 (Admin VPN)
Outbound Rules (出站):
- Allow All (默认允许,用于系统更新等)
# 场景:部署一个对外提供HTTP/HTTPS服务的Web服务器
Inbound Rules (入站):
- Protocol: TCP, Port: 80 (HTTP), Source: 0.0.0.0/0 (Anywhere)
- Protocol: TCP, Port: 443 (HTTPS), Source: 0.0.0.0/0 (Anywhere)
- Protocol: TCP, Port: 22 (SSH), Source: 192.168.1.10/32 (Admin VPN)
Outbound Rules (出站):
- Allow All (默认允许,用于系统更新等)
如图2所示:安全组像气泡一样包裹着虚拟机,提供状态化保护。
3. 网络地址转换 (NAT)
核心概念
NAT网关 允许私有子网中的实例连接到互联网(SNAT),或允许互联网连接到私有子网中的服务(DNAT),同时隐藏内部网络结构。
🔑 两种 NAT 类型
- SNAT (Source NAT): 源地址转换。用于私有实例访问公网(如下载更新),但公网无法主动访问实例。
- DNAT (Destination NAT): 目的地址转换。将公网IP映射到私有IP,用于对外发布服务。
💡 应用场景:
- SNAT:数据库服务器需要下载补丁,但不希望直接暴露在公网
- DNAT:Web服务器位于私有子网,需要通过公网IP对外提供服务
# 示例:NAT 场景
场景A (SNAT):
Database Server (10.0.1.5) -> NAT Gateway (Public IP: 203.0.113.10) -> Internet (Repo Update)
场景B (DNAT):
User -> Public IP (203.0.113.20:80) -> NAT -> Web Server (10.0.2.5:80)
场景A (SNAT):
Database Server (10.0.1.5) -> NAT Gateway (Public IP: 203.0.113.10) -> Internet (Repo Update)
场景B (DNAT):
User -> Public IP (203.0.113.20:80) -> NAT -> Web Server (10.0.2.5:80)
如图3所示:SNAT与DNAT的数据流向差异。
4. VPC 网络架构
完整的云防火墙架构
在实际的云环境中,VPC(Virtual Private Cloud)是所有网络组件的容器。一个完整的 VPC 网络架构包括:
- VPC:隔离的虚拟网络环境(如 10.0.0.0/16)
- 子网:公有子网和私有子网
- 互联网网关(IGW):为 VPC 提供公网访问能力
- NAT 网关:为私有子网提供出站互联网访问
- 安全组 & ACL:多层防御
🏛️ 典型三层架构:
- 公有子网:放置负载均衡器、堡垒机(Bastion Host)
- 私有应用子网:放置 Web 服务器、应用服务器
- 私有数据子网:放置数据库,完全与公网隔离
如图4所示:完整的 VPC 网络拓扑结构。
5. 最佳实践
🌟 安全配置建议
1️⃣ 最小权限原则
- 只开放必要的端口,避免使用 0.0.0.0/0 作为源地址
- 数据库服务器仅允许应用服务器安全组访问
- SSH/RDP 端口仅对内部 VPN 或堡垒机开放
2️⃣ 分层防御策略
推荐组合:
- ACL:在子网级别封禁已知恶意 IP 段
- 安全组:在实例级别精细控制服务端口
- WAF:对外部 Web 应用启用 Web 应用防火墙
3️⃣ 定期审计与监控
- 启用流日志(Flow Logs)监控网络流量
- 使用云平台安全工具定期扫描安全组规则
- 设置告警,当规则被修改时发送通知
4️⃣ 避免常见错误
⚠️ 常见错误:
- ✘️ 将 SSH(22)对全世界开放
- ✘️ 忘记为 ACL 配置出站规则(无状态)
- ✘️ 过度复杂的安全组规则,难以维护
- ✘️ 不使用安全组引用(而是硬编码 IP)
6. 对比总结
理解 ACL 和 安全组 的区别是配置云防火墙的关键。
| 特性 | 安全组 (Security Group) | 网络 ACL (Network ACL) |
|---|---|---|
| 作用范围 | 实例级别 (虚拟机) | 子网级别 (Subnet) |
| 状态 | 有状态 (自动允许返回流量) | 无状态 (需显式允许返回流量) |
| 规则支持 | 仅支持“允许”规则 | 支持“允许”和“拒绝”规则 |
| 生效顺序 | 所有规则同时评估 | 按编号顺序评估 |
| 典型场景 | Web服务器开放80端口 | 封禁特定恶意IP段 |
7. 实战场景
💼 常见应用场景与配置案例
以下是在云环境中部署应用时最常见的几种防火墙配置场景,每种场景都包含实际可用的配置示例。
🌐 场景 1:公网 Web 应用部署
业务需求:
部署一个对外提供服务的 Web 应用,需要允许公网访问 HTTP/HTTPS,但仅允许管理员通过 VPN SSH 登录。
# Web 服务器安全组配置
入站规则:
1. Type: HTTP, Protocol: TCP, Port: 80, Source: 0.0.0.0/0
2. Type: HTTPS, Protocol: TCP, Port: 443, Source: 0.0.0.0/0
3. Type: SSH, Protocol: TCP, Port: 22, Source: 10.10.0.0/16 (内部VPN网段)
出站规则:
1. Type: All Traffic, Protocol: All, Port: All, Destination: 0.0.0.0/0
子网 ACL 配置:
Inbound:
100 ALLOW TCP 80 FROM 0.0.0.0/0
110 ALLOW TCP 443 FROM 0.0.0.0/0
120 ALLOW TCP 22 FROM 10.10.0.0/16
130 DENY ALL FROM 0.0.0.0/0
Outbound:
100 ALLOW TCP 1024-65535 TO 0.0.0.0/0 # 响应流量
110 ALLOW TCP 443 TO 0.0.0.0/0 # HTTPS 出站
120 DENY ALL TO 0.0.0.0/0
入站规则:
1. Type: HTTP, Protocol: TCP, Port: 80, Source: 0.0.0.0/0
2. Type: HTTPS, Protocol: TCP, Port: 443, Source: 0.0.0.0/0
3. Type: SSH, Protocol: TCP, Port: 22, Source: 10.10.0.0/16 (内部VPN网段)
出站规则:
1. Type: All Traffic, Protocol: All, Port: All, Destination: 0.0.0.0/0
子网 ACL 配置:
Inbound:
100 ALLOW TCP 80 FROM 0.0.0.0/0
110 ALLOW TCP 443 FROM 0.0.0.0/0
120 ALLOW TCP 22 FROM 10.10.0.0/16
130 DENY ALL FROM 0.0.0.0/0
Outbound:
100 ALLOW TCP 1024-65535 TO 0.0.0.0/0 # 响应流量
110 ALLOW TCP 443 TO 0.0.0.0/0 # HTTPS 出站
120 DENY ALL TO 0.0.0.0/0
💾 场景 2:三层架构(Web + App + DB)
业务需求:
实现经典的三层分离架构,确保每层只能被上一层访问,数据库完全与公网隔离。
# 层级 1: Web 层安全组 (sg-web)
入站:
- HTTP/HTTPS from 0.0.0.0/0
出站:
- All to sg-app (应用层安全组)
# 层级 2: 应用层安全组 (sg-app)
入站:
- TCP 8080 from sg-web
出站:
- TCP 3306 to sg-db (数据库安全组)
# 层级 3: 数据库安全组 (sg-db)
入站:
- TCP 3306 from sg-app
出站:
- DENY ALL (数据库不需要主动对外连接)
入站:
- HTTP/HTTPS from 0.0.0.0/0
出站:
- All to sg-app (应用层安全组)
# 层级 2: 应用层安全组 (sg-app)
入站:
- TCP 8080 from sg-web
出站:
- TCP 3306 to sg-db (数据库安全组)
# 层级 3: 数据库安全组 (sg-db)
入站:
- TCP 3306 from sg-app
出站:
- DENY ALL (数据库不需要主动对外连接)
✅ 安全优势:
- 使用安全组引用而非 IP 地址,无需维护 IP 清单
- 每层只暴露必要的端口给上一层
- 数据库完全与公网隔离,大大降低攻击面
📦 场景 3:私有子网访问公网(NAT 网关)
业务需求:
数据库服务器位于私有子网,需要定期从公网下载补丁和更新,但不希望暴露在公网。
# 网络拓扑:
VPC: 10.0.0.0/16
公有子网: 10.0.1.0/24 (放置 NAT 网关)
私有子网: 10.0.2.0/24 (放置数据库)
# NAT 网关配置:
1. 在公有子网创建 NAT 网关
2. 分配弹性 IP (EIP)
3. 修改私有子网路由表:
Destination: 0.0.0.0/0 -> Target: NAT Gateway
# 数据库安全组:
入站:仅允许应用服务器安全组
出站:允许 HTTPS (443) 到 0.0.0.0/0
VPC: 10.0.0.0/16
公有子网: 10.0.1.0/24 (放置 NAT 网关)
私有子网: 10.0.2.0/24 (放置数据库)
# NAT 网关配置:
1. 在公有子网创建 NAT 网关
2. 分配弹性 IP (EIP)
3. 修改私有子网路由表:
Destination: 0.0.0.0/0 -> Target: NAT Gateway
# 数据库安全组:
入站:仅允许应用服务器安全组
出站:允许 HTTPS (443) 到 0.0.0.0/0
🏭 场景 4:多区域高可用架构
# 跨可用区部署:
Region: us-east-1
AZ-A: 10.0.1.0/24 (Web Tier) + 10.0.3.0/24 (DB Primary)
AZ-B: 10.0.2.0/24 (Web Tier) + 10.0.4.0/24 (DB Standby)
# 负载均衡器安全组:
入站:HTTP/HTTPS from 0.0.0.0/0
出站:TCP 80/443 to sg-web
# 数据库复制:
入站:TCP 3306 from sg-db (允许同组内复制)
注意:跨 AZ 的安全组规则在同一 VPC 内仍然生效
Region: us-east-1
AZ-A: 10.0.1.0/24 (Web Tier) + 10.0.3.0/24 (DB Primary)
AZ-B: 10.0.2.0/24 (Web Tier) + 10.0.4.0/24 (DB Standby)
# 负载均衡器安全组:
入站:HTTP/HTTPS from 0.0.0.0/0
出站:TCP 80/443 to sg-web
# 数据库复制:
入站:TCP 3306 from sg-db (允许同组内复制)
注意:跨 AZ 的安全组规则在同一 VPC 内仍然生效
8. 故障排查
🔧 常见问题诊断与解决
当你遇到网络连接问题时,可以按照以下步骤进行排查。
❌ 问题 1:无法访问 Web 服务器
症状:
从公网访问 Web 服务器超时或连接拒绝。
🔍 排查步骤:
- 检查安全组入站规则:
- 确认是否允许目标端口(如 80/443)
- 检查 Source 是否包含你的 IP 或 0.0.0.0/0
- 检查子网 ACL:
- 入站规则是否允许目标端口
- 出站规则是否允许临时端口(1024-65535)
- 检查路由表:
- 公有子网是否关联了互联网网关 (IGW)
- 0.0.0.0/0 路由是否指向 IGW
- 检查实例本身:
- 服务是否正在运行:
netstat -tuln | grep 80 - 防火墙是否允许:
iptables -L(Linux)
- 服务是否正在运行:
❌ 问题 2:私有子网实例无法访问公网
症状:
私有子网中的实例无法 ping 通公网或下载软件包。
🔍 排查步骤:
- 检查 NAT 网关:
- NAT 网关是否在公有子网中
- NAT 网关是否分配了弹性 IP (EIP)
- 检查私有子网路由表:
- 0.0.0.0/0 路由是否指向 NAT 网关
- 检查安全组:
- 出站规则是否允许目标端口和协议
- 检查 NAT 网关安全组:
- NAT 网关所在安全组必须允许转发流量
❌ 问题 3:实例间无法通信
症状:
同一 VPC 内的两个实例无法相互访问。
🔍 排查步骤:
- 检查安全组:
- 源实例的出站规则是否允许访问目标
- 目标实例的入站规则是否允许源 IP 或安全组
- 推荐:使用安全组引用而非 IP 地址
- 检查子网 ACL:
- 如果实例在不同子网,检查两个子网的 ACL
- 检查路由表:
- 确认子网间路由配置正确
🛠️ 调试工具与命令
# 1. 检查安全组(AWS CLI)
aws ec2 describe-security-groups --group-ids sg-xxxxxxxx
# 2. 检查网络 ACL
aws ec2 describe-network-acls --network-acl-ids acl-xxxxxxxx
# 3. 检查路由表
aws ec2 describe-route-tables --route-table-ids rtb-xxxxxxxx
# 4. 启用 VPC 流日志
aws ec2 create-flow-logs --resource-type VPC --resource-ids vpc-xxxxxxxx \
--traffic-type ALL --log-destination-type cloud-watch-logs
# 5. 在实例上测试连接
telnet target-ip 80
nc -zv target-ip 3306
traceroute target-ip
# 6. 检查本地防火墙
sudo iptables -L -n -v # Linux
netsh advfirewall show allprofiles # Windows
aws ec2 describe-security-groups --group-ids sg-xxxxxxxx
# 2. 检查网络 ACL
aws ec2 describe-network-acls --network-acl-ids acl-xxxxxxxx
# 3. 检查路由表
aws ec2 describe-route-tables --route-table-ids rtb-xxxxxxxx
# 4. 启用 VPC 流日志
aws ec2 create-flow-logs --resource-type VPC --resource-ids vpc-xxxxxxxx \
--traffic-type ALL --log-destination-type cloud-watch-logs
# 5. 在实例上测试连接
telnet target-ip 80
nc -zv target-ip 3306
traceroute target-ip
# 6. 检查本地防火墙
sudo iptables -L -n -v # Linux
netsh advfirewall show allprofiles # Windows
📊 最佳调试实践
✅ 建议步骤:
- 从外到内逐层排查:IGW -> ACL -> 安全组 -> 实例防火墙 -> 应用
- 使用流日志:启用 VPC Flow Logs 分析被拒绝的流量
- 临时放宽规则:测试时可以临时允许所有流量,逐步收紧
- 文档化:记录每个安全组规则的作用和原因
- 使用标签:为安全组和实例添加有意义的标签便于管理
↑