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
Андрей спасибо за интересную статью
Подскажите пожалуйста.
У меня выдает ошибку после
./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.
Подскажите, что делать как быть пожалуйста.
Вы внимательно перечитайте что я писал и какое у Вас ядро, и все вопросы отпадут само собой.
Всё работает, вот вставить в начало правил /etc/sysconfig/iptables не получается так, что бы после рестарта файервола заработало! Не подскажите как вставить правильно?
Такого быть не может, если это CentOS. Внимательны будьте.
Я сам понимаю, но если скопипейстить в /etc/sysconfig/iptables всё содержимое iptables.rules то выдает ошибку. Если блок адресов с середины файла всё о.к. Может проблема в каком то символе или количестве строк?
Ну не в самое же начало ставить надо, поставьте до остальных правил.