FortiGate DoS 策略排错
2025/10/29大约 3 分钟
FortiGate DoS 策略排错
DoS 策略排错最好的办法就是查看分析异常日志与 IPS 异常信息。
网络拓扑

icmp_flood 测试
Attacker 向 FortiGate 以 50pps 的速率发送总共 3000 个 icmp 报文。
在 FortiGate 上配置阈值为 30pps 的 icmp_flood 的 DoS 策略。
config firewall DoS-policy edit 1 set name icmpFlood set interface "port1" set srcaddr "all" set dstaddr "all" set service "ALL" config anomaly edit "icmp_flood" set status enable set log enable set action block set threshold 30 next end next end配置 debug filter,过滤 icmp_flood 攻击的 debug 信息。
# diagnose ips anomaly config DoS sensors in kernel vd 0: DoS id 1 proxy 0 0 tcp_syn_flood status 0 log 0 nac 0 action 0 threshold 2000 ... 7 udp_dst_session status 0 log 0 nac 0 action 0 threshold 5000 8 icmp_flood status 1 log 1 nac 0 action 7 threshold 30 9 icmp_sweep status 0 log 0 nac 0 action 0 threshold 100 ... total # DoS sensors: 1. # diagnose ips anomaly filter id 8使用 Mac OS 或 Linux 发起 icmp_flood 攻击,这里使用 hping3 工具为例(需要自行安装)。
summerice@Summerice ~ % sudo hping3 --icmp -i u20000(发包间隔20000微秒,即50pps) -c 3000 192.168.2.50 HPING 192.168.2.50 (en11 192.168.2.50): icmp mode set, 28 headers + 0 data bytes ... --- 192.168.2.50 hping statistic --- 3000 packets tramitted, 30 packets received, 99% packet loss round-trip min/avg/max = 0.4/0.5/0.8 ms由以上 hping3 发包结果可知,只有 30 个包通过,剩余 icmp 包被阻断,符合 icmp_flood 防护工作原理。
在攻击期间,在 FortiGate 查看异常列表。
# diagnose ips anomaly list list nids meter: id=icmp_flood ip=192.168.2.50 dos_id=1 exp=1000 pps=46 freq=50 total # of nids meters: 1.
| 参数 | 说明 |
|---|---|
| id = icmp_flood | 攻击名称。 |
| ip = 192.168.2.50 | 触发异常的被攻击对象的 IP 地址,可能是服务器,也可能是客户端。 对于 icmp_flood 攻击,IP 地址为攻击目标 IP 地址。如果是 icmp_sweep 攻击,该 IP 应为攻击源 IP。 |
| dos_id = 1 | 匹配的 DoS 策略 ID。 |
| exp = 998 | 剩余过期时间,单位为秒。 |
| pps = 46 | 命令执行时,已经收到的数据包 pps。 |
| freq = 50 | 对于基于并发会话数的异常,freq 为并发会话数。 对于基于速率的异常(flood、scan): continuous 模式:freq 为 pps 中的最大数值,或者时最后一秒收到的数据包的总数。 periodic 模式:freq 为 pps 数值。 |
日志分析
在 GUI 中访问“日志 & 报告” → 异常,下载 DoS 的异常日志,这里截取攻击刚开始的两条日志举例。
第一条日志中的字段分析。
date=2021-1-15 time=18:38:39 eventtime=1605911919824184594 tz="-0800" logid="0720018433" type="utm" subtype="anomaly" eventtype="anomaly" level="alert" vd="root" severity="critical" srcip=192.168.2.205 srccountry="Reserved" dstip=192.168.2.50 srcintf="port1" srcintfrole="undefined" sessionid=0 action="clear_session" proto=1 service="PING" count=1307 attack="icmp_flood" icmpid="0x2195" icmptype="0x08" icmpcode="0x00" attackid=16777316 policyid=1 policytype="DoS-policy" ref="http://www.fortinet.com/ids/VID16777316" msg="anomaly: icmp_flood, 31 > threshold 30, repeats 28 times" crscore=50 craction=4096 crlevel="critical"
| 参数 | 说明 |
|---|---|
| msg="anomaly: icmp_flood, 31 > threshold 30 | 在攻击的刚开始,第一条日志记录了攻击流量超过了 30pps 的阈值。 |
| repeats 28 times | 自上次记录日志以来超过阈值的数据包数。 |
| srcip = 192.168.2.205 dstip = 192.168.2.50 | 攻击流量的源目 IP。 |
| action="clear_session" | 清除相关会话,即阻断动作。 如果动作设置为“监视器”且“logging”开启,这里会显示“detected”。 |
- 第二条日志中的字段分析。
date=2021-1-15 time=18:39:09 eventtime=1605911949826224056 tz="-0800" logid="0720018433" type="utm" subtype="anomaly" eventtype="anomaly" level="alert" vd="root" severity="critical" srcip=192.168.2.205 srccountry="Reserved" dstip=192.168.2.50 srcintf="port1" srcintfrole="undefined" sessionid=0 action="clear_session" proto=1 service="PING" count=1497 attack="icmp_flood" icmpid="0x2195" icmptype="0x08" icmpcode="0x00" attackid=16777316 policyid=1 policytype="DoS-policy" ref="http://www.fortinet.com/ids/VID16777316" msg="anomaly: icmp_flood, 50 > threshold 30, repeats 1497 times" crscore=50 craction=4096 crlevel="critical"| 参数 | 说明 |
|---|---|
| msg="anomaly: icmp_flood, 50 > threshold 30 | 在日志生成的前一秒,检测到了 50 个匹配异常的数据包,超过了配置的阈值 30。 |
| repeats 1497 times | 自上次记录日志以来超过阈值的数据包数。 |
- 由于是持续的攻击流量,FortiGate 为多个数据包每 30s 生成一次日志(注意第二条日志和第一条日志的间隔为 30s)。
- 以下情况 FortiGate 不会再次生成 DoS 异常日志:
- 相同的攻击 ID 在 5s 内发生了多次。
- 相同的攻击 ID 在 30s 内发生了多次,且匹配的异常策略动作一致,并且拥有相同的源目 IP。