Cloud Firewall

🛡️ 云防火墙核心概念与应用图解教程

#Security #Cloud #Network #ACL #NAT

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 (默认隐式规则)

如图1所示:ACL在子网边界进行流量过滤。

Internet Subnet Boundary (ACL) Private Subnet VM Instance Rule 100: ALLOW Rule 200: DENY

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 (默认允许,用于系统更新等)

如图2所示:安全组像气泡一样包裹着虚拟机,提供状态化保护。

VPC Subnet Security Group (Stateful) Web Server Request (Port 80) Response (Auto-Allowed) Malicious (Port 3389)

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)

如图3所示:SNAT与DNAT的数据流向差异。

Private Subnet NAT Gateway Internet SNAT (Outbound) DB (10.0.1.5) Map to Public IP DNAT (Inbound) Web (10.0.2.5) Map to Private IP

4. VPC 网络架构

完整的云防火墙架构

在实际的云环境中,VPC(Virtual Private Cloud)是所有网络组件的容器。一个完整的 VPC 网络架构包括:

  • VPC:隔离的虚拟网络环境(如 10.0.0.0/16)
  • 子网:公有子网和私有子网
  • 互联网网关(IGW):为 VPC 提供公网访问能力
  • NAT 网关:为私有子网提供出站互联网访问
  • 安全组 & ACL:多层防御
🏛️ 典型三层架构:
  • 公有子网:放置负载均衡器、堡垒机(Bastion Host)
  • 私有应用子网:放置 Web 服务器、应用服务器
  • 私有数据子网:放置数据库,完全与公网隔离

如图4所示:完整的 VPC 网络拓扑结构。

VPC (10.0.0.0/16) 公有子网 (10.0.1.0/24) Web Server IGW 私有子网 (10.0.2.0/24) Database NAT GW 安全组件 SG ACL

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

💾 场景 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 (数据库不需要主动对外连接)
✅ 安全优势:
  • 使用安全组引用而非 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

🏭 场景 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 内仍然生效

8. 故障排查

🔧 常见问题诊断与解决

当你遇到网络连接问题时,可以按照以下步骤进行排查。

❌ 问题 1:无法访问 Web 服务器

症状: 从公网访问 Web 服务器超时或连接拒绝。
🔍 排查步骤:
  1. 检查安全组入站规则:
    • 确认是否允许目标端口(如 80/443)
    • 检查 Source 是否包含你的 IP 或 0.0.0.0/0
  2. 检查子网 ACL:
    • 入站规则是否允许目标端口
    • 出站规则是否允许临时端口(1024-65535)
  3. 检查路由表:
    • 公有子网是否关联了互联网网关 (IGW)
    • 0.0.0.0/0 路由是否指向 IGW
  4. 检查实例本身:
    • 服务是否正在运行:netstat -tuln | grep 80
    • 防火墙是否允许:iptables -L (Linux)

❌ 问题 2:私有子网实例无法访问公网

症状: 私有子网中的实例无法 ping 通公网或下载软件包。
🔍 排查步骤:
  1. 检查 NAT 网关:
    • NAT 网关是否在公有子网中
    • NAT 网关是否分配了弹性 IP (EIP)
  2. 检查私有子网路由表:
    • 0.0.0.0/0 路由是否指向 NAT 网关
  3. 检查安全组:
    • 出站规则是否允许目标端口和协议
  4. 检查 NAT 网关安全组:
    • NAT 网关所在安全组必须允许转发流量

❌ 问题 3:实例间无法通信

症状: 同一 VPC 内的两个实例无法相互访问。
🔍 排查步骤:
  1. 检查安全组:
    • 源实例的出站规则是否允许访问目标
    • 目标实例的入站规则是否允许源 IP 或安全组
    • 推荐:使用安全组引用而非 IP 地址
  2. 检查子网 ACL:
    • 如果实例在不同子网,检查两个子网的 ACL
  3. 检查路由表:
    • 确认子网间路由配置正确

🛠️ 调试工具与命令

# 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

📊 最佳调试实践

✅ 建议步骤:
  1. 从外到内逐层排查:IGW -> ACL -> 安全组 -> 实例防火墙 -> 应用
  2. 使用流日志:启用 VPC Flow Logs 分析被拒绝的流量
  3. 临时放宽规则:测试时可以临时允许所有流量,逐步收紧
  4. 文档化:记录每个安全组规则的作用和原因
  5. 使用标签:为安全组和实例添加有意义的标签便于管理