第202篇:防火墙包过滤与会话表

关键词

包过滤、会话表、状态检测、五元组、会话老化、TCP 状态跟踪、ASPF、会话表安全


一、包过滤基础

1.1 什么是包过滤

包过滤是最基本的防火墙技术,依据每个报文头部的信息决定转发或丢弃:

包过滤的检查维度(五元组): | 源 IP 10.0.0.1 | 目的 IP 8.8.8.8 | 源端口 12345 | 目的端口 443 | 协议号 TCP(6) | | --- | --- | --- | --- | --- |

1.2 无状态包过滤 vs 有状态包过滤

无状态包过滤(传统 ACL):
  每个报文独立检查
  不关心连接状态
  需要双向放行规则

  例:允许内网访问外网 HTTP
    入方向:允许 10.0.0.0/24 → 任何 80
    出方向:允许 任何 → 10.0.0.0/24 临时端口
    ↑ 问题:出方向规则太宽泛,有安全隐患

有状态包过滤(状态防火墙):
  维护会话表
  只检查首包,后续报文查会话表
  自动创建反向通道
  例:只需一条规则
    入方向:允许 10.0.0.0/24 → 任何 HTTP
    回复报文自动允许

二、会话表(Session Table)

2.1 会话表的结构

每个经过防火墙的 TCP/UDP 连接都在会话表中有一条记录:

display firewall session table
  Current Total Sessions: 56123

  TCP 10.0.0.1:12345 → 8.8.8.8:443
    Zone: Trust → Untrust
    VPN: public → public
    State: ESTABLISHED
    TTL: 3600s
    Create: 2024-03-15 10:00:00
    Last Hit: 2024-03-15 10:05:23

  UDP 10.0.0.1:54321 → 8.8.8.8:53
    Zone: Trust → Untrust
    State: ACTIVE
    TTL: 180s

会话表的关键字段:

字段 说明 示例
五元组 源/目的 IP + 端口 + 协议 10.0.0.1:12345→8.8.8.8:443 TCP
安全区域 入接口和出接口所属区域 Trust→Untrust
连接状态 TCP 连接当前状态 ESTABLISHED / CLOSING
TTL 剩余生存时间 3600 秒
创建时间 会话建立的时间 2024-03-15 10:00:00

2.2 会话建立流程

TCP 连接建立时,防火墙的会话创建过程:

客户端                       防火墙                      服务器
  │                           │                           │
  │  1. SYN (首包)              │                           │
  │─────────────────────────→  │                           │
  │                           │ 2. 创建会话表条目           │
  │                           │ 状态: SYN_SENT             │
  │                           │                           │
  │                           │  3. 转发 SYN               │
  │                           │─────────────────────────→  │
  │                           │                           │
  │                           │  4. SYN+ACK               │
  │                           │←──────────────────────────│
  │                           │ 5. 匹配会话表               │
  │                           │ 状态: SYN_RECEIVED         │
  │                           │                           │
  │  6. SYN+ACK               │                           │
  │←──────────────────────────│                           │
  │                           │                           │
  │  7. ACK                   │                           │
  │──────────────────────────→│                           │
  │                           │ 8. 状态: ESTABLISHED       │
  │                           │                           │
  │                           │  9. 转发 ACK               │
  │                           │──────────────────────────→ │

  连接建立成功,后续数据报文直接匹配会话表转发

2.3 会话老化机制

不同类型的会话有不同的超时时间:

协议/场景          默认超时时间    说明
──────────────────────────────────────────
TCP ESTABLISHED    3600 秒(1h)   正常连接
TCP SYN_SENT       10 秒           连接未建立
TCP FIN_WAIT       10 秒           正常关闭中
TCP CLOSE_WAIT     30 秒           对端关闭
TCP TIME_WAIT      2 秒            彻底关闭
UDP                180 秒(3min)  无连接协议
ICMP               20 秒           临时响应
FTP 数据通道       30 秒           ASPF 动态创建

# 调整会话老化时间(安全加固场景)
firewall session aging-time
 tcp ESTABLISHED 1800               # 从 3600s 减到 1800s
 udp 120                             # 从 180s 减到 120s

三、TCP 状态跟踪

3.1 防火墙维护的 TCP 状态机

防火墙为每个 TCP 会话维护简化的状态机:

          ┌───────────┐
          │  CLOSED   │
          └─────┬─────┘
                │ 收到 SYN
          ┌─────┴─────┐
          │ SYN_SENT  │
          └─────┬─────┘
                │ 收到 SYN+ACK
          ┌─────┴─────┐
          │SYN_RCVD   │
          └─────┬─────┘
                │ 收到 ACK
          ┌─────┴─────┐
          │ESTABLISHED│ ← 数据交互阶段
          └─────┬─────┘
                │ 收到 FIN
          ┌─────┴─────┐
          │  CLOSING  │
          └─────┬─────┘
                │ 双向 FIN 交换完成
          ┌─────┴─────┐
          │  CLOSED   │ → 删除会话
          └───────────┘

3.2 状态检测的安全优势

状态检测如何防御攻击:

1. SYN Flood 防护
   对 SYN_SENT 状态会话的数量进行限制
   # 配置
   firewall syn-flood protect enable
   firewall syn-flood protect threshold 1000

2. TCP 序列号检查
   验证 TCP 序列号是否在合法窗口内
   防止 TCP 劫持和会话注入

3. 非对称路由处理
   如果出方向和入方向路径不同,需要开启 Asymmetric Routing 处理
   firewall asymmetric-route enable

四、会话表的安全防护

4.1 会话表耗尽攻击

攻击者通过大量伪造连接填满会话表,导致正常连接无法建立:

会话表容量:100 万条
攻击流量:5 万 SYN/秒(伪造源 IP)

20 秒内会话表填满 → 正常用户无法新建连接

防护措施:
  1. 限制单源 IP 的最大会话数
   firewall session limit source-ip 10.0.0.1 1000

  2. 限制单目的 IP 的最大会话数
   firewall session limit destination-ip 8.8.8.8 5000

  3. 限制单安全区域的会话总数
   firewall session limit zone trust 500000

4.2 会话表查看与管理

# 查看会话统计
display firewall session statistics
  Total sessions: 56123
  TCP: 45678
  UDP: 10234
  ICMP: 211

  Session creation rate: 1234/sec
  Session deletion rate: 1200/sec

# 按条件过滤查看会话
display firewall session table source-ip 10.0.0.1
display firewall session table destination-port 80

# 手动清除会话
reset firewall session table
reset firewall session table source-ip 10.0.0.1

五、包过滤与 NAT 的协同

5.1 NAT 对会话表的影响

有 NAT 时的会话表:

转换前:10.0.0.1:12345 → 8.8.8.8:80 (Trust→Untrust)
转换后:203.0.113.1:2048 → 8.8.8.8:80 (Trust→Untrust)
                  ↑                 ↑
              NAT 转换了源地址      目的地址不变

会话表记录的是转换后的五元组:
  Original: 10.0.0.1:12345 ↔ 203.0.113.1:2048
  Reply:    8.8.8.8:80 → 203.0.113.1:2048

5.2 配置示例

# NAT + 包过滤组合配置
nat-policy
 rule name Source_NAT
  source-zone trust
  destination-zone untrust
  source-address 10.0.0.0 mask 255.255.255.0
  action source-nat easy-ip            # 接口地址 NAT
!
security-policy
 rule name Trust_to_Internet
  source-zone trust
  destination-zone untrust
  action permit
  # 注意:NAT 在安全策略之前或之后执行(取决于设备)

六、总结

知识点 核心要点
包过滤 基于五元组检查每个报文
无状态 vs 有状态 无状态逐包检查,有状态维护会话
会话表 记录每个连接的状态、老化时间、五元组
TCP 状态跟踪 SYN→SYN_RCVD→ESTABLISHED→CLOSING→CLOSED
会话老化 TCP 3600s、UDP 180s、ICMP 20s
安全防护 会话数限制、SYN Flood 防护、序列号检查

七、思考

  1. 有状态防火墙和无状态包过滤的主要区别是什么?
  2. 会话表在防火墙的转发流程中扮演什么角色?
  3. TCP 连接的会话状态是如何从 SYN 转换到 ESTABLISHED 的?
  4. 如果防火墙会话表被填满,会发生什么?如何防护?
  5. NAT 环境下,会话表记录的是转换前还是转换后的地址?

下篇预告:第203篇《状态防火墙 vs 包过滤防火墙》——深入对比两种防火墙架构的原理、优缺点和适用场景。