监控防火墙丢包率的核心在于快速区分“策略拦截”与“异常丢弃”,建议先通过命令行查看计数器止血,再配合监控系统实现阈值告警,适用于 Linux iptables/nftables 或支持 SNMP 的硬件防火墙场景。
先说结论:监控重点不是单纯看丢包数字,而是确认丢包来源是否为业务流量,避免被攻击流量掩盖真实故障。
- 适合 Linux 净流量统计或硬件防火墙 SNMP 场景
- 先准备监控采集端与告警通道
- 验收时需模拟正常流量被误拦测试
命令速查与人工计算
在 Linux 环境下,可以通过以下命令查看当前防火墙规则的匹配计数,初步判断是否有大量数据包被丢弃:
iptables -L -v -n -x
如果使用 nftables,可以使用:
nft list ruleset
关注输出中的 drop 或 reject 计数器增长情况。人工计算丢包率公式为:丢包率 = 特定规则丢弃包量 / 该链总入口包量。若某条规则计数激增且对应业务端口,需立即介入。
监控采集方案修正
Prometheus 的 node_exporter 默认不包含 iptables 指标,需采用以下两种方案之一:
- 专用 Exporter:部署社区维护的 iptables_exporter,自动解析规则计数器并暴露 metrics 接口。
- 自定义脚本:编写脚本定期执行 iptables 命令,解析输出后通过 Pushgateway 推送至 Prometheus。
采集配置示例(iptables_exporter):
./iptables_exporter `--iptables`.cmd="iptables -L -v -n -x" `--web`.listen-address=":9113"
告警规则与通知配置
在监控系统中配置表达式,需计算比率而非绝对值,避免业务量波动导致误报。以下是 PromQL 告警规则示例:
groups:
- name: firewall_alerts
rules:
- alert: HighFirewallDropRate
expr: sum(rate(iptables_packets_dropped_total[5m])) / sum(rate(iptables_packets_total[5m])) > 0.05
for: 5m
labels:
severity: warning
annotations:
summary: "防火墙丢包率超过 5%"
通知渠道配置(Alertmanager webhook 示例):
receivers:
- name: 'ops-webhook'
webhook_configs:
- url: 'http://alert-webhook.internal:8080/notify'
send_resolved: true
验证与排查
1. 模拟故障:在测试环境添加一条临时拒绝规则,如 iptables -A INPUT -p tcp `--dport` 8080 -j DROP。
2. 产生流量:使用 curl 或 ping 对该端口发起请求,确保护包计数器增长。
3. 观察告警:检查监控系统是否在预期时间内收到指标上升,并验证 webhook 是否收到通知。
4. 恢复环境:验证后务必删除临时规则,恢复业务正常通行。
常见坑
1. 日志风暴:高频丢包可能导致日志系统写入压力过大,建议采样或仅统计计数器,避免影响防火墙性能。
2. NAT 干扰:经过地址转换的流量可能在统计时归属不明确,需在 nat 表单独确认,防止漏统计。
3. 状态跟踪:部分防火墙对已建立连接的流量不重复匹配规则,需确认监控点是否在连接建立阶段,否则可能看不到后续丢包。