GeoIP 处理器
编辑GeoIP 处理器编辑
geoip
处理器添加有关 IPv4 或 IPv6 地址的地理位置的信息。
默认情况下,处理器使用来自 MaxMind 的 GeoLite2 城市、GeoLite2 国家和 GeoLite2 ASN IP 地理位置数据库,这些数据库在 CC BY-SA 4.0 许可下共享。如果您的节点可以连接到 storage.googleapis.com
域名,并且以下任一条件满足,它会自动下载这些数据库:
-
ingest.geoip.downloader.eager.download
设置为 true - 您的集群至少有一个包含
geoip
处理器的管道
Elasticsearch 会自动从 Elastic GeoIP 端点下载这些数据库的更新:https://geoip.elastic.co/v1/database。要获取这些更新的下载统计信息,请使用 GeoIP 统计信息 API。
如果您的集群无法连接到 Elastic GeoIP 端点,或者您想管理自己的更新,请参阅 管理您自己的 IP 地理位置数据库更新。
如果 Elasticsearch 无法连接到端点 30 天,所有更新的数据库将失效。Elasticsearch 将停止使用 geoip 数据丰富文档,并将添加 tags: ["_geoip_expired_database"]
字段。
在管道中使用 geoip
处理器编辑
表 22. geoip
选项
名称 | 必需 | 默认值 | 描述 |
---|---|---|---|
|
是 |
- |
获取用于地理查找的 IP 地址的字段。 |
|
否 |
geoip |
将保存从 MaxMind 数据库中查找的地理信息的字段。 |
|
否 |
GeoLite2-City.mmdb |
数据库文件名,引用自动下载的 GeoLite2 数据库之一(GeoLite2-City.mmdb、GeoLite2-Country.mmdb 或 GeoLite2-ASN.mmdb),或 |
|
否 |
[ |
控制根据 geoip 查找添加到 |
|
否 |
|
如果为 |
|
否 |
|
如果为 |
|
否 |
|
如果为 |
*取决于 database_file
中可用的内容
- 如果使用 GeoLite2 城市或 GeoIP2 城市数据库,则可以在
target_field
下添加以下字段:ip
、country_iso_code
、country_name
、continent_name
、region_iso_code
、region_name
、city_name
、timezone
和location
。实际添加的字段取决于已找到的内容以及在properties
中配置了哪些属性。 - 如果使用 GeoLite2 国家或 GeoIP2 国家数据库,则可以在
target_field
下添加以下字段:ip
、country_iso_code
、country_name
和continent_name
。实际添加的字段取决于已找到的内容以及在properties
中配置了哪些属性。 - 如果使用 GeoLite2 ASN 数据库,则可以在
target_field
下添加以下字段:ip
、asn
、organization_name
和network
。实际添加的字段取决于已找到的内容以及在properties
中配置了哪些属性。 - 如果使用 GeoIP2 匿名 IP 数据库,则可以在
target_field
下添加以下字段:ip
、hosting_provider
、tor_exit_node
、anonymous_vpn
、anonymous
、public_proxy
和residential_proxy
。实际添加的字段取决于已找到的内容以及在properties
中配置了哪些属性。 - 如果使用 GeoIP2 企业版数据库,则可以在
target_field
下添加以下字段:ip
、country_iso_code
、country_name
、continent_name
、region_iso_code
、region_name
、city_name
、timezone
、location
、asn
、organization_name
、network
、hosting_provider
、tor_exit_node
、anonymous_vpn
、anonymous
、public_proxy
和residential_proxy
。实际添加的字段取决于已找到的内容以及在properties
中配置了哪些属性。
请勿在生产环境中使用 GeoIP2 匿名 IP 和 GeoIP2 企业版数据库。此功能处于技术预览阶段,可能会在将来的版本中更改或删除。Elastic 将努力解决任何问题,但技术预览中的功能不受官方 GA 功能支持 SLA 的约束。
以下示例使用默认城市数据库,并将基于 ip
字段将地理信息添加到 geoip
字段
response = client.ingest.put_pipeline( id: 'geoip', body: { description: 'Add geoip info', processors: [ { geoip: { field: 'ip' } } ] } ) puts response response = client.index( index: 'my-index-000001', id: 'my_id', pipeline: 'geoip', body: { ip: '89.160.20.128' } ) puts response response = client.get( index: 'my-index-000001', id: 'my_id' ) puts response
PUT _ingest/pipeline/geoip { "description" : "Add geoip info", "processors" : [ { "geoip" : { "field" : "ip" } } ] } PUT my-index-000001/_doc/my_id?pipeline=geoip { "ip": "89.160.20.128" } GET my-index-000001/_doc/my_id
返回
{ "found": true, "_index": "my-index-000001", "_id": "my_id", "_version": 1, "_seq_no": 55, "_primary_term": 1, "_source": { "ip": "89.160.20.128", "geoip": { "continent_name": "Europe", "country_name": "Sweden", "country_iso_code": "SE", "city_name" : "Linköping", "region_iso_code" : "SE-E", "region_name" : "Östergötland County", "location": { "lat": 58.4167, "lon": 15.6167 } } } }
以下示例使用默认国家数据库,并将基于 ip
字段将地理信息添加到 geo
字段。请注意,此数据库会自动下载。因此,这
response = client.ingest.put_pipeline( id: 'geoip', body: { description: 'Add geoip info', processors: [ { geoip: { field: 'ip', target_field: 'geo', database_file: 'GeoLite2-Country.mmdb' } } ] } ) puts response response = client.index( index: 'my-index-000001', id: 'my_id', pipeline: 'geoip', body: { ip: '89.160.20.128' } ) puts response response = client.get( index: 'my-index-000001', id: 'my_id' ) puts response
PUT _ingest/pipeline/geoip { "description" : "Add geoip info", "processors" : [ { "geoip" : { "field" : "ip", "target_field" : "geo", "database_file" : "GeoLite2-Country.mmdb" } } ] } PUT my-index-000001/_doc/my_id?pipeline=geoip { "ip": "89.160.20.128" } GET my-index-000001/_doc/my_id
返回以下内容
{ "found": true, "_index": "my-index-000001", "_id": "my_id", "_version": 1, "_seq_no": 65, "_primary_term": 1, "_source": { "ip": "89.160.20.128", "geo": { "continent_name": "Europe", "country_name": "Sweden", "country_iso_code": "SE" } } }
并非所有 IP 地址都能从数据库中找到地理信息。如果发生这种情况,则不会将 target_field
插入文档中。
以下示例显示了当无法找到“80.231.5.0”的信息时,将如何索引文档
response = client.ingest.put_pipeline( id: 'geoip', body: { description: 'Add geoip info', processors: [ { geoip: { field: 'ip' } } ] } ) puts response response = client.index( index: 'my-index-000001', id: 'my_id', pipeline: 'geoip', body: { ip: '80.231.5.0' } ) puts response response = client.get( index: 'my-index-000001', id: 'my_id' ) puts response
PUT _ingest/pipeline/geoip { "description" : "Add geoip info", "processors" : [ { "geoip" : { "field" : "ip" } } ] } PUT my-index-000001/_doc/my_id?pipeline=geoip { "ip": "80.231.5.0" } GET my-index-000001/_doc/my_id
返回
{ "_index" : "my-index-000001", "_id" : "my_id", "_version" : 1, "_seq_no" : 71, "_primary_term": 1, "found" : true, "_source" : { "ip" : "80.231.5.0" } }
识别位置作为地理点编辑
尽管此处理器使用包含 IP 地址的估计纬度和经度的 location
字段丰富您的文档,但此字段不会在 Elasticsearch 中被索引为 geo_point
类型,除非在映射中明确将其定义为这种类型。
您可以对上面的示例索引使用以下映射
response = client.indices.create( index: 'my_ip_locations', body: { mappings: { properties: { geoip: { properties: { location: { type: 'geo_point' } } } } } } ) puts response
PUT my_ip_locations { "mappings": { "properties": { "geoip": { "properties": { "location": { "type": "geo_point" } } } } } }
管理您自己的 IP 地理位置数据库更新编辑
如果您无法 自动更新 来自 Elastic 端点的 IP 地理位置数据库,您还有其他几个选项
如果您无法直接连接到 Elastic GeoIP 端点,请考虑设置一个安全的代理。然后,您可以在每个节点的 elasticsearch.yml
文件中指定的 ingest.geoip.downloader.endpoint
设置中指定代理端点 URL。
在严格的设置中,可能需要将以下域名添加到允许的域名列表中
-
geoip.elastic.co
-
storage.googleapis.com
您可以创建一个模拟 Elastic GeoIP 端点的服务。然后,您可以从该服务获取自动更新。
- 从 MaxMind 网站 下载您的
.mmdb
数据库文件。 - 将您的数据库文件复制到单个目录中。
-
从 Elasticsearch 目录运行
./bin/elasticsearch-geoip -s my/source/dir [-t target/directory]
-
从您的目录提供静态数据库文件。例如,您可以使用 Docker 从 nginx 服务器提供文件
docker run -v my/source/dir:/usr/share/nginx/html:ro nginx
-
在每个节点的
elasticsearch.yml
文件中指定的ingest.geoip.downloader.endpoint
设置中指定服务的端点 URL。默认情况下,Elasticsearch 每三天检查一次端点以获取更新。要使用其他轮询间隔,请使用 集群更新设置 API 设置
ingest.geoip.downloader.poll.interval
。
- 使用 集群更新设置 API 将
ingest.geoip.downloader.enabled
设置为false
。这将禁用可能覆盖您的数据库更改的自动更新。这也将删除所有下载的数据库。 -
从 MaxMind 网站 下载您的
.mmdb
数据库文件。您还可以使用自定义城市、国家和 ASN
.mmdb
文件。这些文件必须解压缩。类型(城市、国家或 ASN)将从文件元数据中提取,因此文件名无关紧要。 - 在 Elasticsearch Service 部署中,使用 自定义捆绑包 上传数据库。
- 在自管理部署中,将数据库文件复制到
$ES_CONFIG/ingest-geoip
。 - 在您的
geoip
处理器中,配置database_file
参数以使用自定义数据库文件。
节点设置编辑
geoip
处理器支持以下设置
-
ingest.geoip.cache_size
- 应缓存的结果的最大数量。默认为
1000
。
请注意,这些设置是节点设置,适用于所有 geoip
处理器,即所有定义的 geoip
处理器只有一个缓存。
集群设置编辑
-
ingest.geoip.downloader.enabled
- (动态, 布尔值) 如果为
true
,Elasticsearch 会自动从ingest.geoip.downloader.endpoint
下载和管理 IP 地理位置数据库的更新。如果为false
,Elasticsearch 不会下载更新,并删除所有已下载的数据库。默认为true
。
-
ingest.geoip.downloader.eager.download
- (动态, 布尔值) 如果为
true
,Elasticsearch 会立即下载 IP 地理位置数据库,无论是否存在带有 geoip 处理器的管道。如果为false
,Elasticsearch 仅在存在或添加了带有 geoip 处理器的管道时才开始下载数据库。默认为false
。
-
ingest.geoip.downloader.endpoint
- (静态, 字符串) 用于下载 IP 地理位置数据库更新的端点 URL。例如,
https://myDomain.com/overview.json
。默认为https://geoip.elastic.co/v1/database
。Elasticsearch 将下载的数据库文件存储在每个节点的 临时目录 中,位于$ES_TMPDIR/geoip-databases/<node_id>
。请注意,Elasticsearch 将向${ingest.geoip.downloader.endpoint}?elastic_geoip_service_tos=agree
发出 GET 请求,期望收到通常在overview.json
中找到的有关数据库的元数据列表。
GeoIP 下载器使用 JDK 的内置 cacerts。如果您使用的是自定义端点,请将自定义 https 端点 cacert(s) 添加到 JDK 的信任库中。