本文目录导读:

- 场景一:分析 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 等)提供更详细的脚本示例吗?
版权声明:NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播