Iptables GeoIP на Centos

 Я рассмотрю два варианта применения GeoIP фильтров в файрволе iptables. Первый, нативный, с подключением geoip-модуля. Он подходит если ядро выше 2.6.29. И второй, вручную, если ярдо ниже.

Устанавливаем необходимые пакеты для сборки модуля

# yum install gcc gcc-c++ make automake unzip zip xz kernel-devel-`uname -r` iptables-devel gawk

Добавляем репозитарий rpmforge для пакета perl-Text-CSV_XS

# wget http://pkgs.repoforge.org/rpmforge-release/rpmforge-release-0.5.2-2.el6.rf.x86_64.rpm

или

# wget http://pkgs.repoforge.org/rpmforge-release/rpmforge-release-0.5.2-2.el6.rf.i686.rpm

в зависимости от архитектуры, и устанавливаем пакет.

# yum install perl-Text-CSV_XS


Устанавливает xtables-дополнения

# wget http://downloads.sourceforge.net/project/xtables-addons/Xtables-addons/1.41/xtables-addons-1.41.tar.xz
# tar xvf xtables-addons-1.41.tar.xz
# cd xtables-addons-1.41/
# ./configure
# make
# make install

Создаём базу данных geoip для iptables

# cd geoip/
# ./xt_geoip_dl
# ./xt_geoip_build GeoIPCountryWhois.csv
# mkdir -p /usr/share/xt_geoip/
# cp -r {BE,LE} /usr/share/xt_geoip/

И теперь мы можем использовать модуль в iptables, например, так бы блокируем Японские IP-адреса:

# iptables -I INPUT -m geoip --src-cc JP -j DROP

Мы установили не только geoip модуль, но и несколько других, в том числе ipp2p (модуль работы с peer-2-peer протоколами), iface, gradm, lscan и другие.
Синтаксис использования модуля можете посмотреть вот так:

# iptables -m имя_модуля --help

Если же у Вас ядро старое, как, например в CentOS 5.X — 2.6.18, то можно использовать другой вариант. Он конечно не идеален, но работает. Я не рассматриваю вариант обновить ядро или наложить патч, это тоже возможно.
Допустим нам надо блокировать Японские IP-адреса. Создадим следующий скрипт c именем iptab_make:

#!/bin/bash

[ -f GeoIPCountryCSV.zip ] || wget -T 5 -t 1 http://geolite.maxmind.com/download/geoip/database/GeoIPCountryCSV.zip

echo -n "Creating CBE (Country,Begin,End) CSV file..."
unzip -p GeoIPCountryCSV.zip GeoIPCountryWhois.csv | grep Japan | awk -F \" '{print $10","$6","$8}' > cbe.csv
echo -ne "DONE\nGenerating iptables.rules file..."

(for c in $(awk -F , '{print $1}' cbe.csv | sort -u)
do
  grep "^$c," cbe.csv | awk -F , 'function s(b,e,l,m,n) {l = int(log(e-b+1)/log(2)); m = 2^32-2^l; n = and(m,e); if (n == and(m,b)) printf "-A INPUT -s %u.%u.%u.%u/%u -j DROP\n",b/2^24%256,b/2^16%256,b/2^8%256,b%256,32-l; else {s(b,n-1); s(n,e)}} s($2,$3)'
done) > iptables.rules

rm -f cbe.csv
echo "DONE"

exit 0

запускаем этот скрипт:

# sh iptab_make

На выходе получаем файл iptables.rules , который достаточно вставить в начало правил /etc/sysconfig/iptables и перезапустить файрвол. Теперь японские IP будут блокироваться.
Вы можете достаточно легко изменить правила и страну в самом скрипте. Страну я выделил жирным.

Удачи в настройках.
© shadow_alone

  • Alex Kotov

    Андрей спасибо за интересную статью
    Подскажите пожалуйста.
    У меня выдает ошибку после 
    ./configure 
    checking kernel version that we will build against… make: *** No rule to make target `kernelrelease’. Stop.0.0.0.0 in /lib/modules/2.6.18-308.el5.028stab099.3/buildWARNING: That kernel version is not officially supported. 
    Подскажите, что делать как быть пожалуйста.

  • andrey0003

    Вы внимательно перечитайте что я писал и какое у Вас ядро, и все вопросы отпадут само собой.

  • Всё работает, вот вставить  в начало правил /etc/sysconfig/iptables не получается так, что бы после рестарта файервола заработало! Не подскажите как вставить правильно?

  • Такого быть не может, если это CentOS. Внимательны будьте.

  •  Я сам понимаю, но если скопипейстить в  /etc/sysconfig/iptables всё содержимое iptables.rules то выдает ошибку. Если блок адресов с середины файла всё о.к. Может проблема в каком то символе или количестве строк?

  • Ну не в самое же начало ставить надо, поставьте до остальных правил.