geoip: import scripts for building the xt_geoip database

This commit is contained in:
Jan Engelhardt
2010-07-24 11:14:14 +02:00
parent 4d48511f01
commit 922a9be87d
8 changed files with 64 additions and 5 deletions

View File

@@ -1,7 +1,7 @@
# -*- Makefile -*-
ACLOCAL_AMFLAGS = -I m4
SUBDIRS = extensions
SUBDIRS = extensions geoip
man_MANS := xtables-addons.8

View File

@@ -74,7 +74,7 @@ fi;
AC_SUBST([regular_CFLAGS])
AC_SUBST([kbuilddir])
AC_SUBST([xtlibdir])
AC_CONFIG_FILES([Makefile Makefile.iptrules Makefile.mans
AC_CONFIG_FILES([Makefile Makefile.iptrules Makefile.mans geoip/Makefile
extensions/Makefile extensions/ACCOUNT/Makefile
extensions/ipset/Makefile extensions/pknock/Makefile])
AC_OUTPUT

View File

@@ -4,6 +4,7 @@ HEAD
- RAWNAT: IPv6 variants erroneously rejected masks /33-/128
- new target xt_CHECKSUM
- xt_length2: add support for IPv6 jumbograms
- import xt_geoip database scripts
Xtables-addons 1.27 (May 16 2010)

View File

@@ -10,8 +10,8 @@ NOTE:
The country is inputed by its ISO-3166 code.
.PP
The extra files you will need is the binary database files. They are generated
from a country-subnet database with the geoip_csv_iv0.pl tool, available at
http://jengelh.medozas.de/files/geoip/ . The files MUST be moved to
/usr/share/xt_geoip/
from a country-subnet database with the geoip_csv_iv0.pl tool that should be
available in /usr/lib(exec)/xtables-addons/ . The resulting files MUST be moved
to /usr/share/xt_geoip/
as the shared library is statically looking for this pathname (e.g.
/usr/share/xt_geoip/LE/de.iv0).

2
geoip/.gitignore vendored Normal file
View File

@@ -0,0 +1,2 @@
/BE
/LE

3
geoip/Makefile.am Normal file
View File

@@ -0,0 +1,3 @@
# -*- Makefile -*-
pkglibexec_SCRIPTS = geoip_csv_iv0.pl geoip_download.sh

45
geoip/geoip_csv_iv0.pl Executable file
View File

@@ -0,0 +1,45 @@
#!/usr/bin/perl
#
# Converter for MaxMind CSV database to binary, for xt_geoip
# Copyright © Jan Engelhardt <jengelh@medozas.de>, 2008
#
# Use -b argument to create big-endian tables.
#
use Getopt::Long;
use IO::Handle;
use Text::CSV_XS; # or trade for Text::CSV
use strict;
my %country;
my %names;
my $csv = Text::CSV_XS->new({binary => 0, eol => $/}); # or Text::CSV
my $mode = "VV";
&Getopt::Long::Configure(qw(bundling));
&GetOptions("b" => sub { $mode = "NN"; });
while (my $row = $csv->getline(*ARGV)) {
if (!defined($country{$row->[4]})) {
$country{$row->[4]} = [];
$names{$row->[4]} = $row->[5];
}
my $c = $country{$row->[4]};
push(@$c, [$row->[2], $row->[3]]);
if ($. % 4096 == 0) {
print STDERR "\r\e[2K$. entries";
}
}
print STDERR "\r\e[2K$. entries total\n";
foreach my $iso_code (sort keys %country) {
printf "%5u ranges for %s %s\n",
scalar(@{$country{$iso_code}}),
$iso_code, $names{$iso_code};
open(my $fh, ">".uc($iso_code).".iv0");
foreach my $range (@{$country{$iso_code}}) {
print $fh pack($mode, $range->[0], $range->[1]);
}
close $fh;
}

8
geoip/geoip_download.sh Executable file
View File

@@ -0,0 +1,8 @@
#!/bin/sh
rm -f GeoIPv6.csv{,.gz} GeoIPCountryCSV.zip GeoIPCountryWhois.csv;
wget \
http://geolite.maxmind.com/download/geoip/database/GeoIPv6.csv.gz \
http://geolite.maxmind.com/download/geoip/database/GeoIPCountryCSV.zip;
gzip -d GeoIPv6.csv.gz;
unzip GeoIPCountryCSV.zip;