本文演示如何使用 geoip 插件解析 IP 地址的归属地。


1、启动 Logstash

新建配置文件 geoip-demo.conf,并输入以下内容:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
input { 
stdin {
codec => 'json'
}
}
filter {
geoip {
source => '[ip]'
target => source
}
}
output{
stdout{}
}

使用 -f 参数指定到配置文件 geoip-demo.conf 启动 Logstash:

1
/usr/share/logstash/bin/logstash -f /mnt/d/src/yaybyc/geoip-demo.conf

如果只是为了测试,也可以不创建配置文件,直接使用 -e 参数指定配置的方式启动:

1
/usr/share/logstash/bin/logstash -e "input { stdin { codec => 'json' }} filter { geoip { source => '[ip]'  target => source}} output{ stdout{} }"

2、输入以下 IP 地址

1
{"ip":"222.209.9.72"}

3、解析结果如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
{
"@timestamp" => 2023-04-11T00:11:22.478684100Z,
"source" => {
"geo" => {
"timezone" => "Asia/Shanghai",
"region_iso_code" => "CN-SC",
"region_name" => "Sichuan",
"continent_code" => "AS",
"city_name" => "Chengdu",
"country_name" => "China",
"country_iso_code" => "CN",
"location" => {
"lat" => 30.6498,
"lon" => 104.0555
}
},
"ip" => "222.209.9.72"
},
"event" => {
"original" => "{\"ip\":\"222.209.9.72\"}\n"
},
"host" => {
"hostname" => "beenee9N"
},
"@version" => "1",
"ip" => "222.209.9.72"
}

geo 各字段说明:

字段 说明 示例值
country_name 国家名称 China
region_name 地域名称,省份 Sichuan
city_name 城市 Chengdu
timezone 时区 Asia/Shanghai
continent_code 大洲代码 AS
country_iso_code ISO国家代码 CN
region_iso_code ISO地域代码 CN-SC
location 位置,经纬度坐标
 lat 纬度 30.6498
 lon 经度 104.0555

continent_code 定义:

大洲代码 大洲名称(英文) 大洲名称(中文)
NA North America 北美洲
SA South America 南美洲
AS Asia 亚洲
OC Oceania 大洋洲
AF Africa 非洲
EU Europe 欧洲

TIPS:五大洲(Five continents)指地球陆地分成的五大版块,即亚洲(Asia)、欧洲(Europe)、非洲(Africa)、美洲(America)和大洋洲(Oceania)。地理学又将美洲分为北美洲和南美洲,南极洲无人居住,故也可称为七大洲

奥运五环的五环分别代表五大洲。五大洲中面积最大的是亚洲,第二大的是美洲,第三大的是非洲,第四大的是欧洲,最小的是大洋洲。
亚洲代表性国家:中国,日本,韩国,泰国,新加坡。
欧洲代表性国家:英国,法国,德国,希腊,意大利。
美洲代表性国家:美国,加拿大,巴西,阿根廷。
非洲代表性国家:埃及,南非,利比亚,肯尼亚。
大洋洲代表性国家:澳大利亚,新西兰。

参考来源:https://baike.baidu.com/item/五大洲/19920227

需要注意的是,如果使用默认的 geoip 插件来解析 IP 地址的归属地,会有以下两个问题:

  1. 解析出来的归属地名称是英文的;
  2. 国内很多 IP 地址解析不出来对应的归属地,或归属地的结果并不准确。

例如,IP 地址 60.253.155.38 没有找到所属的省、市(未返回 region_namecity_nameregion_iso_code 字段):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
{"ip":"60.253.155.38"}
{
"@timestamp" => 2023-04-11T00:09:08.647833700Z,
"source" => {
"geo" => {
"country_name" => "China",
"timezone" => "Asia/Shanghai",
"country_iso_code" => "CN",
"continent_code" => "AS",
"location" => {
"lat" => 34.7732,
"lon" => 113.722
}
},
"ip" => "60.253.155.38"
},
"event" => {
"original" => "{\"ip\":\"60.253.155.38\"}\n"
},
"host" => {
"hostname" => "airoo1Oi"
},
"@version" => "1",
"ip" => "60.253.155.38"
}

IP 地址 39.144.27.121 解析出来的归属地为中国-河南-周口,实际上通过 https://www.cz88.net/https://www.ipplus360.com/https://ip138.com/ 查询出来的结果是中国-河南-郑州。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
{"ip":"39.144.27.121"}
{
"@timestamp" => 2023-04-11T00:13:47.729754800Z,
"source" => {
"geo" => {
"timezone" => "Asia/Shanghai",
"region_iso_code" => "CN-HA",
"region_name" => "Henan",
"continent_code" => "AS",
"city_name" => "Zhoukou",
"country_name" => "China",
"country_iso_code" => "CN",
"location" => {
"lat" => 33.63,
"lon" => 114.6353
}
},
"ip" => "39.144.27.121"
},
"event" => {
"original" => "{\"ip\":\"39.144.27.121\"}\n"
},
"host" => {
"hostname" => "airoo1Oi"
},
"@version" => "1",
"ip" => "39.144.27.121"
}

(END)