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

nginx и mmdb