转载自:https://blog.csdn.net/UbuntuTouch/article/details/108614271

对于公共 IP,可以创建表来指定 IP 属于哪个城市的特定范围。但是,互联网的很大一部分是不同的。在世界上每个国家都有公司专用网络,其 IP 地址的格式为 10.0.0.0/8、172.16.0.0/12 或 192.168.0.0/16。这些 IP 地址往往没有有关地理位置的真实信息。因此,Elasticsearch 和 Logstash 中内置的 geoip 过滤器/处理器不适用于这些私有 IP。

ElasticsearchLogstash 可以选择指定要使用的特定数据库文件(database / database_file),因此从理论上讲,可以自定义构建。但是,这可能会很耗时,而且维护成本很高,更不用说你可能必须学习一套新工具来仅构建这些 .mmdb 文件(这个在以后的话题中讲)。

可以使用 Elasticsearch 中已经内置的另一个工具(enrich processor)来实现一种更简单的方法,该工具可以(非常令人惊讶地)用我们想要的任何种类的数据(包括地理数据)丰富我们的文档。让我们来看一个这样做的例子。

示例:通过大陆,国家/地区和城市来丰富私有 IP

在本例中,我将只讲到任意选择的国家/地区中的城市,但是很容易看出如何将其精确化到村庄或甚至是特定建筑物的水平,或者只精确到国家或地区。 这仅取决于特定用例需求。

我们首先来创建一个 private_geoips 的索引:

PUT private_geoips
{
"mappings": {
"properties": {
"city_name": {
"type": "keyword"
},
"continent_name": {
"type": "keyword"
},
"country_iso_code": {
"type": "keyword"
},
"country_name": {
"type": "keyword"
},
"location": {
"type": "geo_point"
},
"source.ip": {
"type": "ip"
}
}
}
}

要实现这样的功能,我们需要控制在办公室的哪些位置使用哪些私有 IP。 考虑到专用网络的性质,总是有发生重叠的机会。 对于这个小例子,我们将想象我们可以控制不同办公室的某些子网,而我将其分配如下:

10.4.0.0/16 - Pretoria South Africa (比勒陀利亚南非)

10.5.0.0/16 - Toronto Canada(加拿大多伦多)

10.6.0.0/16 - Berlin Germany(柏林德国)

10.7.0.0/16 - Tokyo Japan(日本东京)

我们接下来导入如下的数据到索引 private_geoips 中:

POST private_geoips/_bulk
{"index":{"_id":"pretoria-south-africa"}}
{"city_name":"Pretoria","continent_name":"Africa","country_iso_code":"SA","country_name":"South Africa","location":[28.21837,-25.73134],"source.ip":["10.4.54.6","10.4.54.7","10.4.54.8"]}
{"index":{"_id":"toronto-canada"}}
{"city_name":"Toronto","continent_name":"North America","country_iso_code":"CA","country_name":"Canada","location":[-79.347015,43.65107],"source.ip":["10.5.231.89","10.5.231.90","10.5.231.91"]}
{"index":{"_id":"berlin-germany"}}
{"city_name":"Berlin","continent_name":"Europe","country_iso_code":"DE","location":[13.404954,52.520008],"country_name":"Germany","region_name":"","source.ip":["10.6.132.43","10.6.132.44"]}
{"index":{"_id":"tokyo-japan"}}
{"city_name":"Tokyo","continent_name":"Asia","country_iso_code":"JP","country_name":"Japan","location":[139.839478,35.652832],"source.ip":["10.7.1.76"]}

我们存储在索引 private_geoips 中的所有文档都必须具有策略 (policy)内 enrich_fields 数组中提到的所有字段。

PUT _enrich/policy/private_geoips_policy
{
"match": {
"indices": "private_geoips",
"match_field": "source.ip",
"enrich_fields": [
"city_name",
"continent_name",
"country_iso_code",
"country_name",
"location"
]
}
}

对于 enrich processor 还是不太了解的开发者来说,你可以参阅我之前的文章 “Elasticsearch:如何使用 Elasticsearch ingest 节点来丰富日志和指标”。其基本意思是当一个文档的 source.ip 字段和 private_geoips 索引中的 source.ip 中的一个比对成功的话,那么在 private_geoips 中的其它字段 "city_name", "continent_name", "country_iso_code", "country_name", "location" 将会被丰富到文档中。

当我们第一次创建策略或更改索引时,我们需要重新执行策略。

POST /_enrich/policy/private_geoips_policy/_execute

让我们创建我们的 ingest pipeline:

PUT /_ingest/pipeline/private_geoips
{
"description": "_description",
"processors": [
{
"dot_expander": {
"field": "source.ip"
}
},
{
"enrich": {
"policy_name": "private_geoips_policy",
"field": "source.ip",
"target_field": "geo",
"max_matches": "1"
}
},
{
"script": {
"lang": "painless",
"source": "ctx.geo.remove('source.ip')"
}
}
]
}

最后,我们来测试 ingest pipeline:

POST /_ingest/pipeline/private_geoips/_simulate
{
"docs": [
{
"_source": {
"source.ip": "10.7.1.76"
}
},
{
"_source": {
"source.ip": "10.4.54.7"
}
}
]
}

运行上面的测试,我们可以看到如下的结果:

    {
"docs" : [
{
"doc" : {
"_index" : "_index",
"_type" : "_doc",
"_id" : "_id",
"_source" : {
"geo" : {
"continent_name" : "Asia",
"country_name" : "Japan",
"city_name" : "Tokyo",
"location" : [
139.839478,
35.652832
],
"country_iso_code" : "JP"
},
"source" : {
"ip" : "10.7.1.76"
}
},
"_ingest" : {
"timestamp" : "2020-09-16T01:16:55.901889Z"
}
}
},
{
"doc" : {
"_index" : "_index",
"_type" : "_doc",
"_id" : "_id",
"_source" : {
"geo" : {
"continent_name" : "Africa",
"country_name" : "South Africa",
"city_name" : "Pretoria",
"location" : [
28.21837,
-25.73134
],
"country_iso_code" : "SA"
},
"source" : {
"ip" : "10.4.54.7"
}
},
"_ingest" : {
"timestamp" : "2020-09-16T01:16:55.901897Z"
}
}
}
]
}

就是这样! 现在,您的私有 IP 地址已充实了 private_geoips 索引中存储的地理位置数据。 现在,您需要做的就是维护该查找索引。

Elasticsearch:使用 GeoIP 丰富来自内部专用 IP 地址的更多相关文章

  1. IP地址规划和设计方法

    IP地址规划和设计方法 无类域间路由技术需要在提高 IP 地址利用率和减少主干路由器负荷两个方面取得平衡 网络地址转换 NAT 最主要的应用是专用网,虚拟专用网,以及 ISP 为拨号用户 提供的服务 ...

  2. APIPA(Automatic Private IP Addressing,自动专用IP寻址)

    APIPA APIPA(Automatic Private IP Addressing,自动专用IP寻址),是一个DHCP故障转移机制.当DHCP服务器出故障时, APIPA在169.254.0.1到 ...

  3. 计算机网络学习笔记--网络层之IP地址与子网

    IPv4地址: 我们知道在网络层(TCP/IP体系结构的网际互联层),最重要的一个协议就是IP协议,现在正处于IPv4和IPv6的过渡时期,但目前来说,IPv4仍为主流,所以主要讲Ipv4. IP地址 ...

  4. ip地址分类和网段区分

    IP地址分类/IP地址10开头和172开头和192开头的区别/判断是否同一网段 简单来说在公司或企业内部看到的就基本都是内网IP,ABC三类IP地址里的常见IP段. 每个IP地址都包含两部分,即网络号 ...

  5. IP地址和子网划分学习笔记之《IP地址详解》

    2018-05-03 18:47:37   在学习IP地址和子网划分前,必须对进制计数有一定了解,尤其是二进制和十进制之间的相互转换,对于我们掌握IP地址和子网的划分非常有帮助,可参看如下目录详文. ...

  6. IP地址分类/IP地址10开头和172开头和192开头的区别/判断是否同一网段(A、B、C三类地址)【转】

    简单来说在公司或企业内部看到的就基本都是内网IP,ABC三类IP地址里的常见IP段. 每个IP地址都包含两部分,即网络号和主机号. InterNIC将IP地址分为五类:A类保留给ZF或大型企业,B类分 ...

  7. IP地址分类和网段区分的知识

    IP地址分类/IP地址10开头和172开头和192开头的区别/判断是否同一网段 简单来说在公司或企业内部看到的就基本都是内网IP,ABC三类IP地址里的常见IP段. 每个IP地址都包含两部分,即网络号 ...

  8. IP地址的规划和设计方法(三)

    九,内部网络专用IP地址规划与网络地址转换NAT方法 (1)内部网络的专用IP地址选择的根据 RFC1918在讨论内部网络的专用IP地址规划方法时任务.使用专用地址规划一个内部网络地址系统时.首选的方 ...

  9. 快速获取 IP 地址

    IP 地址可以分为两类,公用和私有(专用).公用 IP 是唯一的 IP 地址,可以从 Internet 访问.专用 IP 地址保留供您专用网络内部使用,而不会直接暴露给 Internet. 本文将介绍 ...

随机推荐

  1. docker容器管理操作

    Docker容器的四种状态: 运行 已暂停 重新启动 已退出 1.容器的创建 容器创建:就是将镜像加载到容器的过程. 创建容器时如果没有指定容器名称,系统会自动创建一个名称. 新创建的容器默认处于停止 ...

  2. SpringWeb 拦截器

    前言 spring拦截器能帮我们实现验证是否登陆.验签校验请求是否合法.预先设置数据等功能,那么该如何设置拦截器以及它的原理如何呢,下面将进行简单的介绍 1.设置 HandlerInterceptor ...

  3. display: table-cell里面文字打点的方法

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  4. Gumbel_Softmax 概要

    Gumble_Softmax 可以解决的问题 场景:对于一个分类任务,通常会使用softmax函数来将模型的输出值转换为概率的形式,并通过argmax函数取最大的概率值标签作为模型的预测标签.在分类任 ...

  5. Git 02 安装

    参考源 https://www.bilibili.com/video/BV1FE411P7B3?spm_id_from=333.999.0.0 版本 本文章基于 Git 2.35.1.2 这里以安装 ...

  6. 深入理解Spring事件机制(一):广播器与监听器的初始化

    前言 Spring 从 3.x 开始支持事件机制.在 Spring 的事件机制中,我们可以令一个事件类继承 ApplicationEvent 类,然后将实现了 ApplicationListener ...

  7. 【2022知乎爬虫】我用Python爬虫爬了2300多条知乎评论!

    您好,我是 @马哥python说,一枚10年程序猿. 一.爬取目标 前些天我分享过一篇微博的爬虫: https://www.cnblogs.com/mashukui/p/16414027.html 但 ...

  8. Spring 10: AspectJ框架 + @Before前置通知

    AspectJ框架 概述 AspectJ是一个优秀的面向切面编程的框架,他扩展了java语言,提供了强大的切面实现 本身是java语言开发的,可以对java语言面向切面编程进行无缝扩展 AOP常见术语 ...

  9. 1.5_HTML基础标签实战演练

    基本的 HTML 标签 HTML 标题 HTML 标题(Heading)是通过 <h1> - <h6> 等标签进行定义的. <h1>This is a headin ...

  10. 《HelloGitHub》第 77 期

    兴趣是最好的老师,HelloGitHub 让你对编程感兴趣! 简介 HelloGitHub 分享 GitHub 上有趣.入门级的开源项目. https://github.com/521xueweiha ...