Я пытаюсь создать пользовательскую базу данных для внутренней сети, используя Perl Writer от MaxMind, который до сих пор работает хорошо. Затем я пытаюсь определить геолокацию этих диапазонов IP-адресов с помощью подключаемого модуля фильтра geoip в logstash. Я могу убедиться, что созданная база данных правильно содержит мои данные, используя сценарий perl, использующий MaxMind Reader.
#!/usr/bin/env perl
use strict;
use warnings;
use feature qw( say );
use local::lib 'local';
use MaxMind::DB::Writer::Tree;
use Net::Works::Network;
my $filename = 'test.mmdb';
# Your top level data structure will always be a map (hash). The MMDB format
# is strongly typed. Describe your data types here.
# See https://metacpan.org/pod/MaxMind::DB::Writer::Tree#DATA-TYPES
my %types = (
geoname_id => 'uint32',
locale_code => 'utf8_string',
continent_code => 'utf8_string',
continent_name => 'utf8_string',
country_iso_code => 'utf8_string',
country_name => 'utf8_string',
subdivision_1_iso_code => 'utf8_string',
subdivision_1_name => 'utf8_string',
city_name => 'utf8_string',
metro_code => 'uint32',
time_zone => 'utf8_string',
postal_code => 'utf8_string',
latitude => 'double',
longitude => 'double',
);
my $tree = MaxMind::DB::Writer::Tree->new(
database_type => 'GeoIP2-City',
description => { en => 'IP-Ranges', de => q{IP-Bereiche}, },
ip_version => 4,
map_key_type_callback => sub { $types{ $_[0] } },
record_size => 24,
remove_reserved_networks => 0,
);
my %address_for_employee = (
'xx.xx.xx.xx/24' => {
geoname_id => 3164699,
locale_code => 'de',
continent_code => 'EU',
continent_name => 'Europa',
country_iso_code => 'IT',
country_name => 'Italien',
subdivision_1_iso_code => '09',
city_name => 'Varese',
time_zone => 'Europe/Rome',
postal_code => '21100',
latitude => 45.7908,
longitude => 8.8515,
},
'xx.xx.xx.xx/24' => {
geoname_id => 3164699,
locale_code => 'de',
continent_code => 'EU',
continent_name => 'Europa',
country_iso_code => 'IT',
country_name => 'Italien',
subdivision_1_iso_code => '09',
city_name => 'Varese',
time_zone => 'Europe/Rome',
postal_code => '21100',
latitude => 45.7908,
longitude => 8.8515,
},
);
for my $address ( keys %address_for_employee ) {
# Create one network and insert it into our database
my $network = Net::Works::Network->new_from_string( string => $address );
$tree->insert_network( $network, $address_for_employee{$address} );
say "Created Subnet from ___ $network ===> $address ___";
}
# Write the database to disk.
open my $fh, '>:raw', $filename;
$tree->write_tree( $fh );
close $fh;
say "$filename has now been created";
Конфигурация фильтра Logstash:
filter {
geoip {
source => "src_ip"
target => "src_ip_geo"
database => "test.mmdb"
add_field => [ "[src_ip_geo][coordinates]", "%{[src_ip_geo][longitude]}" ]
add_field => [ "[src_ip_geo][coordinates]", "%{[src_ip_geo][latitude]}" ]
}
mutate {
convert => [ "[geoip][coordinates]", "float"]
}
}
Сравнивая его с рабочим процессом со старой базой данных MaxMind GeoLiteCity.dat, я пытаюсь добавить некоторые поля к выходным данным на основе IP-адресов, которые я определил в базе данных. Однако журналы правильно отправляются в elasticsearch, но без дополнительных полей, но с добавленным тегом, который гласит: _geoip_lookup_failure
Есть ли способ как-то отладить этот фильтр, поскольку мой журнал logstash не дает никаких подсказок. Я также вывожу с помощью
output { stdout{ codec => "json" } }
но там нет ошибки или предупреждения, просто простой json, который затем передается в elasticsearch. Правильно ли создана база данных?