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 选项

名称 必需 默认值 描述

field

-

获取用于地理查找的 IP 地址的字段。

target_field

geoip

将保存从 MaxMind 数据库中查找的地理信息的字段。

database_file

GeoLite2-City.mmdb

数据库文件名,引用自动下载的 GeoLite2 数据库之一(GeoLite2-City.mmdb、GeoLite2-Country.mmdb 或 GeoLite2-ASN.mmdb),或 ingest-geoip 配置目录中支持的数据库文件的名称。

properties

[continent_name, country_iso_code, country_name, region_iso_code, region_name, city_name, location] *

控制根据 geoip 查找添加到 target_field 的属性。

ignore_missing

false

如果为 truefield 不存在,则处理器将静默退出,不会修改文档。

first_only

true

如果为 true,则仅返回第一个找到的 geoip 数据,即使 field 包含数组。

download_database_on_pipeline_creation

true

如果为 true(并且如果 ingest.geoip.downloader.eager.downloadfalse),则在创建管道时下载缺失的数据库。否则,当管道用作索引中的 default_pipelinefinal_pipeline 时,将触发下载。

*取决于 database_file 中可用的内容

  • 如果使用 GeoLite2 城市或 GeoIP2 城市数据库,则可以在 target_field 下添加以下字段:ipcountry_iso_codecountry_namecontinent_nameregion_iso_coderegion_namecity_nametimezonelocation。实际添加的字段取决于已找到的内容以及在 properties 中配置了哪些属性。
  • 如果使用 GeoLite2 国家或 GeoIP2 国家数据库,则可以在 target_field 下添加以下字段:ipcountry_iso_codecountry_namecontinent_name。实际添加的字段取决于已找到的内容以及在 properties 中配置了哪些属性。
  • 如果使用 GeoLite2 ASN 数据库,则可以在 target_field 下添加以下字段:ipasnorganization_namenetwork。实际添加的字段取决于已找到的内容以及在 properties 中配置了哪些属性。
  • 如果使用 GeoIP2 匿名 IP 数据库,则可以在 target_field 下添加以下字段:iphosting_providertor_exit_nodeanonymous_vpnanonymouspublic_proxyresidential_proxy。实际添加的字段取决于已找到的内容以及在 properties 中配置了哪些属性。
  • 如果使用 GeoIP2 企业版数据库,则可以在 target_field 下添加以下字段:ipcountry_iso_codecountry_namecontinent_nameregion_iso_coderegion_namecity_nametimezonelocationasnorganization_namenetworkhosting_providertor_exit_nodeanonymous_vpnanonymouspublic_proxyresidential_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 端点的服务。然后,您可以从该服务获取自动更新。

  1. MaxMind 网站 下载您的 .mmdb 数据库文件。
  2. 将您的数据库文件复制到单个目录中。
  3. 从 Elasticsearch 目录运行

    ./bin/elasticsearch-geoip -s my/source/dir [-t target/directory]
  4. 从您的目录提供静态数据库文件。例如,您可以使用 Docker 从 nginx 服务器提供文件

    docker run -v my/source/dir:/usr/share/nginx/html:ro nginx
  5. 在每个节点的 elasticsearch.yml 文件中指定的 ingest.geoip.downloader.endpoint 设置中指定服务的端点 URL。

    默认情况下,Elasticsearch 每三天检查一次端点以获取更新。要使用其他轮询间隔,请使用 集群更新设置 API 设置 ingest.geoip.downloader.poll.interval

手动更新您的 IP 地理位置数据库

  1. 使用 集群更新设置 APIingest.geoip.downloader.enabled 设置为 false。这将禁用可能覆盖您的数据库更改的自动更新。这也将删除所有下载的数据库。
  2. MaxMind 网站 下载您的 .mmdb 数据库文件。

    您还可以使用自定义城市、国家和 ASN .mmdb 文件。这些文件必须解压缩。类型(城市、国家或 ASN)将从文件元数据中提取,因此文件名无关紧要。

  3. 在 Elasticsearch Service 部署中,使用 自定义捆绑包 上传数据库。
  4. 在自管理部署中,将数据库文件复制到 $ES_CONFIG/ingest-geoip
  5. 在您的 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 的信任库中。

ingest.geoip.downloader.poll.interval
(动态, 时间值) Elasticsearch 在 ingest.geoip.downloader.endpoint 检查 IP 地理位置数据库更新的频率。必须大于 1d(一天)。默认为 3d(三天)。