Geoip 过滤器插件
编辑Geoip 过滤器插件
编辑- 插件版本:v7.3.1
- 发布日期:2024-10-11
- 更新日志
对于其他版本,请参阅版本化插件文档。
获取帮助
编辑有关插件的问题,请在Discuss论坛中发起一个主题。对于错误或功能请求,请在Github中创建一个 issue。有关 Elastic 支持的插件列表,请查阅Elastic 支持矩阵。
描述
编辑GeoIP 过滤器基于 MaxMind GeoLite2 数据库中的数据,添加有关 IP 地址地理位置的信息。
支持的数据库
编辑此插件捆绑了开箱即用的GeoLite2 城市数据库。来自 MaxMind 的描述 — “GeoLite2 数据库是免费的 IP 地理位置数据库,与 MaxMind 的 GeoIP2 数据库相当,但精度较低”。请参阅 GeoIP Lite2 许可证了解更多详细信息。
此插件还支持来自 MaxMind 的商业数据库。
如果您需要使用捆绑的 GeoLite2 城市数据库以外的其他数据库,您可以直接从 MaxMind 网站下载它们,并使用 database
选项指定它们的位置。GeoLite2 数据库可以从此处下载。
如果您想获取自治系统编号 (ASN) 信息,可以使用 GeoLite2-ASN 数据库。
数据库许可证
编辑MaxMind 将 GeoIP 数据库的发布从 Creative Commons (CC) 许可证更改为专有的最终用户许可协议 (EULA)。MaxMind EULA 要求 Logstash 在数据库更新后的 30 天内更新 MaxMind 数据库。
GeoIP 过滤器插件可以为运行 Logstash 默认发行版的用户管理数据库,或者您可以自行管理数据库更新。该行为由 database
设置和自动更新功能控制。当您使用默认的 database
设置并且启用了自动更新功能时,Logstash 会确保插件正在使用最新版本的数据库。否则,您负责维护合规性。
Logstash 开源发行版默认使用 MaxMind Creative Commons 许可证数据库。
数据库自动更新
编辑此插件捆绑了 Creative Commons (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 将无限期地使用 Creative Commons (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
- 使用
logstash.yml
中的xpack.geoip.download.endpoint=https://127.0.0.1:8080/overview.json
设置指定服务的端点 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 DB 的字段将直接添加到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 获得。此数据库根据 Creative Commons Attribution-ShareAlike 4.0 International License 获得许可。
GeoIP 过滤器的 4.0.0 及更高版本使用 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
(如果存在)。第二个示例也将删除一个令人悲伤、不需要的标记。