实用脚本能自动生成防火墙报表吗?

wen 实用脚本 3

本文目录导读:

实用脚本能自动生成防火墙报表吗?

  1. 场景一:分析 iptables/nftables 日志(Linux 防火墙)
  2. 场景二:对接 Fortinet / Palo Alto / 华为 等 API(企业级防火墙)
  3. 场景三:通用方案 - 解析 syslog 日志文件(任何输出 syslog 的防火墙)
  4. 如何选择并定制?

是的,可以通过实用脚本自动生成防火墙报表,常见的做法是利用脚本(如 Python、Bash、PowerShell)来:

  1. 连接防火墙(通过 SSH、API、syslog 等获取日志)。
  2. 解析日志数据(提取源/目的IP、端口、动作、时间等)。
  3. 统计与聚合(生成流量排名、拒绝规则命中、威胁事件等)。
  4. 输出报表(生成 CSV、HTML、PDF 或发送到监控平台)。

下面提供几个不同场景的实用脚本示例,你可以根据使用的防火墙类型和环境选择参考。


分析 iptables/nftables 日志(Linux 防火墙)

如果你的防火墙是 Linux 服务器(使用 iptables/nftables),日志通常记录在 /var/log/messageskern.log

示例脚本(Python):统计被拒绝最多的源 IP 并生成 CSV 报表

#!/usr/bin/env python3
"""解析syslog中的iptables日志,生成拒绝IP排名报表"""
import re
from collections import Counter
import csv
from datetime import datetime
LOG_FILE = "/var/log/kern.log"  # 根据实际情况修改
OUTPUT_CSV = f"firewall_report_{datetime.now().strftime('%Y%m%d_%H%M%S')}.csv"
def parse_logs():
    block_counter = Counter()
    pattern = r"SRC=(\S+).*DPT=(\d+).*DROP"  # 匹配iptables DROP记录
    with open(LOG_FILE, 'r') as f:
        for line in f:
            if "DROP" in line:
                match = re.search(pattern, line)
                if match:
                    src_ip = match.group(1)
                    dst_port = match.group(2)
                    block_counter[(src_ip, dst_port)] += 1
    return block_counter
def generate_report(data):
    # 按被拒绝次数排序
    sorted_data = sorted(data.items(), key=lambda x: x[1], reverse=True)[:50]  # Top 50
    with open(OUTPUT_CSV, 'w', newline='') as csvfile:
        writer = csv.writer(csvfile)
        writer.writerow(["源IP", "目的端口", "被拒绝次数", "报表生成时间"])
        for (ip, port), count in sorted_data:
            writer.writerow([ip, port, count, datetime.now()])
    print(f"[+] 报表已生成: {OUTPUT_CSV}")
if __name__ == "__main__":
    print("[*] 正在解析防火墙日志...")
    blocked_data = parse_logs()
    generate_report(blocked_data)

使用方法:

  1. 保存脚本为 fw_report.py
  2. 确保有读取日志的权限(可能需要 sudo)。
  3. 运行:sudo python3 fw_report.py
  4. 会生成一个包含 Top 50 被拒绝 IP 的 CSV 文件。

对接 Fortinet / Palo Alto / 华为 等 API(企业级防火墙)

现代企业防火墙大多提供 REST API,以下以 Fortinet FortiGate 为例,用 Python requests 库获取策略命中统计。

示例脚本(Python):通过 FortiGate API 获取流量排名并生成 HTML 报表

#!/usr/bin/env python3
"""通过FortiGate REST API获取top流量源/目的,生成HTML报表"""
import requests
import json
from datetime import datetime
import base64
# ==== 配置 ====
FORTIGATE_IP = "192.168.1.1"
API_TOKEN = "your_api_token_here"  # 建议使用环境变量
OUTPUT_FILE = f"fortigate_report_{datetime.now().strftime('%Y%m%d_%H%M%S')}.html"
headers = {
    "Authorization": f"Bearer {API_TOKEN}",
    "Content-Type": "application/json"
}
def get_top_sessions():
    """获取防火墙实时会话Top统计(简化示例,实际API路径需查阅文档)"""
    url = f"https://{FORTIGATE_IP}/api/v2/monitor/system/session/top"
    # 实际使用需指定参数,如 source-ip, destination-ip
    try:
        response = requests.get(url, headers=headers, verify=False, timeout=10)
        response.raise_for_status()
        data = response.json()
        return data.get("results", [])
    except Exception as e:
        print(f"[!] API请求失败: {e}")
        return []
def generate_html_report(sessions_data):
    html_content = f"""
    <!DOCTYPE html>
    <html>
    <head><title>防火墙流量报表</title></head>
    <body>
    <h1>FortiGate 流量报表</h1>
    <p>生成时间: {datetime.now()}</p>
    <table border="1">
        <tr><th>源IP</th><th>目的IP</th><th>会话数</th><th>字节数</th></tr>
    """
    for session in sessions_data[:20]:  # 取前20条
        html_content += f"""
        <tr>
            <td>{session.get('src_ip','N/A')}</td>
            <td>{session.get('dst_ip','N/A')}</td>
            <td>{session.get('count',0)}</td>
            <td>{session.get('bytes',0)}</td>
        </tr>
        """
    html_content += "</table></body></html>"
    with open(OUTPUT_FILE, 'w') as f:
        f.write(html_content)
    print(f"[+] HTML报表已生成: {OUTPUT_FILE}")
if __name__ == "__main__":
    print("[*] 正在获取 FortiGate 数据...")
    sessions = get_top_sessions()
    if sessions:
        generate_html_report(sessions)
    else:
        print("[!] 未获取到数据,请检查API权限和网络。")

注意事项:

  • API 路径和参数因防火墙品牌和版本而异,务必查阅对应厂商的 API 文档。
  • 生产环境请将 API Token 存储在环境变量或密钥管理系统中,不要硬编码。
  • 建议添加 verify=True 并使用证书,或确认 API 请求的安全性。

通用方案 - 解析 syslog 日志文件(任何输出 syslog 的防火墙)

许多防火墙(如 pfSense、OPNsense、Cisco ASA)会将日志发送到 syslog 服务器,你可以用脚本定期解析 syslog 文件。

示例脚本(Bash + awk + cron):每日统计自动生成邮件报表

#!/bin/bash
# daily_fw_report.sh - 分析syslog中的防火墙日志并发送邮件
LOG_FILE="/var/log/firewall.log"  # syslog文件路径
TODAY=$(date +"%Y-%m-%d")
REPORT_FILE="/tmp/fw_report_${TODAY}.txt"
EMAIL="admin@example.com"
echo "Firewall Daily Report for ${TODAY}" > "$REPORT_FILE"
echo "=================================" >> "$REPORT_FILE"
# 统计今日被拒绝最多的 Top 10 源IP
echo -e "\nTop 10 Blocked Source IPs:" >> "$REPORT_FILE"
grep "REJECT\|DENY\|DROP" "$LOG_FILE" | grep "$TODAY" | awk '{print $NF}' | sort | uniq -c | sort -rn | head -10 >> "$REPORT_FILE"
# 统计今日最多访问的目的端口
echo -e "\nTop 10 Destination Ports:" >> "$REPORT_FILE"
grep "DPT=\|dst_port=" "$LOG_FILE" | grep "$TODAY" | grep -oP 'DPT=\K[0-9]+' | sort | uniq -c | sort -rn | head -10 >> "$REPORT_FILE"
# 统计今日总拒绝数
echo -e "\nTotal Deny Events: $(grep -c 'REJECT\|DENY\|DROP' "${LOG_FILE}" | wc -l)" >> "$REPORT_FILE"
# 发送邮件(需要安装 mailutils 或 postfix)
mail -s "防火墙日报 ${TODAY}" "$EMAIL" < "$REPORT_FILE"
echo "[+] 日报已生成并发送至 ${EMAIL}"

配置定时任务(crontab):

# 每天凌晨4点执行脚本
0 4 * * * /usr/local/bin/daily_fw_report.sh

如何选择并定制?

你的防火墙类型 推荐方案 关键点
Linux iptables/nftables Python解析syslog 需正确配置日志规则(-j LOG
Fortinet / Palo Alto / 华为 调用REST API 需申请API Token,查阅官方API文档
pfSense / OPNsense 解析syslog + 脚本 需开启日志输出到syslog服务器或本地
Cisco ASA / IOS 解析syslog + 脚本 需配置日志级别和速率限制
硬件防火墙(无API) 导出日志文件解析 通常为syslog或CSV格式

如果想生成更专业、更美观的报表,可以考虑:

  • 使用 Python + ReportLab / Matplotlib 生成包含图表的 PDF。
  • 将数据推送到 Grafana + Loki / Prometheus,实现可视化仪表板。
  • 使用 ELK Stack(Elasticsearch, Logstash, Kibana) 进行集中分析和报表。

需要我针对你的具体防火墙型号(FortiGate、pfSense、华为 USG 等)提供更详细的脚本示例吗?

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