Консольные утилиты для работы с mmdb
Первым делом стоит проверить дату сборки, используем утилиту mmdb-dump-metadata от MaxMind
https://github.com/maxmind/MaxMind-DB-Reader-perl/tree/master/bin
Свежесть == Актуальность
mmdb-dump-metadata --file /usr/src/geoip2/GeoLite2-City.mmdb
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | GeoLite2 City database
type: GeoLite2-City
languages: de
en
es
fr
ja
pt-BR
ru
zh-CN
binary format version: 2.0
build epoch: 1,589,304,163 (2020-05-12 17:22::43 UTC)
IP version: 6
node count: 3,790,930
record size: 28 bits
|
Как видим, данная база собрана 2020-05-12 17:22::43 UTC.
Чем больше, тем лучше?
Если же вам каким-либо образом удалось найти полную базу, не спешите её использовать, она может быть сильно устаревшей, не смотря на имя файла или его атрибуты.
Как правило, в открытом доступе именно они и находятся, свежие - по платной подписке.
Например, mmdb-dump-metadata --file /data/GeoIP2-City_2020-02-14.mmdb
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | GeoIP2 City database
type: GeoIP2-City
languages: de
en
es
fr
ja
pt-BR
ru
zh-CN
binary format version: 2.0
build epoch: 1,523,360,655 (2018-04-10 11:44::15 UTC)
IP version: 6
node count: 11,608,531
record size: 28 bits
|
файл с атрибутами и именем 2020-02-14, а фактически 2018-04-10.
А вот более новый:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | GeoIP2 City database
type: GeoIP2-City
languages: de
en
es
fr
ja
pt-BR
ru
zh-CN
binary format version: 2.0
build epoch: 1,576,511,346 (2019-12-16 15:49::06 UTC)
IP version: 6
node count: 10,082,156
record size: 28 bits
|
Тут интересно то, что в базе от 2018-04-10 11,608,531 записей, а в более новой 2019-12-16 10,082,156.
Что ещё раз говорит об актуальности, возможно, произошли слияния или укрупнения сетей каких-либо операторов.
Для сравнения, в открытой базе 3,790,930 записей, они актуальные, но более генерализованные, без деталей.
Для получения данных о принадлежности IP есть другая консольная утилита mmdblookup,
apt install mmdb-bin
mmdblookup --file /usr/src/geoip2/GeoLite2-City.mmdb --ip 8.8.8.8
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 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 | { "continent": { "code": "NA" <utf8_string> "geoname_id": 6255149 <uint32> "names": { "de": "Nordamerika" <utf8_string> "en": "North America" <utf8_string> "es": "Norteamérica" <utf8_string> "fr": "Amérique du Nord" <utf8_string> "ja": "北アメリカ" <utf8_string> "pt-BR": "América do Norte" <utf8_string> "ru": "Северная Америка" <utf8_string> "zh-CN": "北美洲" <utf8_string> } } "country": { "geoname_id": 6252001 <uint32> "iso_code": "US" <utf8_string> "names": { "de": "USA" <utf8_string> "en": "United States" <utf8_string> "es": "Estados Unidos" <utf8_string> "fr": "États-Unis" <utf8_string> "ja": "アメリカ合衆国" <utf8_string> "pt-BR": "Estados Unidos" <utf8_string> "ru": "США" <utf8_string> "zh-CN": "美国" <utf8_string> } } "location": { "accuracy_radius": 1000 <uint16> "latitude": 37.751000 <double> "longitude": -97.822000 <double> "time_zone": "America/Chicago" <utf8_string> } "registered_country": { "geoname_id": 6252001 <uint32> "iso_code": "US" <utf8_string> "names": { "de": "USA" <utf8_string> "en": "United States" <utf8_string> "es": "Estados Unidos" <utf8_string> "fr": "États-Unis" <utf8_string> "ja": "アメリカ合衆国" <utf8_string> "pt-BR": "Estados Unidos" <utf8_string> "ru": "США" <utf8_string> "zh-CN": "美国" <utf8_string> } } } |
Чтоб не потерялось
mmdb-dump-metadata
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 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 | #!/usr/bin/env perl use strict; use warnings; our $VERSION = '1.000014'; use Data::Printer; use Getopt::Long; use MaxMind::DB::Reader; sub main { my $file; GetOptions( 'file:s' => \$file, ); my $reader = MaxMind::DB::Reader->new( file => $file ); my $metadata = $reader->metadata()->metadata_to_encode(); my $has_datetime = eval { require DateTime; 1 }; my $languages = shift @{ $metadata->{languages} }; $languages .= "\n"; $languages .= join "\n", map { " $_" } sort @{ $metadata->{languages} }; my $format = <<"EOF"; %s type: %s languages: $languages binary format version: %s.%s build epoch: %s%s IP version: %s node count: %s record size: %s bits EOF printf( $format, $metadata->{description}{en}, $metadata->{database_type}, $metadata->{binary_format_major_version}, $metadata->{binary_format_minor_version}, _commify( $metadata->{build_epoch} ), ( $has_datetime ? ' (' . DateTime->from_epoch( epoch => $metadata->{build_epoch} + 0 ) ->format_cldr('YYYY-MM-dd HH:mm::ss vvv') . ')' : q{} ), $metadata->{ip_version}, _commify( $metadata->{node_count} ), $metadata->{record_size}, ); } main(); sub _commify { my $str = reverse $_[0]; $str =~ s/(\d\d\d)(?=\d)/$1,/g; return scalar reverse $str; } |
Оригинальный пост на SecOps.it Blog • Консольные утилиты для работы с mmdb