转载自: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. Trie树模板2

    Trie数模板2 problem 这道题然后我们求最大异或对,我们很容易想出来 \(O(n^2)\) 的做法,两层循环遍历搞定 然后我们知道这样是肯定是肯定过不了的,我们考虑用字典树解决,然后我们来看 ...

  2. 清北学堂 2020 国庆J2考前综合强化 Day4

    目录 1. 题目 T1 写字符串 题目描述 Sol T2 神奇的数 题目描述 Sol T3 珠子染色 题目描述 Sol T4 病毒扩散 题目描述 Sol 算法 -- 图论 1. 题目 T1 写字符串 ...

  3. 从RabbitMQ平滑迁移到RocketMQ技术实战

    作者:vivo 互联网中间件团队- Liu Runyun 大量业务使用消息中间件进行系统间的解耦.异步化.削峰填谷设计实现.公司内部前期基于RabbitMQ实现了一套高可用的消息中间件平台.随着业务的 ...

  4. Vue3 computed && watch(watchEffect)

    1 # Vue3 计算属性与监视 2 # 1.computed函数:与Vue2.x中的computed配置功能一致 3 inport {ref,computed,watch} from 'vue'; ...

  5. powershell和cmd对比

    前言 计算机啊这东西,本质上是硬件和软件的综合体.如果只有硬件没有软件的话,这也是台辣鸡而已.而计算机软件中最靠近硬件的一层,就是操作系统层. 操作系统有很多种,比如Unix/Linux/Mac OS ...

  6. 高效能团队的Java研发规范(进阶版)

    目前大部分团队是使用的阿里巴巴Java开发规范,不过在日常开发中难免遇到覆盖不到的场景,本文在阿里巴巴Java开发规范基础上,补充一些常用的规范,用于提升代码质量及增强代码可读性. 编程规约 1.基础 ...

  7. Luogu2986 [USACO10MAR]伟大的奶牛聚集 (树形DP)

    有点权的重心,拆掉点dfs不就是了吗 //#include <iostream> #include <cstdio> #include <cstring> //#i ...

  8. 【java】学习路线5-public和private、构造方法、this关键字、封装对象、static关键字、main方法结构解析

    //一个教务管理系统//知识点清单/*public & private 的区别一个是公开的,一个是私有的,作用域不一样,访问的权限不一样咯如果是用private修饰,则调用者只可以是在当前的作 ...

  9. Android Notification使用

    一 Notification的类别 1.状态栏和抽屉式通知 //获取NotificationManager对象 val notificationManager = getSystemService(N ...

  10. HCNP Routing&Switching之DHCP安全

    前文我们了解了MAC地址防漂移技术,回顾请参考https://www.cnblogs.com/qiuhom-1874/p/16632239.html:今天我们来了解下DHCP安全相关话题: 回顾DHC ...