Ограничение доступа ТОМСК/НЕ-ТОМСК средствами ipset

ipset - еще один интерфейс работы со штатным ядерным фильтровальщиком пакетов netfilter.
ipset позволяет оптимизировать фильтрацию пакетов в условиях, когда требуется создать огромное количество правил обработки пакетов.

Установка ipset & iptables

ipset не входит в базовый комплект CentOS/RHEL, поэтому установим необходимые репозитории

rpm -ihv http://download.fedora.redhat.com/pub/epel/5/i386/epel-release-5-4.noarch.rpm
rpm -ihv http://centos.alt.ru/repository/centos/5/i386/centalt-release-5-3.noarch.rpm

Установим ipset и обновим iptables

yum install ipset
yum update iptables

Сборка модуля ядра для ipset

В репозиторий CentALT уже входит пакет kmod-ipset - это собранный модуль ядра для работы ipset. Но , к сожалению, на сервере c OpenVZ ядром модуль ipt_set отказался подгружаться:

ipset -V
ipset v4.5, protocol version 4.
FATAL: Module ip_set not found.
ipset v4.5: Couldn't verify kernel module version!
modprobe ipt_set
FATAL: Error inserting ipt_set (/lib/modules/2.6.18-274.7.1.el5.028stab095.1PAE/extra/ipt_set.ko): Unknown symbol in module, or unknown parameter (see dmesg)

Поэтому решено собрать модуль для ядра openvz-stable 2.6.18.

Установим пакет ovzkernel-PAE-devel

yum install ovzkernel-PAE-devel

Соберем модуль

cd ~
wget http://ipset.netfilter.org/ipset-4.5.tar.bz2
tar -xvjf ipset-4.5.tar.bz2
cd ipset-4.5
make KERNEL_DIR=/usr/src/kernels/2.6.18-274.3.1.el5.028stab094.3-i686/
make KERNEL_DIR=/usr/src/kernels/2.6.18-274.3.1.el5.028stab094.3-i686/ install
make KERNEL_DIR=/usr/src/kernels/2.6.18-274.3.1.el5.028stab094.3-i686/ clean

depmod -a

Загрузим модуль

modprobe ip_set

Настройка ipset

Внутри openvz-VPS мне не удалось прокинуть модуль ip_set, запуск VPS выполняется с сообщением:

vzctl enter 110
Warning: Unknown iptable module: ip_set, skipped 

Поэтому ipset я буду настраивать в HN (Hardware Node), т.е. все правила в iptables я буду сразу пихать в цепочку FORWARD.

Создадим таблицу TOMSKNET

ipset -N TOMSKNET nethash

Заполним таблицу TOMSKNET

Запустим скрипт tomsk.nets.2.ipset.sh

/root/scripts/tomsk.nets.2.ipset.sh

Создадим правила в iptables

iptables -A FORWARD -d 77.106.108.220 -p tcp -m tcp -m multiport --dports 20,21,80,49152:65535 -m set --set TOMSKNET src -m comment --comment "Accessing FTP and WEB only from TOMSKNET" -j ACCEPT 
iptables -A FORWARD -d 77.106.108.220 -p tcp -m tcp -m multiport --dports 20,21,49152:65535 -m comment --comment "Deny FTP from all other" -j REJECT
iptables -A FORWARD -d 77.106.108.220 -p tcp -m tcp --dport 80 --tcp-flags FIN,SYN,RST,ACK SYN -m connlimit --connlimit-above 20 --connlimit-mask 32 -j REJECT

Эти правила разрешают:

  1. доступ по FTP только для сетей TOMSKNET
  2. доступ по WEB без ограничений только для сетей TOMSKNET
  3. доступ по WEB для всех остальных c ограничением - до 20 одновременных tcp-сессий для каждого IP-адреса

Автозагрузка

Запишем загрузку модуля ipset в автозагрузку

echo "/sbin/modprobe ip_set" >> /etc/rc.modules
chmod a+x /etc/rc.modules

Скрипт tomsk.nets.2.ipset.sh в автозагрузку

chmod 700 /root/scripts/tomsk.nets.2.ipset.sh
echo '/root/scripts/tomsk.nets.2.ipset.sh' >> /etc/rc.local

Ссылки

Комментарии

 
blog/2011/12/07-ipset.txt · Последние изменения: 2014/03/27 19:10 — Антон Бугреев · []