用脚本高效获取并监控网络安全的完整指南
📖 目录导读
- 为什么需要脚本获取防火墙状态? —— 痛点与价值分析
- 主流防火墙状态获取方式对比 —— CLI、SNMP、API谁更优?
- 通用Shell脚本实战:抓取iptables/nftables规则与连接状态
- 企业级进阶:Python脚本实现多品牌防火墙(Cisco、华为、Fortinet)状态轮询
- 脚本输出格式化:从原始数据到表格、JSON、告警提示
- 自动化集成:将脚本嵌入Zabbix/Prometheus实现持续监控
- 常见问题Q&A —— 权限、超时、跨平台兼容性解决
- 总结与最佳实践建议
为什么需要脚本获取防火墙状态?—— 痛点与价值分析
在日常运维中,防火墙作为网络第一道防线,其运行状态直接影响业务连续性,但人工巡检存在明显缺陷:登录数台设备检查命令输出耗时费力,且凌晨故障难以即时发现。使用脚本自动化获取防火墙状态能解决以下核心痛点:

- 实时性:脚本可每30秒轮询一次,替代人工小时级巡检
- 一致性:避免人为漏查关键指标(如会话表溢出、CPU高负载)
- 可追溯:输出结果可落盘为日志,用于历史趋势分析
- 低成本:一个Python脚本即可管理数百台不同品牌防火墙
Q:脚本获取的防火墙状态通常包含哪些关键指标?
A:主要包含:CPU/内存使用率、活跃连接数、策略匹配次数、接口状态(上下行流量)、NAT转换表项数、VPN隧道状态,以及安全事件告警(如DDoS攻击检测),这些指标直接反映防火墙健康度与安全防护能力。
主流防火墙状态获取方式对比
| 方法 | 实现难度 | 数据丰富度 | 适用品牌 | 典型工具 |
|---|---|---|---|---|
| CLI命令抓取 | 低 | 中等(依赖命令) | 全品牌通用 | sshpass + expect |
| SNMP轮询 | 中 | 高(标准MIB库) | 支持SNMP的设备 | snmpwalk + pysnmp |
| REST API查询 | 中-高 | 极高(定制化) | 新版本防火墙(Palo Alto、Fortinet 7.x+) | requests + OAuth2 |
| Netconf/Yang | 高 | 结构化数据 | 新型网络设备 | ncclient |
推荐方案:对于传统防火墙(iptables/Cisco ASA)优先用CLI脚本;对于现代云防火墙或SD-WAN设备,优先用REST API,数据返回JSON方便解析。
Q:为什么SNMP方式比CLI更稳定?
A:CLI依赖设备Shell的稳定性,高负载时SSH连接可能超时,而SNMP基于UDP轻量通信,且标准MIB(如IF-MIB、HOST-RESOURCES-MIB)对CPU/内存指标定义固定,不随固件版本变化,适合长期监控。
通用Shell脚本实战:抓取iptables/nftables规则与连接状态
以Linux防火墙iptables为例,脚本需完成:
- 获取当前所有规则条数
- 获取conntrack连接数
- 记录时间戳并输出格式化结果
#!/bin/bash
# get_fw_status.sh - 简化版防火墙状态采集脚本
LOG_FILE="/var/log/fw_status_$(date +%Y%m%d).log"
INTERVAL=300 # 轮询间隔秒数
while true; do
TIMESTAMP=$(date +"%Y-%m-%d %H:%M:%S")
RULES_COUNT=$(sudo iptables -L -n | wc -l)
CONN_COUNT=$(sudo conntrack -C 2>/dev/null || echo "conntrack工具未安装")
CPU_USAGE=$(top -bn1 | grep "Cpu(s)" | awk '{print $2 + $4}')
echo "[$TIMESTAMP] 规则数:$RULES_COUNT | 连接数:$CONN_COUNT | CPU:%$CPU_USAGE" >> $LOG_FILE
sleep $INTERVAL
done
关键点:
- 使用
sudo提升权限,需在/etc/sudoers中为脚本免密授权 conntrack -C统计当前连接跟踪表数量,需安装conntrack-tools- 日志按日期分割,方便后续分析
Q:如何避免脚本输出被日志撑满?
A:建议增加阀值告警——仅当连接数超过正常基线(如历史均值的1.5倍)时才输出详细内容,正常状态仅保留一行“OK”标记,配合logrotate按周轮转。
企业级进阶:Python脚本实现多品牌防火墙状态轮询
企业环境常混合不同品牌防火墙,Python脚本通过封装SSH/API调用实现统一采集,以下示例展示同时采集Cisco ASA与华为USG防火墙:
import paramiko, requests, json
from datetime import datetime
def get_cisco_status(host, user, password):
client = paramiko.SSHClient()
client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
client.connect(hostname=host, username=user, password=password)
stdin, stdout, stderr = client.exec_command('show system resources | inc CPU')
raw = stdout.read().decode()
cpu = raw.split()[2] # 提取CPU利用率
client.close()
return {'host': host, 'cpu': cpu, 'time': datetime.now().isoformat()}
def get_huawei_status(host, user, password):
# 华为USG使用CLI命令:display cpu-usage
# 实现逻辑类似,不同在于命令和输出解析
pass
# 批量执行
devices = [('192.168.1.1', 'admin', 'pass'), ('192.168.1.2', 'user', 'pswd')]
results = []
for ip, u, p in devices:
if ip == '192.168.1.1':
data = get_cisco_status(ip, u, p)
else:
data = get_huawei_status(ip, u, p)
results.append(data)
print(json.dumps(results, indent=2))
进阶技巧:
- 使用
asyncio库实现多设备并发连接,大幅提高轮询速度 - 对不同品牌设备配置命令映射字典,避免硬编码函数
- 异常处理:连接失败时写入告警文件,而非中断整个循环
Q:如果防火墙启用了SSH密钥认证而非密码,脚本如何适配?
A:Paramiko支持私钥连接:client.connect(pkey_file='~/.ssh/id_rsa'),建议公司维护统一的SSH堡垒机,脚本通过堡垒机跳转访问内网防火墙,同时记录审计日志。
脚本输出格式化:从原始数据到表格、JSON、告警提示
原始输出难以直接用于报表,推荐以下格式:
表格形式(适用于终端查看):
printf "%-20s %-8s %-10s %-12s\n" "时间" "CPU%" "连接数" "状态" printf "%-20s %-8s %-10s %-12s\n" "$TIMESTAMP" "$CPU" "$CONN" "OK"
JSON格式(适用于API推送):
{
"timestamp": "2024-03-15T14:30:00Z",
"hosts": [
{"name": "FW-01", "cpu": 45.2, "connections": 12345, "status": "healthy"},
{"name": "FW-02", "cpu": 78.9, "connections": 45678, "status": "warning"}
]
}
告警触发:脚本结合阈值判断,当CPU > 80%或连接数 > 50000时,调用Webhook发送企业微信/钉钉告警。
Q:如何将脚本输出直接发送到Elasticsearch/Kafka?
A:Python脚本内集成elasticsearch库或kafka-python,在采集循环中直接插入数据。es.index(index='fw-status', body=json_data),实现实时搜索分析。
自动化集成:将脚本嵌入Zabbix/Prometheus实现持续监控
Zabbix通过外部脚本采集
- 在Zabbix Agent端配置
UserParameter=fw.status[*],/opt/scripts/get_fw_status.sh $1 - 在Web端创建监控项,类型选择“外部检查”,键值如
fw.status[192.168.1.1] - 设置触发器表达式
{Template:fw.status.cpu.last()}>80
Prometheus Exporter模式
开发一个HTTP服务器,脚本每隔间隔采集数据后暴露/metrics端点:
# prometheus_fw_exporter.py (片段)
from prometheus_client import start_http_server, Gauge
g_cpu = Gauge('fw_cpu_percent', 'CPU usage', ['hostname'])
# 采集循环
g_cpu.labels(hostname='FW-01').set(cpu_value)
启动后Prometheus通过targets抓取,再结合Grafana展示看板。
Q:监控平台与脚本如何保证数据安全?
A:脚本内不应明文存储密码,建议使用:
- 环境变量注入(如
os.getenv('FW_PASS'))- 使用HashiCorp Vault或Ansible Vault加密凭据
- 专属监控专用只读用户,并限制源IP
常见问题Q&A
Q1:脚本执行时提示“Permission denied”怎么办?
A:原因通常是未免密sudo,执行visudo添加:
nobody ALL=(ALL) NOPASSWD: /usr/bin/iptables, /usr/bin/conntrack
若脚本以root运行,直接给予root环境。
Q2:连接华为防火墙时命令输出为中文乱码如何解决?
A:在SSH连接后执行terminal language en切换为英文输出,或指定SSH环境变量LANG=en_US.UTF-8。
Q3:脚本对于不同版本的FortiOS(5.x vs 7.x)如何兼容?
A:先通过get system status | grep Version获取版本号,然后在代码中做版本条件分支,
if 'v7.0' in version:
api_path = '/api/v2/monitor/system/cpu'
else:
api_path = '/api/v1/monitor/system/cpu'
Q4:脚本采集过于频繁导致防火墙CPU飙升怎么办?
A:调整轮询间隔至至少60秒以上;对于重要设备,使用SNMP替代SSH(SNMP的UDP查询对设备影响极小);同时可对脚本设置锁文件防止并发执行。
总结与最佳实践建议
用脚本获取防火墙状态是运维自动化的基础环节,最佳实践应涵盖:
- 标准化采集:无论品牌,统一输出关键指标字段(时间戳、设备名、CPU、内存、连接数)
- 低侵入式监控:优先使用SNMP/API,避免频繁SSH登陆记录日志
- 异常自愈机制:脚本检测到连接失败应自动重试3次,然后跳过,而非阻塞后续设备
- 数据生命周期:历史数据按天归档,保留90天供趋势分析,同时压缩存储
- 安全第一:凭证管理、传输加密(SSH/REST HTTPS)、最小权限原则
最终建议:在小型环境(<50台设备)可以直接用上述基于文件输出的方案;中大型网络建议建设统一的网络管理平台(SolarWinds、Prometheus+SNMP Exporter),脚本仅作为定制化补充。
立即行动:从克隆一个GitHub上的iptables采集脚本开始,修改设备列表和输出格式,两周内即可见到自动化巡检带来的效率提升,哪怕只自动化1台核心防火墙,也能避免深夜被电话吵醒的风险。
(完整示例脚本代码及Zabbix/Prometheus配置模板已整理成可复用的Markdown文件,可联系作者获取,本文建议结合企业实际网络架构调整使用。)