本文目录导读:

- 场景一:分析 iptables/nftables 日志(Linux 防火墙)
- 场景二:对接 Fortinet / Palo Alto / 华为 等 API(企业级防火墙)
- 场景三:通用方案 - 解析 syslog 日志文件(任何输出 syslog 的防火墙)
- 如何选择并定制?
是的,可以通过实用脚本自动生成防火墙报表,常见的做法是利用脚本(如 Python、Bash、PowerShell)来:
- 连接防火墙(通过 SSH、API、syslog 等获取日志)。
- 解析日志数据(提取源/目的IP、端口、动作、时间等)。
- 统计与聚合(生成流量排名、拒绝规则命中、威胁事件等)。
- 输出报表(生成 CSV、HTML、PDF 或发送到监控平台)。
下面提供几个不同场景的实用脚本示例,你可以根据使用的防火墙类型和环境选择参考。
分析 iptables/nftables 日志(Linux 防火墙)
如果你的防火墙是 Linux 服务器(使用 iptables/nftables),日志通常记录在 /var/log/messages 或 kern.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)
使用方法:
- 保存脚本为
fw_report.py。 - 确保有读取日志的权限(可能需要
sudo)。 - 运行:
sudo python3 fw_report.py。 - 会生成一个包含 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 等)提供更详细的脚本示例吗?