ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Zeek MMDB 内置函数详解:基于 MaxMind GeoIP 库实现 IP 地理位置与 ASN 查询

Zeek MMDB 内置函数详解:基于 MaxMind GeoIP 库实现 IP 地理位置与 ASN 查询 网络安全网络IDS【免费下载链接】zeekZeek is a powerful network analysis framework that is much different from the typical IDS you may know.项目地址https://gitcode.com/gh_mirrors/ze/zeek点击查看免费下载本文围绕 Zeek 内置的base/bif/mmdb.bif.zeek一组 MaxMind MMDB 查询函数展开系统讲解lookup_location、lookup_autonomous_system及两个数据库初始化函数的用法、返回结构与底层实现原理并结合mmdb_dir等脚本层配置与src/MMDB.cc源码给出可直接落地的 GeoIP 集成方案。读完本文你将能够在 Zeek 中完成 IP 归属地国家、地区、城市、经纬度与自治域ASN 编号、组织名的实时查询并把结果接入 Notice、SSH 分析等现有框架。一、功能概览Zeek 的 MaxMind MMDB 支持Zeek 通过一组脚本层内置函数BiF暴露对 MaxMind 数据库.mmdb格式的查询能力全部位于全局命名空间GLOBAL下共 4 个函数函数类型签名作用mmdb_open_location_dbfunction(f: string): bool打开地理位置数据库City 或 Country供lookup_location使用mmdb_open_asn_dbfunction(f: string): bool打开 ASN 数据库供lookup_autonomous_system使用lookup_locationfunction(a: addr): geo_location查询 IP 地址的地理位置lookup_autonomous_systemfunction(a: addr): geo_autonomous_system查询 IP 地址所属自治域信息这组函数的接口定义位于 src/mmdb.bif其 C 实现位于 src/MMDB.cc 与 src/MMDB.h。前提条件以上所有函数都要求 Zeek 在编译时启用libmaxminddb支持文档与源码均标注 Requires Zeek to be built with libmaxminddb。构建时通过configure脚本的--with-geoipPATH选项指定 libmaxminddb 安装根目录见 configure编译宏为USE_GEOIP。二、函数详解2.1 mmdb_open_location_db(f: string): bool# 打开 MaxMind City 或 Country 数据库 if ( mmdb_open_location_db(/usr/share/GeoIP/GeoLite2-City.mmdb) ) print location DB opened;参数fMaxMind City 或 Country 数据库的文件名。返回值布尔值指示数据库是否成功打开文件不存在或MMDB_open失败时返回F。作用为后续的lookup_location调用初始化 MMDB 实例调用后查询走显式指定的文件路径而不再依赖脚本层配置。2.2 mmdb_open_asn_db(f: string): bool# 打开 MaxMind ASN 数据库 if ( mmdb_open_asn_db(/usr/share/GeoIP/GeoLite2-ASN.mmdb) ) print ASN DB opened;参数fMaxMind ASN 数据库的文件名。返回值布尔值指示数据库是否成功打开。作用为后续的lookup_autonomous_system调用初始化 ASN 数据库实例。在源码层面两个打开函数分别作用于两个全局单例对象位置库LocDB mmdb_loc与 ASN 库AsnDB mmdb_asn见 src/MMDB.cc。当 Zeek 未以 GeoIP 支持编译时这两个函数直接返回F见 src/MMDB.cc调用方需自行容错。2.3 lookup_location(a: addr): geo_locationlocal loc lookup_location(8.8.8.8); if ( loc?$country_code ) print fmt(country: %s, city: %s, lat: %.2f, lon: %.2f, loc$country_code, loc$city, loc$latitude, loc$longitude);参数a待查询的 IP 地址同时支持 IPv4 与 IPv6。返回值geo_location记录包含国家、地区、城市、纬度与经度。若数据库未加载、查询失败或地址在库中无匹配条目返回的将是字段全部缺省optional的空记录调用方应通过?$field形式判断字段是否存在参考 scripts/base/utils/geoip-distance.zeek 的写法。底层实现中Zeek 将 IP 转换为sockaddr后调用 libmaxminddb 的MMDB_lookup_sockaddr随后依次读取country/iso_code、subdivisions/0/iso_code、city/names/en、location/latitude、location/longitude五个数据路径并填入记录见 src/MMDB.cc。2.4 lookup_autonomous_system(a: addr): geo_autonomous_systemlocal asn lookup_autonomous_system(1.1.1.1); if ( asn?$number ) print fmt(AS%d (%s), asn$number, asn$organization);参数a待查询的 IP 地址。返回值geo_autonomous_system记录包含自治域编号与组织名称。底层读取autonomous_system_numberUINT32 类型与autonomous_system_organizationUTF-8 字符串两个数据路径见 src/MMDB.cc。三、返回记录类型定义两个查询函数的返回记录类型定义于 scripts/base/init-bare.zeektype geo_location: record { country_code: string optional; ## The country code. region: string optional; ## The region. city: string optional; ## The city. latitude: double optional; ## Latitude. longitude: double optional; ## Longitude. } log; type geo_autonomous_system: record { number: count optional; ## The autonomous system number. organization: string optional; ## Associated organization. } log;两个记录类型均带log属性因此可直接作为日志字段如 Notice 记录中的remote_location: geo_location log optional参与结构化日志输出。字段全部optional意味着任何一次查询都可能返回缺省字段的记录消费方必须做好空值防御。四、数据库加载配置脚本层常量除显式调用mmdb_open_*_db外Zeek 还支持完全通过脚本层配置自动加载数据库。相关的可重定义常量同样定义在 scripts/base/init-bare.zeek常量默认值说明mmdb_dir存放 MaxMind.mmdb文件的目录为空时跳过直接尝试 fallback 目录mmdb_city_dbGeoLite2-City.mmdbCity 数据库文件名mmdb_country_dbGeoLite2-Country.mmdbCountry 数据库文件名mmdb_asn_dbGeoLite2-ASN.mmdbASN 数据库文件名mmdb_dir_fallbacksvector(/usr/share/GeoIP, /var/lib/GeoIP, /usr/local/share/GeoIP, /usr/local/var/GeoIP)当mmdb_dir未设置或读取失败时尝试的备选目录mmdb_stale_check_interval5min数据库文件陈旧性检查间隔设为负值可关闭自动重载典型配置方式在local.zeek或站点脚本中redefredef mmdb_dir /data/geoip; redef mmdb_city_db GeoLite2-City.mmdb; redef mmdb_asn_db GeoLite2-ASN.mmdb;加载优先级见 src/MMDB.cc 的OpenFromScriptConfig实现位置库LocDB先尝试mmdb_dir/mmdb_city_dbCity 优先于 Country注释明确 City database is always preferred over Country database失败后依次尝试mmdb_dir_fallbacks中的每个目录下的 City 库再尝试 Country 库ASN 库AsnDB尝试mmdb_dir/mmdb_asn_db失败后遍历mmdb_dir_fallbacks各目录下的 ASN 库。五、底层实现原理5.1 MMDB 类的生命周期管理src/MMDB.h 中的MMDB类封装了 libmaxminddb 的底层MMDB_s结构核心方法包括OpenFile(filename)调用stat检查文件存在性再以MMAP 模式MMDB_MODE_MMAP调用MMDB_open失败时输出 Failed to open MaxMind DB 错误并返回F见 src/MMDB.ccEnsureLoaded()每次查询前的统一加载入口。其逻辑为无显式文件名时走脚本配置加载OpenFromScriptConfig有文件名但未加载时加载已加载但检测到文件已陈旧inode 或 mtime 变化则关闭并重新打开。失败时通过emit_builtin_error抛出一次 Failed to open ... 内置错误reported_error标志保证同一数据库只报告一次见 src/MMDB.ccIsStaleDB()依据mmdb_stale_check_interval定时对文件执行stat比较st_ino与st_mtime若外部进程替换了.mmdb文件例如定时更新 GeoIP 数据Zeek 会在下一次查询时自动重载无需重启进程见 src/MMDB.cc。这与显式打开方式的语义一致MMDB类注释明确说明跟踪文件的 inode 与修改时间以检测陈旧数据库并在首次检测到陈旧的查询时从同一文件系统位置重新加载见 src/MMDB.h。5.2 IPv4/IPv6 双栈查询Lookup方法根据地址族构造sockaddr_in或sockaddr_in6再交给MMDB_lookup_sockaddr查询出错时记录 MaxMind DB lookup location error 并关闭数据库返回是否命中条目见 src/MMDB.cc。5.3 错误消息抑制机制为避免高流量下刷屏查询过程中产生的错误消息如数据路径不匹配通过report_msg做了限流每 300 秒msg_suppression_duration最多输出 20 条msg_limitMaxMind 错误信息见 src/MMDB.cc。5.4 未编译 GeoIP 支持时的行为当 Zeek 以USE_GEOIP之外的配置构建时lookup_location与lookup_autonomous_system仍返回结构完整的空记录但会通过emit_builtin_error输出一次 Zeek was not configured for GeoIP support 提示missing_geoip_reported保证只报一次避免脚本因字段访问崩溃见 src/MMDB.cc。六、实战集成示例6.1 为 Notice 自动附加地理位置Zeek 自带base/frameworks/notice/actions/add-geodata脚本通过Notice::lookup_location_types选项指定需要地理位置信息的 Notice 类型框架会自动对远端地址调用lookup_location并填入Info$remote_location见 scripts/base/frameworks/notice/actions/add-geodata.zeekload base/frameworks/notice/actions/add-geodata load base/utils/site redef Notice::lookup_location_types { SSH::Password_Guessing }; redef Site::local_nets { 192.168.0.0/16 };前提是Site::local_nets已定义脚本据此判断连接中哪个地址是本地、哪个是远端。6.2 计算两个 IP 间的球面距离base/utils/geoip-distance提供haversine_distance_ip(a1, a2)函数内部对两个地址分别执行lookup_location再基于经纬度用 haversine 公式计算英里距离任一地址缺少经纬度时返回-1.0见 scripts/base/utils/geoip-distance.zeek。6.3 在 SSH 分析中记录地理信息scripts/policy/protocols/ssh/geo-data.zeek展示了在连接日志中挂接地理位置的完整做法——通过get_location(c: connection): geo_location包装lookup_location并对空记录做$字段判定见 scripts/policy/protocols/ssh/geo-data.zeek。七、使用注意事项数据库文件更新Zeek 通过 inode/mtime 变化自动重载数据库默认 5 分钟检查一次mmdb_stale_check_interval可调直接替换.mmdb文件即可完成热更新无需重启。City 库优先位置查询优先加载 City 库若目录下只有 Country 库也能工作但region、city、经纬度等字段将缺失。空值防御所有返回字段均为optional消费前务必用field?$name判定或先判断mmdb_open_*_db/EnsureLoaded的结果。构建期依赖这些函数在未以--with-geoip编译的 Zeek 中不会生效打开函数恒返回F查询函数返回空记录并报一次错部署前需确认构建配置与USE_GEOIP宏。赞分享网络安全网络IDS【免费下载链接】zeekZeek is a powerful network analysis framework that is much different from the typical IDS you may know.项目地址https://gitcode.com/gh_mirrors/ze/zeek点击查看免费下载相关推荐RVC变声器完整落地从环境到出模型只需做对3个关键决策RVC变声器完整落地从环境到出模型只需做对3个关键决策 Retrieval based Voice Conversion WebUI社区通称 RVC是一人工智能AI 应用语音音频深度学习GeoIP终极指南轻松实现IP地址地理位置定位GeoIP终极指南轻松实现IP地址地理位置定位 在当今数字化时代了解用户的地理位置信息对许多应用场景至关重要。GeoIP作为一款高效的Ruby gem能够【亲测免费】 推荐使用 node-geoip: 快速、轻量级的 IP 地址地理位置查询库推荐使用 node geoip: 快速、轻量级的 IP 地址地理位置查询库 如果你需要在 Node.js 应用程序中查询 IP 地址对应的地理位置信息那么我强后端上一篇【亲测免费】 探索Three3d-view交互式3D视图的创新工具下一篇Celery Worker 心跳机制深度解析celery.worker.consumer.heart 模块与事件心跳实现创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表