Geoip 过滤器插件
编辑Geoip 过滤器插件
编辑- 插件版本:v7.3.1
- 发布时间:2024-10-11
- 变更日志
其他版本请参见 版本化插件文档。
获取帮助
编辑如有任何关于插件的问题,请在 Discuss 论坛中发帖提问。如发现错误或有功能需求,请在 Github 上提交问题。如需查看 Elastic 支持的插件列表,请查阅 Elastic 支持矩阵。
描述
编辑GeoIP 过滤器根据 MaxMind GeoLite2 数据库的数据,添加有关 IP 地址地理位置的信息。
支持的数据库
编辑此插件自带 GeoLite2 城市数据库。根据 MaxMind 的描述——“GeoLite2 数据库是免费的 IP 地理位置数据库,与 MaxMind 的 GeoIP2 数据库相比,准确性较低”。更多详情,请参阅 GeoIP Lite2 许可证。
此插件也支持来自 MaxMind 的 商业数据库。
如果您需要使用除捆绑的 GeoLite2 城市数据库以外的数据库,您可以直接从 MaxMind 的网站下载它们,并使用 database
选项指定它们的位置。GeoLite2 数据库可以从 此处下载。
如果您需要获取自治系统编号 (ASN) 信息,可以使用 GeoLite2-ASN 数据库。
数据库许可证
编辑MaxMind 已将 GeoIP 数据库的许可证从知识共享 (CC) 许可证更改为专有的最终用户许可协议 (EULA)。MaxMind EULA 要求 Logstash 在数据库更新后 30 天内更新 MaxMind 数据库。
GeoIP 过滤器插件可以为运行 Logstash 默认发行版的用户管理数据库,或者您可以自行管理数据库更新。此行为由 database
设置和自动更新功能控制。当您使用默认的 database
设置并且启用了自动更新功能时,Logstash 可确保插件使用最新版本的数据库。否则,您有责任维护合规性。
Logstash 开源发行版默认使用 MaxMind 知识共享许可证数据库。
数据库自动更新
编辑此插件捆绑了知识共享 (CC) 许可证数据库。如果在 logstash.yml
中启用了自动更新功能(默认情况下已启用),Logstash 每天都会检查数据库更新。它会下载最新版本,并在插件运行时替换旧数据库。
如果禁用自动更新功能或数据库从未成功更新过(例如在隔离环境中),Logstash 可以无限期地使用 CC 许可证数据库。
在 Logstash 切换到 EULA 许可数据库后,如果 Logstash 30 天内未能检查数据库更新,则 geoip 过滤器将停止丰富事件以保持合规性。事件将被标记为 _geoip_expired_database
标签,以便于处理这种情况。
如果启用了自动更新功能,Logstash 将在第一次下载时从 CC 数据库许可证升级到 EULA 版本。
如果可能,请允许 Logstash 访问互联网以下载数据库,以便它们始终保持最新状态。
禁用自动更新功能
如果您在隔离环境中工作并想要禁用数据库自动更新功能,请在 logstash.yml
中将 xpack.geoip.downloader.enabled
值设置为 false
。
禁用自动更新功能后,Logstash 将无限期地使用知识共享 (CC) 许可证数据库,任何先前下载的 EULA 数据库版本都将被删除。
自行管理数据库更新
编辑使用 HTTP 代理
如果您无法直接连接到 Elastic GeoIP 端点,请考虑设置 HTTP 代理服务器。然后,您可以使用 http_proxy
环境变量指定代理。
export http_proxy="http://PROXY_IP:PROXY_PORT"
使用自定义端点(隔离环境)
如果您在隔离环境中工作并且无法从 Elastic 端点更新数据库,您可以从 MaxMind 下载数据库并引导服务。
- 从 MaxMind 网站 下载
GeoLite2-ASN.mmdb
和GeoLite2-City.mmdb
数据库文件。 - 将两个数据库文件复制到单个目录。
- 下载 Elasticsearch.
-
从您的 Elasticsearch 目录运行:
./bin/elasticsearch-geoip -s my/database/dir
-
从您的目录提供静态数据库文件。例如,您可以使用 Docker 从 nginx 服务器提供文件。
docker run -p 8080:80 -v my/database/dir:/usr/share/nginx/html:ro nginx
- 使用
xpack.geoip.download.endpoint=https://127.0.0.1:8080/overview.json
设置在logstash.yml
中指定服务的端点 URL。
Logstash 将从此服务获取自动更新。
数据库指标
编辑您可以通过 节点统计信息 API 监控数据库状态。
以下请求返回包含数据库管理器统计信息的 JSON 文档,包括:
-
数据库状态和新鲜度
-
geoip_download_manager.database.*.status
-
init
:初始 CC 数据库状态 -
up_to_date
:使用最新的 EULA 数据库 -
to_be_expired
:25 天未调用服务 -
expired
:30 天未调用服务
-
-
fail_check_in_days
:自上次成功以来,Logstash 无法调用服务的持续天数
-
-
关于下载成功和失败的信息
-
geoip_download_manager.download_stats.successes
:成功检查和下载的次数 -
geoip_download_manager.download_stats.failures
:检查或下载失败的次数 -
geoip_download_manager.download_stats.status
-
updating
:正在检查和下载 -
succeeded
:上次下载成功 -
failed
:上次下载失败
-
-
curl -XGET 'localhost:9600/_node/stats/geoip_download_manager?pretty'
示例响应
{ "geoip_download_manager" : { "database" : { "ASN" : { "status" : "up_to_date", "fail_check_in_days" : 0, "last_updated_at": "2021-06-21T16:06:54+02:00" }, "City" : { "status" : "up_to_date", "fail_check_in_days" : 0, "last_updated_at": "2021-06-21T16:06:54+02:00" } }, "download_stats" : { "successes" : 15, "failures" : 1, "last_checked_at" : "2021-06-21T16:07:03+02:00", "status" : "succeeded" } } }
字段映射
编辑当此插件禁用 ecs_compatibility
时,MaxMind 数据库的字段将直接添加到 target
。启用 ECS 兼容性后,字段将被构建以适应 ECS 结构。
数据库字段名称 | ECS 字段 | 示例 |
---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
N/A |
为保持向后兼容性而保留,但填充了 2 个字符的国家代码 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
*
表示复合字段,只有当 GeoIP 查询结果包含所有组件时才会填充。
详情
编辑使用城市数据库时,如果无法获得经纬度对,则会中止丰富过程。
location
字段将经度和纬度组合成一个称为 GeoJSON 的结构。当您使用默认的 target
时,elasticsearch 输出 提供的模板会将该字段映射到 Elasticsearch Geo_point 数据类型。
由于此字段是 geo_point
*并且* 仍然是有效的 GeoJSON,因此您可以获得 Elasticsearch 的地理空间查询、构面和过滤功能的强大功能,以及为所有其他应用程序(如 Kibana 的地图可视化)提供 GeoJSON 的灵活性。
本产品包含由 MaxMind 创建的 GeoLite2 数据,可从 http://www.maxmind.com 获取。此数据库根据 知识共享署名-相同方式共享 4.0 国际许可证 许可。
4.0.0 版及更高版本的 GeoIP 过滤器使用 MaxMind GeoLite2 数据库,并支持 IPv4 和 IPv6 查询。4.0.0 之前的版本使用旧版 MaxMind GeoLite 数据库,仅支持 IPv4 查询。
Geoip 过滤器配置选项
编辑此插件支持以下配置选项以及稍后描述的 通用选项。
设置 | 输入类型 | 必需 |
---|---|---|
否 |
||
有效的系统文件路径 |
否 |
|
|
否 |
|
否 |
||
否 |
||
是 |
||
否 |
||
否 |
另请参见 通用选项,了解所有过滤器插件支持的选项列表。
cache_size
编辑- 值类型为 数字
- 默认值为
1000
GeoIP 查询非常耗费资源。此过滤器使用缓存来利用日志文件中 IP 代理通常彼此相邻且很少随机分布这一事实。此值设置得越高,缓存中存在条目的可能性就越大,此过滤器的运行速度就越快。但是,如果将此值设置得太高,则可能会使用超过所需内存。由于 Geoip API 已升级到 v2,因此目前没有任何驱逐策略,如果缓存已满,则无法添加更多记录。尝试使用不同的值来找到最适合您的数据集的性能。
此值必须设置为大于 0 的值。实际上没有理由不希望这种行为,开销极小,速度提升很大。
需要注意的是,此配置值对于 geoip_type 是全局的。也就是说,相同 geoip_type 的所有 geoip 过滤器的实例共享相同的缓存。最后声明的缓存大小将胜出。这样做的原因是,对管道中不同位置的不同实例使用多个缓存没有任何好处,这只会增加缓存未命中的次数并浪费内存。
database
编辑- 值类型为 路径
- 如果未指定,则数据库默认为与 Logstash 一起提供的
GeoLite2 City
数据库。
Logstash 应使用的 MaxMind 数据库文件的路径。默认数据库为 GeoLite2-City
。此插件支持多个免费数据库(GeoLite2-City
、GeoLite2-Country
、GeoLite2-ASN
)和一些商业许可的数据库(GeoIP2-City
、GeoIP2-ISP
、GeoIP2-Country
、GeoIP2-Domain
、GeoIP2-Enterprise
、GeoIP2-Anonymous-IP
)。
数据库自动更新适用于默认分发版。当 database
指向用户的数据库路径时,自动更新将被禁用。有关更多信息,请参见 数据库许可证。
default_database_type
编辑此插件现在同时包含 GeoLite2-City 和 GeoLite2-ASN 数据库。如果未设置 database
和 default_database_type
,则将选择 GeoLite2-City 数据库。要使用包含的 GeoLite2-ASN 数据库,请将 default_database_type
设置为 ASN
。
- 值类型为 字符串
- 默认值为
City
- 唯一可接受的值为
City
和ASN
fields
编辑- 值类型为 数组
- 此设置没有默认值。
要包含在事件中的 geoip 字段数组。
可能的字段取决于数据库类型。默认情况下,相关数据库中的所有 geoip 字段都包含在事件中。
有关可用字段的完整列表以及它们如何映射到事件的结构,请参见 字段映射。
target
编辑- 这是一个带有条件的可选设置。
- 值类型为 字符串
-
默认值取决于是否启用了
ecs_compatibility
- 禁用 ECS 兼容性:
geoip
-
启用 ECS 兼容性:如果
source
是ip
子字段,例如[client][ip]
,target
将自动设置为父字段,在此示例中为client
,否则,target
是必需的设置-
geo
字段嵌套在[client][geo]
中 - ECS 兼容值是
client
、destination
、host
、observer
、server
、source
-
- 禁用 ECS 兼容性:
指定 Logstash 应将 geoip 数据存储到的字段。例如,如果您有 src_ip
和 dst_ip
字段,并且想要这两个 IP 的 GeoIP 信息,这将非常有用。
如果将数据保存到除 geoip
之外的目标字段,并且想要在 Elasticsearch 中使用 geo_point
相关函数,则需要更改 Elasticsearch 输出提供的模板并配置输出以使用新模板。
即使您不使用 geo_point
映射,[target][location]
字段仍然是有效的 GeoJSON。
常用选项
编辑所有过滤器插件都支持这些配置选项
设置 | 输入类型 | 必需 |
---|---|---|
否 |
||
否 |
||
否 |
||
否 |
||
否 |
||
否 |
||
否 |
add_field
编辑- 值类型为 哈希表
- 默认值为
{}
如果此过滤器成功,则将任何任意字段添加到此事件。字段名称可以是动态的,并包含使用 %{field}
的事件部分。
示例
filter { geoip { add_field => { "foo_%{somefield}" => "Hello world, from %{host}" } } }
# You can also add multiple fields at once: filter { geoip { add_field => { "foo_%{somefield}" => "Hello world, from %{host}" "new_field" => "new_static_value" } } }
如果事件具有字段 "somefield" == "hello"
,则此过滤器成功后,如果存在,将添加字段 foo_hello
,其值为上述值,并将 %{host}
部分替换为事件中的该值。第二个示例还将添加一个硬编码字段。
add_tag
编辑- 值类型为 数组
- 默认值为
[]
如果此过滤器成功,则将任意标签添加到事件。标签可以是动态的,并包含使用 %{field}
语法的事件部分。
示例
filter { geoip { add_tag => [ "foo_%{somefield}" ] } }
# You can also add multiple tags at once: filter { geoip { add_tag => [ "foo_%{somefield}", "taggedy_tag"] } }
如果事件具有字段 "somefield" == "hello"
,则此过滤器成功后,将添加标签 foo_hello
(当然,第二个示例会添加 taggedy_tag
标签)。
id
编辑- 值类型为 字符串
- 此设置没有默认值。
向插件配置添加唯一的 ID
。如果没有指定 ID,Logstash 将生成一个。强烈建议在配置中设置此 ID。当您有两个或多个相同类型的插件时,这尤其有用,例如,如果您有 2 个 geoip 过滤器。在这种情况下,添加命名 ID 将有助于在使用监控 API 时监控 Logstash。
filter { geoip { id => "ABC" } }
id
字段中的变量替换仅支持环境变量,不支持使用密钥存储中的值。
remove_field
编辑- 值类型为 数组
- 默认值为
[]
如果此过滤器成功,则从此事件中删除任意字段。字段名称可以是动态的,并包含使用 %{field} 的事件部分 示例
filter { geoip { remove_field => [ "foo_%{somefield}" ] } }
# You can also remove multiple fields at once: filter { geoip { remove_field => [ "foo_%{somefield}", "my_extraneous_field" ] } }
如果事件具有字段 "somefield" == "hello"
,则此过滤器成功后,如果存在,将删除名称为 foo_hello
的字段。第二个示例将删除另一个非动态字段。
remove_tag
编辑- 值类型为 数组
- 默认值为
[]
如果此过滤器成功,则从事件中删除任意标签。标签可以是动态的,并包含使用 %{field}
语法的事件部分。
示例
filter { geoip { remove_tag => [ "foo_%{somefield}" ] } }
# You can also remove multiple tags at once: filter { geoip { remove_tag => [ "foo_%{somefield}", "sad_unwanted_tag"] } }
如果事件具有字段 "somefield" == "hello"
,则此过滤器成功后,如果存在,将删除标签 foo_hello
。第二个示例还会删除一个令人沮丧的、不需要的标签。