1 个不稳定版本

0.1.3 2024年1月21日

#224命令行界面

Unlicense OR MIT

33KB
312

geoipsed

使用Rust编写的快速IPv4和IPv6地址地理位置内联装饰

概念

IP地址元数据对于网络安全和事件响应至关重要。城市和国家级别的地理位置可以是判断感兴趣IP地址的有用线索。ASN元数据提供了关于网络所有权的见解,以及简单地识别哪些IP是互联网可路由的,哪些是内部、私有或保留的。

在命令行日志分析中,IP地理位置元数据除了每行上已有的日志元数据外,最有用。 geoipsed 在原地丰富IP地址,保留现有上下文。

功能

  • 支持IPv4和IPv6地址
  • 在可用的元数据中包括城市、国家、ASN和时区字段
  • 灵活的模板,用于自定义如何装饰匹配的IP地址 geoipsed
  • 着色以便更容易地在日志中找到IP地址
  • 可选模式,仅像grep/ripgrep的 -o 参数一样输出匹配的IP地址
  • 从装饰标签中删除空格,以免打乱日志中的列编号

安装

geoipsed 使用Maxmind的GeoLite2-ASN.mmdb和GeoLite2-City.mmdb文件。按照以下说明获取这些文件: https://dev.maxmind.com/geoip/updating-databases

目前,geoipsed 仅在 /usr/share/GeoIP 中查找mmdb文件,但是您可以使用命令行选项 -I 或环境变量 MAXMIND_MMDB_DIR 来覆盖此设置。

使用cargo构建和安装

cargo install --git https://github.com/erichutchins/geoipsed

用法

geoipsed 0.1.3
Inline decoration of IPv4 and IPv6 address geolocations

USAGE:
    geoipsed [OPTIONS] [FILE]...

ARGS:
    <FILE>...    Input file(s) to process. Leave empty or use "-" to read from stdin

OPTIONS:
    -C, --color <COLOR>          Use markers to highlight the matching strings [default: auto]
                                 [possible values: always, never, auto]
    -h, --help                   Print help information
    -I <DIR>                     Specify directory containing GeoLite2-ASN.mmdb and
                                 GeoLite2-City.mmdb [env: MAXMIND_MMDB_DIR=]
    -L, --list-templates         Display a list of available template substitution parameters to use
                                 in --template format string
    -o, --only-matching          Show only nonempty parts of lines that match
    -t, --template <TEMPLATE>    Specify the format of the IP address decoration. Use the
                                 --list-templates option to see which fields are available. Field
                                 names are enclosed in {}, for example "{field1} any fixed string
                                 {field2} & {field3}"
    -V, --version                Print version information

可用于自定义 -t 参数的可用字段

; geoipsed -L
Available template geoip field names are:
{ip}
{asnnum}
{asnorg}
{city}
{continent}
{country_iso}
{country_full}
{latitude}
{longitude}
{timezone}

基准测试

比较Rust实现与基本Python版本对Suricata json eve日志(30,000行,~23MB解压缩)的性能

Benchmark 1: zstdcat ../30k.log.zst | target/release/geoipsed
  Time (mean ± σ):     157.1 ms ±  16.7 ms    [User: 167.8 ms, System: 28.9 ms]
  Range (min … max):   137.1 ms … 209.9 ms    21 runs
 
Benchmark 2: zstdcat ../30k.log.zst | python python/geoipsed.py
  Time (mean ± σ):     15.209 s ±  0.929 s    [User: 15.213 s, System: 0.210 s]
  Range (min … max):   14.312 s … 17.076 s    10 runs
 
Summary
  'zstdcat ../30k.log.zst | target/release/geoipsed' ran
   96.80 ± 11.84 times faster than 'zstdcat ../30k.log.zst | python python/geoipsed.py'
  • 注意,速度差异的一个显著因素是正则表达式匹配,特别是IPv6模式。如果只匹配IPv4,则速度快了大约5倍。

背景与感激

  • geoipsed的历史灵感源于一位师傅很久以前教导我,Perl的s/find/replace/g sed接口可以将替换模式解释为Perl表达式!例如,解码十六进制ASCII码,异或操作并打印字符:perl -pe 's/%([a-f0-9]{2})/chr(hex($1)^0x5e)/ieg。如果我可以运行Perl的chr和hex函数,能否导入geoip库并运行这些函数?答案是肯定的!因此,geoipsed应运而生。

  • 撰写这篇文章是为了学习更多Rust,我非常感谢burntsushisstadick,他们的优秀crate和详尽的代码是灵感和参考的来源。

依赖项

~6–15MB
~167K SLoC