ipset в CentOS
CentOS отличается некоторой консервативностью в версиях установленного ПО, что иногда приводит к проблемам с установкой нужной программы, не исключением стал и ipset.
Первым делом я проверил, есть ли ipset в базовой системе, конечно же его не было. Пробежавшись по сайтам из найденных google по запросу “ipset centos”, так же не нашел готового решения. Проблема есть, а вот методы решения ее самые разные. Большинство отказывались от ядра CentOS в пользу “чистого” ядра с kernel.org, патчили и ставили его. Мне такой подход не понравился, так как обновлять ядро хочется все тем же yum, а не каждый раз путем пересборки.
Погуглив еще немного, я нашел способ поставить утилиту ipset и модуль ядра через yum. Для этого нужно подключить дополнительные репозитории: CentALT и epel.
Сразу скажу, что CentALT заточен во многом под ALT Linux, так что софтом из него стоит пользоваться осторожно в CentOS. Устанавливаем:
# wget http://download.fedora.redhat.com/pub/epel/5/i386/epel-release-5-3.noarch.rpm # wget http://centos.alt.ru/repository/centos/5/i386/centalt-release-5-3.noarch.rpm # rpm -iv epel-release-5-3.noarch.rpm # rpm -iv centalt-release-5-3.noarch.rpm # yum check-update
Если у вас x86_64 архитектура, то просто смените i386 на x86_64 в ссылках.
Теперь можно поставить модуль ядра и утилиту ipset, после проверяем все ли работает:
# yum install kmod-ipset.i688 ipset.i386 # modprobe ip_set # lsmod | fgrep ip_set ip_set 23708 0 # ipset -V ipset v2.5.0 Protocol version 2. # iptables -m set -h iptables v1.3.5: Couldn't load match `set':/lib/iptables/libipt_set.so: cannot open shared object file: No such file or directory Try `iptables -h' or 'iptables --help' for more information.
Не все так гладко, как хотелось бы! Модуль и утилита ipset есть, а iptables не может с ней работать. Дело в версии iptables, нужна версия старше 1.4, но в CentOS ее нет. Так что придется все же пойти на определенные жертвы. Будем ставить iptables из сорцов. Сносим “родной” iptables и ставим более новую версию. Перед этим добавляем в систему gcc, если еще нет:
# cp /etc/init.d/iptables /root/ # yum erase iptables # yum install gcc # cd /usr/src/ # wget http://www.netfilter.org/projects/iptables/files/iptables-1.4.7.tar.bz2 # tar xjf iptables-1.4.7.tar.bz2 # cd iptables-1.4.7 # ./configure # make # make install # hash -r
Создаем тестовую таблицу и проверяем, что все работает:
# ipset -N badip iphash
# ipset -A badip 10.10.1.10
# iptables -A INPUT -p icmp -m set --set badip src -j DROP
# iptables -vL
Chain INPUT (policy ACCEPT 24372 packets, 2261K bytes)
pkts bytes target prot opt in out source destination
4 240 DROP icmp -- any any anywhere anywhere match-set badip src
Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
Chain OUTPUT (policy ACCEPT 489 packets, 45302 bytes)
pkts bytes target prot opt in out source destination
Chain RH-Firewall-1-INPUT (0 references)
pkts bytes target prot opt in out source destination
Теперь про ложку дегтя, как же без нее. После удаления родного iptables и установки нового произошло несколько неприятных событий:
1) По умолчанию iptables из сорцов ставится в /usr/local/sbin/iptables, в родной был в /sbin/iptables. В принципе не проблема пересобрать нужными опциями (внимательно смотрим ./configure –help)
2) При удалении родного iptables, удаляется и /etc/init.d/iptables, так что я его я специально сохранил
3) Удаляется несколько полезный утилит типа iptstate
4) Все эти суммарные изменения могут где-нибудь неожиданно вылезти, так что перед вводом сервера в продакшен нужно очень хорошо все проверить.
UPDATE!!!
В репозитории CentAlt есть обновление для iptables с поддержкой ipset, так что достаточно
# yum update iptables
чтобы все заработало!
|
|