怎么用脚本获取防火墙状态

wen 实用脚本 1

用脚本高效获取并监控网络安全的完整指南

📖 目录导读

  1. 为什么需要脚本获取防火墙状态? —— 痛点与价值分析
  2. 主流防火墙状态获取方式对比 —— CLI、SNMP、API谁更优?
  3. 通用Shell脚本实战:抓取iptables/nftables规则与连接状态
  4. 企业级进阶:Python脚本实现多品牌防火墙(Cisco、华为、Fortinet)状态轮询
  5. 脚本输出格式化:从原始数据到表格、JSON、告警提示
  6. 自动化集成:将脚本嵌入Zabbix/Prometheus实现持续监控
  7. 常见问题Q&A —— 权限、超时、跨平台兼容性解决
  8. 总结与最佳实践建议

为什么需要脚本获取防火墙状态?—— 痛点与价值分析

在日常运维中,防火墙作为网络第一道防线,其运行状态直接影响业务连续性,但人工巡检存在明显缺陷:登录数台设备检查命令输出耗时费力,且凌晨故障难以即时发现。使用脚本自动化获取防火墙状态能解决以下核心痛点:

怎么用脚本获取防火墙状态

  • 实时性:脚本可每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通过外部脚本采集

  1. 在Zabbix Agent端配置UserParameter=fw.status[*],/opt/scripts/get_fw_status.sh $1
  2. 在Web端创建监控项,类型选择“外部检查”,键值如fw.status[192.168.1.1]
  3. 设置触发器表达式{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查询对设备影响极小);同时可对脚本设置锁文件防止并发执行。


总结与最佳实践建议

用脚本获取防火墙状态是运维自动化的基础环节,最佳实践应涵盖:

  1. 标准化采集:无论品牌,统一输出关键指标字段(时间戳、设备名、CPU、内存、连接数)
  2. 低侵入式监控:优先使用SNMP/API,避免频繁SSH登陆记录日志
  3. 异常自愈机制:脚本检测到连接失败应自动重试3次,然后跳过,而非阻塞后续设备
  4. 数据生命周期:历史数据按天归档,保留90天供趋势分析,同时压缩存储
  5. 安全第一:凭证管理、传输加密(SSH/REST HTTPS)、最小权限原则

最终建议:在小型环境(<50台设备)可以直接用上述基于文件输出的方案;中大型网络建议建设统一的网络管理平台(SolarWinds、Prometheus+SNMP Exporter),脚本仅作为定制化补充。

立即行动:从克隆一个GitHub上的iptables采集脚本开始,修改设备列表和输出格式,两周内即可见到自动化巡检带来的效率提升,哪怕只自动化1台核心防火墙,也能避免深夜被电话吵醒的风险。


(完整示例脚本代码及Zabbix/Prometheus配置模板已整理成可复用的Markdown文件,可联系作者获取,本文建议结合企业实际网络架构调整使用。)

抱歉,评论功能暂时关闭!