Консольні утиліти для роботи з 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