суббота, 12 ноября 2011 г.

Iptables & GeoIP


Мануал по установке и использованию Iptables с GeoIP
Обновляемся:
apt-get update && apt-get upgrade
Устанавливаем необходимые модули:
apt-get install module-assistant
module-assistant prepare
module-assistant auto-install xtables-addons-source
Создаем каталог для данных GeoIP:
mkdir /usr/share/xt_geoip/
cd /usr/share/xt_geoip/
Скачиваем базу GeoIP:
wget http://geolite.maxmind.com/download/geoip/database/GeoIPCountryCSV.zip
unzip GeoIPCountryCSV.zip
Создаем скрипт для конвертации из CSV в формат пригодный для iptables:
vi geoip_csv_iv0.pl
#!/usr/bin/perl
#
#   Converter for MaxMind CSV database to binary, for xt_geoip
#   written by Jan Engelhardt <jengelh@computergmbh.de>, 2009
#   This script is released into the Public Domain.
#
#   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;
}
Обрабатываем им CSV файл:
chmod +x geoip_csv_iv0.pl
./geoip_csv_iv0.pl -b GeoIPCountryWhois.csv
После чего в каталоге будет большое кол-во файликов *.iv0
Теперь можно применять правила Iptables с функционалом GeoIP, например заблокируем доступ к 80 порту для всех IP адресов, кроме России, Украины и Белоруссии:
iptables -A INPUT -p tcp --dport 80 -m geoip ! --src-cc RU,UA,BY -j DROP
iptables -A INPUT -p udp --dport 80 -m geoip ! --src-cc RU,UA,BY -j DROP

Комментариев нет:

Отправить комментарий