当前位置: 首页 > news >正文

手把手教你用MaxMind GeoIP数据库分析fail2ban攻击日志(附Python代码)

实战指南:利用MaxMind GeoIP深度解析fail2ban攻击日志

最近在维护几台云服务器时,发现fail2ban的拦截记录每天都在快速增长。作为运维人员,我们不仅要拦截攻击,更需要了解攻击来源。本文将分享如何通过MaxMind GeoIP数据库对fail2ban日志进行地理位置分析,帮助您从海量日志中提取有价值的安全情报。

1. 环境准备与工具选型

在开始之前,我们需要准备以下工具和环境:

  • MaxMind GeoLite2数据库:提供IP地址与地理位置的映射关系
  • Python 3.6+环境:用于编写分析脚本
  • sqlite3命令行工具:用于直接查看fail2ban数据库
  • geoip2 Python库:MaxMind官方提供的数据库查询接口

提示:虽然GeoLite2是免费版本,但自2019年12月30日起,MaxMind要求用户注册账户后才能下载。注册过程简单,只需提供有效的电子邮箱地址。

安装必要的Python依赖:

pip install geoip2 sqlite3 pandas matplotlib

对于Ubuntu/Debian系统,还需要安装sqlite3命令行工具:

sudo apt update sudo apt install sqlite3

2. 获取并理解fail2ban日志数据

fail2ban默认将拦截记录存储在SQLite数据库中,位置通常为:

/var/lib/fail2ban/fail2ban.sqlite3

我们可以先用sqlite3命令行工具快速查看数据库结构:

sqlite3 /var/lib/fail2ban/fail2ban.sqlite3

在sqlite交互界面中,查看所有表:

SELECT name FROM sqlite_master WHERE type='table';

典型输出可能包括:

  • bips:存储所有被ban的IP及其相关信息
  • bans:记录每次ban操作的详细信息
  • logs:fail2ban的内部日志
  • jails:配置的jail信息

对于攻击来源分析,我们主要关注bips表,它包含了被封锁IP的核心数据。可以通过以下查询了解表结构:

PRAGMA table_info(bips);

3. 下载和配置MaxMind GeoLite2数据库

访问MaxMind官网(https://www.maxmind.com)并登录后,可以下载以下类型的免费数据库:

  1. GeoLite2-ASN:IP地址与自治系统号(ASN)的映射
  2. GeoLite2-City:城市级别的IP地理位置数据
  3. GeoLite2-Country:国家级别的IP地理位置数据

对于安全分析,推荐下载GeoLite2-City,它提供了足够详细的位置信息。下载后会得到一个.mmdb格式的二进制文件。

注意:免费版的GeoLite2-City在某些地区(特别是东亚)的位置精度可能有限,通常只能精确到国家或省级别。

4. Python实战:构建攻击来源分析工具

下面是一个完整的Python脚本,用于从fail2ban数据库提取IP并分析其地理位置:

import sqlite3 import geoip2.database from collections import Counter import pandas as pd import matplotlib.pyplot as plt # 配置路径 FAIL2BAN_DB = '/var/lib/fail2ban/fail2ban.sqlite3' GEOIP_DB = '/path/to/GeoLite2-City.mmdb' def analyze_attacks(): # 连接fail2ban数据库 conn = sqlite3.connect(FAIL2BAN_DB) cursor = conn.cursor() # 获取所有被ban的IP cursor.execute("SELECT ip FROM bips") ips = [row[0] for row in cursor.fetchall()] # 初始化GeoIP读取器 geo_reader = geoip2.database.Reader(GEOIP_DB) # 分析每个IP的地理位置 countries = [] cities = [] for ip in ips: try: response = geo_reader.city(ip) countries.append(response.country.name) cities.append(response.city.name if response.city.name else "Unknown") except: countries.append("Unknown") cities.append("Unknown") # 统计结果 country_stats = Counter(countries) city_stats = Counter(cities) # 输出前10的攻击来源国家 print("\nTop 10攻击来源国家:") for country, count in country_stats.most_common(10): print(f"{country}: {count}次") # 输出前10的攻击来源城市 print("\nTop 10攻击来源城市:") for city, count in city_stats.most_common(10): print(f"{city}: {count}次") # 可视化展示 df = pd.DataFrame({'Country': countries, 'City': cities, 'IP': ips}) # 按国家统计图表 df['Country'].value_counts().head(10).plot(kind='bar', figsize=(10,6)) plt.title('Top 10攻击来源国家') plt.ylabel('攻击次数') plt.tight_layout() plt.savefig('attack_by_country.png') # 关闭连接 geo_reader.close() conn.close() if __name__ == "__main__": analyze_attacks()

这个脚本主要功能包括:

  1. 从fail2ban数据库提取所有被ban的IP地址
  2. 使用MaxMind数据库查询每个IP的地理位置
  3. 统计攻击来源国家和城市分布
  4. 生成可视化图表

5. 高级分析与实战技巧

5.1 时间维度分析

除了地理位置,我们还可以分析攻击的时间模式:

# 在analyze_attacks函数中添加时间分析 cursor.execute("SELECT timeofban FROM bips ORDER BY timeofban") timestamps = [row[0] for row in cursor.fetchall()] # 转换为datetime并分析 import datetime times = [datetime.datetime.fromtimestamp(ts) for ts in timestamps] # 按小时统计攻击频率 hours = [t.hour for t in times] pd.Series(hours).value_counts().sort_index().plot(kind='bar', figsize=(10,6)) plt.title('攻击时间分布(按小时)') plt.xlabel('小时') plt.ylabel('攻击次数') plt.savefig('attack_by_hour.png')

5.2 自治系统(ASN)分析

了解攻击IP所属的网络运营商也很有价值:

# 使用GeoLite2-ASN数据库分析 asn_reader = geoip2.database.Reader('/path/to/GeoLite2-ASN.mmdb') asns = [] for ip in ips: try: response = asn_reader.asn(ip) asns.append(response.autonomous_system_organization) except: asns.append("Unknown") asn_stats = Counter(asns) print("\nTop 10攻击来源ASN:") for asn, count in asn_stats.most_common(10): print(f"{asn}: {count}次")

5.3 数据持久化与历史分析

为了长期跟踪攻击趋势,可以将分析结果保存到数据库:

import sqlite3 from datetime import datetime def save_analysis_results(country_stats, city_stats): conn = sqlite3.connect('attack_analysis.db') cursor = conn.cursor() # 创建表(如果不存在) cursor.execute(""" CREATE TABLE IF NOT EXISTS attack_stats ( date TEXT PRIMARY KEY, total_attacks INTEGER, top_country TEXT, top_country_count INTEGER, top_city TEXT, top_city_count INTEGER ) """) # 插入当前分析结果 today = datetime.now().strftime('%Y-%m-%d') top_country, top_country_count = country_stats.most_common(1)[0] top_city, top_city_count = city_stats.most_common(1)[0] cursor.execute(""" INSERT OR REPLACE INTO attack_stats VALUES (?, ?, ?, ?, ?, ?) """, (today, len(ips), top_country, top_country_count, top_city, top_city_count)) conn.commit() conn.close()

6. 可视化展示与报告生成

将分析结果可视化能更直观地理解攻击模式。我们可以使用matplotlib和pandas生成专业图表:

def generate_visual_report(df): # 设置绘图风格 plt.style.use('seaborn') # 创建画布 fig, axes = plt.subplots(2, 2, figsize=(15, 12)) fig.suptitle('Fail2Ban攻击分析报告', fontsize=16) # 国家分布 country_counts = df['Country'].value_counts().head(10) axes[0,0].bar(country_counts.index, country_counts.values) axes[0,0].set_title('Top 10攻击来源国家') axes[0,0].tick_params(axis='x', rotation=45) # 城市分布 city_counts = df[df['City'] != 'Unknown']['City'].value_counts().head(10) axes[0,1].bar(city_counts.index, city_counts.values, color='orange') axes[0,1].set_title('Top 10攻击来源城市') axes[0,1].tick_params(axis='x', rotation=45) # 时间分布 df['Hour'] = pd.to_datetime(df['Timestamp'], unit='s').dt.hour hour_counts = df['Hour'].value_counts().sort_index() axes[1,0].plot(hour_counts.index, hour_counts.values, marker='o') axes[1,0].set_title('攻击时间分布(24小时)') axes[1,0].set_xlabel('小时') axes[1,0].set_xticks(range(24)) # ASN分布 asn_counts = df['ASN'].value_counts().head(10) axes[1,1].barh(asn_counts.index, asn_counts.values, color='green') axes[1,1].set_title('Top 10攻击来源网络(ASN)') # 调整布局并保存 plt.tight_layout() plt.savefig('attack_analysis_report.png', dpi=300, bbox_inches='tight')

7. 安全加固建议

基于分析结果,我们可以采取更有针对性的安全措施:

  1. 地理封锁:如果发现大量攻击来自特定国家/地区,可以考虑在防火墙层面屏蔽这些地区的IP段

    # 示例:使用iptables屏蔽特定国家代码 iptables -A INPUT -m geoip --src-cc CN,RU -j DROP
  2. 服务加固

    • 更改SSH默认端口
    • 禁用密码认证,改用密钥认证
    • 设置fail2ban更严格的封禁规则
  3. 监控与告警

    • 设置自动化脚本定期分析fail2ban日志
    • 当检测到异常攻击模式时发送告警
  4. 网络架构优化

    • 将面向公网的服务放在跳板机后面
    • 使用VPN访问管理接口

在实际项目中,我发现将分析脚本设置为每日定时任务非常有用。通过长期收集数据,可以识别出攻击模式的变化趋势,为安全决策提供数据支持。

http://www.cnnetsun.cn/news/1403349.html

相关文章:

  • 北大数字普惠金融指数省市县2011-2024面板数据
  • C++ string 类常用接口解析(附代码介绍)
  • LA04-Abaqus嵌合体退火仿真案例教程:完全热力耦合分析的实践与解析
  • 在 OpenClaw 里一句话记账:消费说出来,账单自动进乖猫记账 App
  • 【2026 最新】一篇文章告诉你什么是Skills 同时 告别Prompt工程!用Claude Skills把AI变成你的专属打工人
  • RAG 不是记忆:深度对比RAG 与TiMem 架构差异,向量检索为何不够用
  • 电池材料行业数据管理新突破:AI4S驱动的科学数据平台正在重塑电池材料开发范式
  • 销售客户跟进频率难把握?数字员工自动定次数,不烦客户不遗漏
  • 复杂查询性能优化:连接条件下推的代价模型设计与实践
  • RHEL——NoSQL集群技术
  • OJ前端页面开发
  • PaddleOCR系列——《文本检测、文本识别》模型训练
  • LangBot:企业级即时通讯 AI 机器人平台 介绍篇
  • 【超详细】2026年OpenClaw云端零基础1分钟部署及使用教程
  • 告别机械音!Qwen3-TTS实测:97ms低延迟生成真人级语音
  • 【上位机心法】别让传感器数据卡死你的 UI!撕碎 Qt/QML 渲染黑盒,用 C++ 后端打造 144Hz 零延迟工业仪表盘
  • 小白也能玩转DeepSeek-OCR:图文并茂的部署使用教程
  • Qwen3-TTS语音合成生产环境部署:高并发流式API服务搭建实践
  • S12SD紫外线传感器在MSPM0G3507上的低功耗模拟接口移植
  • csdn访问量越来越低-----可能要做好转移数据的准备
  • NEC红外协议串口模块:5字节指令实现红外编解码
  • 光储融合的深度重构:2024年电站建设方案的数字基因与商业进化(WORD)
  • ESP32驱动0.96寸TFT屏幕避坑指南:ST7735初始化与坐标偏移实战
  • AI气候影响小于预期,或助力绿色技术创新
  • 一文讲清全面质量管理是什么意思?全面质量管理的核心是什么?
  • 计算机毕业设计springboot高校学生学业预警系统 基于SpringBoot的高校学业风险监测与干预平台 SpringBoot框架下大学生学业状态智能追踪与预警平台
  • CentOS 7下GTK2开发环境搭建全攻略(附常见错误解决方案)
  • 功能测试、自动化测试、性能测试的区别?
  • 【Dify企业级私有化部署终极指南】:5大架构选型对比、3类典型故障复盘与2024年生产环境落地 checklist
  • Qwen3-32B-Chat镜像部署教程:transformers tokenizer.pad_token_id设置要点