直接从fail2ban的sqlite数据库(/var/lib/fail2ban/fail2ban.sqlite3)提取bips表ip数据,结合maxmind geolite2-city.mmdb进行地理定位,可精准识别攻击来源国、城市及asn,支撑针对性限流等安全决策。

直接从 fail2ban 的封禁记录里提取地域信息,不是为了凑热闹,而是为了看清谁在敲你的门、从哪条路来。攻击 IP 本身只是数字,加上国家、城市、经纬度这些地理标签后,才真正具备决策价值——比如发现 78% 的爆破请求来自越南某 ISP 的 /22 网段,那就可以针对性限流,而不是盲目扩大封禁范围。
确认 fail2ban 数据来源位置
默认情况下,fail2ban 使用 SQLite 存储封禁数据,路径固定为 /var/lib/fail2ban/fail2ban.sqlite3。这个数据库比日志文件更结构化,适合批量分析:
- bips 表:含所有被封 IP、失败次数、首次触发时间,是地域分析的主数据源
- bans 表:只存当前生效的封禁项,适合做实时地理监控
- 操作前先备份:
cp /var/lib/fail2ban/fail2ban.sqlite3 /tmp/fail2ban-backup.sqlite3
获取并加载 MaxMind GeoLite2 数据库
GeoLite2 是免费但需注册下载的权威地理库,2026 年仍有效。注意两点关键事实:
- 每月第一个周二更新,当前最新版发布于 6 月 2 日(符合“每月首周二”规律)
- 过期版本会导致约 12% 的定位偏差,尤其影响东南亚和东欧地区的城市级精度
- 下载后解压得到 GeoLite2-Country.mmdb 和 GeoLite2-City.mmdb,后者支持城市级定位,推荐优先使用
用 Python 提取带地理标签的攻击清单
核心逻辑是:读取 bips 表 → 对每个 IP 调用 GeoLite2 查询 → 合并国家、城市、ASN 信息。示例脚本关键步骤:
- 安装依赖:
pip install geoip2 pandas - 连接数据库:
conn = sqlite3.connect("/var/lib/fail2ban/fail2ban.sqlite3") - 查询语句:
SELECT ip, failures, time FROM bips WHERE time > strftime('%s','now','-7 days') - GeoIP 查询示例:
reader.city(ip).country.name或reader.city(ip).city.name - 输出可导出为 CSV,字段建议包含:IP、国家、城市、失败次数、首次触发时间
从地理分布中识别真实风险信号
单纯统计“多少个 IP 来自某国”意义有限,要结合业务实际看异常:
- 若服务用户全在国内,却出现大量俄罗斯、伊朗 IP 的 SSH 尝试,基本可判定为恶意扫描
- 同一 ASN 下多个 IP 在 1 小时内密集触发,比单个 IP 多次尝试更危险
- 注意时间规律:某些地区攻击集中在本地工作时间(如越南攻击多出现在 UTC+7 的 9–18 点)
- 避免误判:部分 CDN 或云服务商出口 IP 地域标签不准,需交叉验证 ASN 信息











