iptables + geoip на базе CentOS
6 Декабрь 2011, 09:29
Вчера вечером мне понадобилось заблокировать на веб-сервере по управлением CentOS 5 все входящие пакеты от источников, не принадлежащих адресному пространству РФ. Почитав немного литературы, решил не заморачиваться с прописыванием подсетей в правилах, а для универсальности установить модуль geoip для iptables.
Создадим где нибудь каталог ля наших эксперимантов:
# mkdir /usr/src/geoip
# cd /usr/src/geoip
Сейчас в сборках ядра в репозиториях отсутствует поддержка geoip, поэтому нужно ядро будет пропатчить. Для этого скачаем исходники нашей версии ядра:
# wget ftp://ftp.redhat.com/pub/redhat/linux/enterprise/5Server/en/os/SRPMS/kernel-$(uname -r).src.rpm
Вытянем архив с исходниками из rpm-пакета и распакуем его:
# rpm2cpio kernel-$(uname -r).src.rpm | cpio -idv linux-2.6.18*.tar.bz2
# tar xjf linux-2.6.18.4.tar.bz2
*В вашем случае имя архива может отличаться (смотрите в выводе предыдущей команды)
Скачиваем исходники для вашей версии iptables и распаковываем:
# wget ftp://ftp.redhat.com/pub/redhat/linux/enterprise/5Server/en/os/SRPMS/iptables-1.3.5-5.3.el5_4.1.src.rpm
# rpm2cpio iptables-1.3.5-5.3.el5_4.1.src.rpm | cpio -idv iptables-1.3.5.tar.bz2
# tar xjf iptables-1.3.5.tar.bz2
Ну и тянем самого виновника торжества geoip и патчер:
# wget http://ftp.netfilter.org/pub/patch-o-matic-ng/snapshot/patch-o-matic-ng-20100218.tar.bz2
# tar xjf patch-o-matic-ng-20100218.tar.bz2
# wget http://people.netfilter.org/peejix/patchlets/geoip.tar.gz
# tar xzf geoip.tar.gz -C patch-o-matic-ng-20100218/patchlets/
Все, все исходники у нас имеются, приступим непосредственно к установке модуля. Сперва нужно включить поддержку geoip в ядре, - наложим патч:
# cd /usr/src/geoip/patch-o-matic-ng-20100218
Запустим патчер:
# ./runme geoip
Он попросит указать пути до исходников ядра и iptables, - укажем ему /usr/src/geoip/linux-2.6.18.4/ для ядра и /usr/src/geoip/iptables-1.3.5/ для iptables
Он дорлжен будет показать описание нового модуля (geoip) и спросит нашего разрешения о применении патча. Жмем 'y'.
Если все прошло успешно, то он появится нечто похожее на это:
Excellent! Source trees are ready for compilation.
Recompile the kernel image (if there are non-modular netfilter modules).
Recompile the netfilter kernel modules.
Recompile the iptables binaries.
Теперь необходимо собрать сам модуль для нашего ядра. Переходим в каталог с исходниками ядра
# cd /usr/src/geoip/linux-2.6.18.4
Копируем в него конфигурацию текущего ядра:
# cp /boot/config-$(uname -r) .config
# cp /boot/symvers-$(uname -r).gz .
# gunzip symvers-$(uname -r).gz
# mv symvers-$(uname -r) Module.symvers
Ну и запускаем на сборку:
# make oldconfig
Везде жмем <ENTER>, кроме случая, когда установщик задаст вопрос "geoip match support (IP_NF_MATCH_GEOIP) [N/m/?] (NEW)". Здесь выбирем пункт 'm' (устанавливаем geoip как модуль).
Подготавливаем модули и компилим:
# make modules_prepare
# make -C $(pwd) M=net/ipv4/netfilter/ modules
Теперь кладем наш новоиспеченый модуль в папочку к остальным установленным в ОС модулям:
# cp net/ipv4/netfilter/ipt_geoip.ko /lib/modules/$(uname -r)/kernel/net/ipv4/netfilter/
Активируем его:
# depmod -a
# modprobe ipt_geoip
Так, на уровне ядра мы с этим вопросом покончили, теперь беремся за модуль к iptables:
# cd /usr/src/geoip/iptables-1.3.5
# make KERNEL_DIR=/usr/src/linux-2.6.18.4/ extensions/libipt_geoip.so
Полученный модуль копируем к остальным в ОС:
# cp extensions/libipt_geoip.so /lib/iptables/
*Для x64 или x86-64 модуль кладем в /lib64/iptables/
Но и это еще не все. Модуль то готов, но работать он не будет, ему требуется его база в папке /var/geoip
Скачиваем ее и разворачиваем туда:
# mkdir /var/geoip
# cd /var/geoip
# wget http://www.maxmind.com/download/geoip/database/GeoIPCountryCSV.zip
# unzip GeoIPCountryCSV.zip
# csv2bin GeoIPCountryWhois.csv
*Скорее всего придется скачать или доустановить утилиту csv2bin, чтобы выполнить конвертацию, но это уже как-нибудь сами =)
На этом все. Посмотреть как пользоваться новым модулем можно командой
# iptables -m geoip --help
Например, этом правилом можно запретить любые запросы к нашему веб-серверу с адресов не принадлежащих РФ:
# iptables -I INPUT -p tcp --dport 80 -m geoip ! --source-country RU -j DROP
Возникнут трудности, пишите в коменты - помогу
6 Ответа(ов) на "iptables + geoip на базе CentOS"
21 Февраль 2012, 09:14
Вот тут лажа:
tar xjf tar xjf
(5 код).
Продублировали команду 2 раза
21 Февраль 2012, 18:38
Спасибо. Поправлю
4 Октябрь 2012, 17:32
все делаю так же, версии ядра и iptables как в примере, но после
#make KERNEL_DIR=/usr/src/linux-2.6.18.4/ extensions/libipt_geoip.so
получаю
make: *** No rule to make target `extensions/libipt_geoip.so`. Stop.
4 Октябрь 2012, 17:37
Нашел. У меня правильно
#make KERNEL_DIR=/usr/src/geoip/linux-2.6.18.4/ extensions/libipt_geoip.so
в пути после src/ не хватало geoip/
10 Декабрь 2012, 09:19
Хм, не нашел разницы между написанными вами строками)
4 Ноябрь 2013, 07:34
Прошу помоч мне с установкой csv2bin. Поскольку с линуксом столкнулся совсем недавно, пока еще совсем нуб. пишу так:
# cd /usr/src/geoip
# wget http://people.netfilter.org/peejix/geoip/tools/csv2bin-20041103.tar.gz
# tar xzf csv2bin-20041103.tar.gz
но при запуске
# csv2bin GeoIPCountryWhois.csv
продолжает говорить
-bash: csv2bin: command not found
Спасибо.