Go to content Go to menu

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"

  1. Аркадий Says:

    Вот тут лажа:
    tar xjf tar xjf
    (5 код).
    Продублировали команду 2 раза

  2. Александр Says:

    Спасибо. Поправлю

  3. Netter Says:

    все делаю так же, версии ядра и 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. Netter Says:

    Нашел. У меня правильно
    #make KERNEL_DIR=/usr/src/geoip/linux-2.6.18.4/ extensions/libipt_geoip.so

    в пути после src/ не хватало geoip/

  5. Александр Says:

    Хм, не нашел разницы между написанными вами строками)

  6. Andrey Sorokin Says:

    Прошу помоч мне с установкой 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

    Спасибо.

Leave A Reply

Помощь по Textile