会话dirty机制
2025/10/29大约 6 分钟
会话dirty机制
简介
会话Dirty状态
当FortiGate接收到新会话的首个数据包(如TCP SYN)时,设备会执行路由查询,并根据防火墙策略判断是否允许该流量通过,然后创建对应的会话。对首个响应数据包(如TCP SYN ACK)仅执行路由查找(不检查防火墙策略)。
FortiGate会将路由查询信息(出接口与网关)、防火墙策略ID及其他信息(如地址转换、UTM检测、认证、日志记录等)保存至会话中,并将其状态标记为may_dirty。其中本文主要关注其中的state=字段中的会话dirty状态,如下所示,该会话的状态为may_dirty。
session info: proto=6 proto_state=11 duration=2 expire=3597 timeout=3600 refresh_dir=both flags=00000000 socktype=0 sockport=0 av_idx=0 use=4
origin-shaper=
reply-shaper=
per_ip_shaper=
class_id=0 ha_id=0 policy_dir=0 tunnel=/ vlan_cos=0/255
state=log may_dirty ndr npu f00 <----这里的会话状态为may_dirty
statistic(bytes/packets/allow_err): org=116/2/1 reply=60/1/1 tuples=3
tx speed(Bps/kbps): 0/0 rx speed(Bps/kbps): 0/0
orgin->sink: org pre->post, reply pre->post dev=40->7/7->40 gwy=10.10.12.1/192.168.100.177
hook=post dir=org act=snat 192.168.100.177:54449->223.5.5.5:443(10.10.12.2:54449)
hook=pre dir=reply act=dnat 223.5.5.5:443->10.10.12.2:54449(192.168.100.177:54449)
hook=post dir=reply act=noop 223.5.5.5:443->192.168.100.177:54449(0.0.0.0:0)
pos/(before,after) 0/(0,0), 0/(0,0)
src_mac=0c:37:96:06:d7:5d
misc=0 policy_id=1 pol_uuid_idx=661 auth_info=0 chk_client_info=0 vd=0
serial=00172c91 tos=ff/ff app_list=0 app=0 url_cat=0
rpdb_link_id=00000000 ngfwid=n/a
npu_state=0x003c94 ips_offload ofld-O ofld-R
npu info: flag=0x81/0x81, offload=8/8, ips_offload=1/1, epid=16/16, ipid=95/66, vlan=0x0000/0x0000
vlifid=95/66, vtag_in=0x0000/0x0000 in_npu=1/1, out_npu=1/1, fwd_en=0/0, qid=2/0, ha_divert=0/0会话dirty状态有如下2种:
may_dirty:如果流量被防火墙策略允许,且设备没有发生任何策略、路由等变化,会话保持may_dirty状态。dirty:如果防火墙策略中的参数(如源、目的)发生变化,或其他可能触发状态变更的条件(如路由变化),现有会话的may_dirty标记将被修改为dirty状态。随后FortiGate需要重新评估下一个匹配该会话数据包的路由、策略等信息:- 如果流量仍被防火墙策略允许,则移除
dirty标志并恢复may_dirty标志,更新会话中的NAT、网关、策略ID等信息。 - 若流量经重新评估后被判定为拒绝,则标记为
block标志,并保留在会话表中直至过期。任何匹配带有block标志会话的数据包均会被丢弃。 - 只要会话的状态没有被标记为
dirty,FortiGate就不会对该会话执行重新评估。
- 如果流量仍被防火墙策略允许,则移除
会话dirty原因
以下是可能导致会话被标记为dirty的原因:
- 防火墙策略变化。
- 路由变化。
- 网络相关的配置变更。
- 执行FortiGuard计划更新(仅当下载新定义且策略关联了相关安全配置文件时)。
- 若会话通过FGSP协议进行同步。
会话dirty相关配置
firewall-session-dirty
防火墙策略配置发生变化后,相关会话的dirty状态变化会根据firewall-session-dirty配置决定。
VDOM级别配置
config system settings set firewall-session-dirty { check-all | check-new | check-policy-option } endcheck-all(默认):所有被编辑的防火墙策略影响的会话状态被标记为dirty,无论是匹配原有会话的流量还是新创建的流量,重新评估为新会话。check-new:现有会话不会被标记为dirty,而是被标记为persistent,原有匹配该会话的流量也不会被重新评估(直至该会话老化),仅检查新创建的流量。check-policy-option:使用防火墙策略级别汇总的配置。
策略级别配置
config firewall policy edit <id> set firewall-session-dirty < check-all | check-new > next endcheck-all(默认):所有被编辑的防火墙策略影响的会话状态被标记为dirty,无论是匹配原有会话的流量还是新创建的流量,重新评估为新会话。check-new:现有会话不会被标记为dirty,而是被标记为persistent,原有匹配该会话的流量也不会被重新评估(直至该会话老化),仅检查新创建的流量。
fqdn-session-check
FQDN地址对象解析的IP发生变化后,相关会话的dirty状态变化会根据fqdn-session-check配置决定。
config system settings
set fqdn-session-check { enable | disable }
end
FQDN地址示例:
config firewall address
edit "www.fortinet.com"
set type fqdn
set fqdn "www.fortinet.com"
next
enddisable(默认):现有会话不会被标记为dirty,而是被标记为persistent,原有匹配该会话的流量也不会被重新评估(直至该会话老化),仅检查新创建的流量。enable:现有相关会话被标记为dirty,无论是匹配原有会话的流量还是新创建的流量,重新评估为新会话。
snat-route-change
该参数决定路由变化后,SNAT的会话表是否跟随着一起变化更新。
config system settings
set snat-route-change { enable | disable }
enddisable(默认):会话表项不变化,继续保持该会话,保持原有出口。enable:会话表项变化,会话状态会置位为dirty,并且后续同一会话的数据将会重新上送CPU查询策略/路由等参数,重新进行策略的匹配,一旦路由变化将会匹配新的出口进行数据的转发。
preserve-session-route
该参数基于路由出接口,决定路由变化后,非SNAT的会话表是否跟随着一起变化更新。
config system interface
edit "port2"
set preserve-session-route { enable | disable }
next
enddisable(默认):不保持会话,立刻将会话标记为dirty,并重新评估后续流量。enable:强制保持会话,不会主动的更新会话中路由的下一跳地址。- 这个命令的优先级更高,只要开启了接口的会话保持,无论
snat-route-change是否开启,会话还是为会优先保持,会话/流量不会更变出接口信息。
ext-resource-session-check
外部威胁源对象(如IP、域名、Web分类等)的内容发生变化后,相关会话的dirty状态变化会根据ext-resource-session-check配置决定。
重要
外部威胁源的配置请参考:Security Fabric→威胁情报源章节。
config system settings
set fqdn-session-check { enable | disable }
enddisable(默认):现有会话不会被标记为dirty,而是被标记为persistent,原有匹配该会话的流量也不会被重新评估(直至该会话老化),仅检查新创建的流量。enable:现有相关会话被标记为dirty,无论是匹配原有会话的流量还是新创建的流量,重新评估为新会话。
dyn-addr-session-check
动态地址(如从SDN连接器获取地址)对象中的地址内容发生变化后,相关会话的dirty状态变化会根据dyn-addr-session-check配置决定。
config system settings
set dyn-addr-session-check { enable | disable }
enddisable(默认):现有会话不会被标记为dirty,而是被标记为persistent,原有匹配该会话的流量也不会被重新评估(直至该会话老化),仅检查新创建的流量。enable:现有相关会话被标记为dirty,无论是匹配原有会话的流量还是新创建的流量,重新评估为新会话。