2017-04-11 131 views
3

如何使用私有IP地址創建自定義Maxmind數據庫。具有私有IP的自定義MaxmindDB(geoip2)

我需要這樣的東西Customizing Maxmind DB

我試圖關注此Building Your Own MMDB Database for Fun and Profit。因此,我將PERL腳本更改爲以下內容:

#!/usr/bin/env perl 

use strict; 
use warnings; 
use feature qw(say); 

use MaxMind::DB::Writer::Tree; 
use Net::Works::Network; 

my $filename = 'users.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 = (
    latitude => 'uint32', 
    longitude  => 'uint32', 
    city   => 'utf8_string', 
    country  => 'utf_string', 
); 

my $tree = MaxMind::DB::Writer::Tree->new(

    # "database_type" is some arbitrary string describing the database. At 
    # MaxMind we use strings like 'GeoIP2-City', 'GeoIP2-Country', etc. 
    database_type => 'My-IP-Data', 

    # "description" is a hashref where the keys are language names and the 
    # values are descriptions of the database in that language. 
    description => 
     { en => 'My database of IP data', fr => q{Mon Data d'IP}, }, 

    # "ip_version" can be either 4 or 6 
    ip_version => 4, 

    # add a callback to validate data going in to the database 
    map_key_type_callback => sub { $types{ $_[0] } }, 

    # "record_size" is the record size in bits. Either 24, 28 or 32. 
    record_size => 24, 
); 

my %address_for_employee = (
    '10.1.0.0/16' => { 
      latitude => -12.9608, 
     longitude  => 40.5078, 
     city   => 'Maputo', 
    country   => 'Mozambique', 
    }, 
    '10.2.0.0/16' => { 
     latitude => -25.0519, 
     longitude  => 33.6442, 
     city   => 'Gaza', 
    country   => 'Mozambique', 
    }, 
); 

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}); 
} 

# Write the database to disk. 
open my $fh, '>:raw', $filename; 
$tree->write_tree($fh); 
close $fh; 

say "$filename has now been created"; 

但是沒有運氣。 現在我得到以下錯誤: 迭代目前不允許在沒有節點的樹中。記錄類型:空/usr/local/lib/perl/5.14.2/MaxMind/DB/Writer/Tree.pm行292.

任何人都可以幫我創建一個GEOIP2數據庫與私人IP地址?

回答

2

這是因爲你輸入的ip是私人ip地址。 您可以通過編輯文件解決它:

/usr/local/lib64/perl5/MaxMind/DB/Writer/Tree.pm, line 307 
307 my @reserved_4 = qw(
308   0.0.0.0/8 
309   10.0.0.0/8 
310   100.64.0.0/10 
311   127.0.0.0/8 
312   169.254.0.0/16 
313   172.16.0.0/12 
314   192.0.0.0/29 
315   192.0.2.0/24 
316   192.88.99.0/24 
317   192.168.0.0/16 
318   198.18.0.0/15 
319   198.51.100.0/24 
320   203.0.113.0/24 
321   224.0.0.0/4 
322   240.0.0.0/4 
323 ); 

這是所有的私有IP地址。刪除一些東西,使其工作!例如: : 我刪除「10.0.0.0/8」,並再次執行命令:perl examples/01-getting-started.pl

+0

感謝您的回答。我按你所說的做了,但不幸的是它不起作用。我現在收到以下錯誤消息。 無法在/usr/local/lib/perl/5.14.2/MaxMind/DB/Writer/Serializer.pm第211行通過軟件包「MaxMind :: DB :: Writer :: Serializer」找到對象方法「_encode_utf_string」。 – Rabbit

0

我在構造函數中使用了remove_reserved_networks參數。

my $tree = MaxMind::DB::Writer::Tree->new(

# "database_type" is some arbitrary string describing the database. At 
# MaxMind we use strings like 'GeoIP2-City', 'GeoIP2-Country', etc. 
database_type => 'GeoIP2-City', 

# "description" is a hashref where the keys are language names and the 
# values are descriptions of the database in that language. 
description => 
    { en => 'Zeiss-IP-Ranges', de => q{Zeiss-IP-Bereiche}, }, 

# "ip_version" can be either 4 or 6 
ip_version => 4, 

# add a callback to validate data going in to the database 
map_key_type_callback => sub { $types{ $_[0] } }, 

# "record_size" is the record size in bits. Either 24, 28 or 32. 
record_size => 24, 

remove_reserved_networks => 0, 
);