Установка ipset в Linux (centOS/Debian/Ubuntu)

Установка ipset в Linux (centOS/Debian/Ubuntu)

Программа ipset дает возможность написать правило, только одно, а не использовать много однотипных правил iptables что позволяет ускорить работу iptables. Я хотел бы в своей теме «Установка ipset в Linux (centOS/Debian/Ubuntu)» рассказать как можно установить ipset в Linux, на примере centOS 6/7 и Debian 8, так же, расскажу и покажу на готовых примерах как пользоваться данной утилитой для блокировки IP или даже всей сети.

Установка ipset в Debian/Ubuntu

И так, я сейчас покажу как производиться установка ipset на deb’s ОС.

Установка на Debian:

# apt-get install module-assistant xtables-addons-source ipset-source xtables-addons-common

Далее, выполняем следующую команду для установки дополнительных модулей:

# module-assistant prepare auto-install xtables-addons-source

После чего, активируем модули:

# depmod -a

Работоспособность проверялась на Debian, на Ubuntu — не проверялась. Еси будет замечания, напишите мне, я исправлю.

Установка ipset в centOS

Выполняем команду.

Для x64 бит:

# yum install ipset.x86_64 ipset-devel.x86_64

Для x32 бит:

# yum install ipset.i686 ipset-devel.i686

Или можно использовать простую команду:

# yum install ipset -y

Можно, поискать пакет, выполнив:

# yum search ipset

И так, если используете Denyhosts то список IP адресов можно найти в файле /etc/hosts.deny, который содержит записи:

[..].
ALL: 55.55.55.55
ALL: 77.77.77.77
[...]

Приводим запись к нужному виду (выбираем с файла только IP адреса), так же, сортируем и убираем повторяющиеся записи:

# cat /etc/hosts.deny | sort| uniq| sed 's/ALL: //' >> /home/captain/blacklist_with_denyhosts

И приступаем к блокировке.

Настройка ipset в Linux (centOS/Debian/Ubuntu)

Создам список (N -new) set с именем dropip, в нем будет сохраняться все заблокированные IP (Список для блокировки по ip):

# ipset -N dropip iphash

Добавляю в этот список адреса в созданный список.

# ipset -A dropip 192.168.103.66
# ipset -A dropip 192.168.103.67

Создам следующий список, но в нем буду хранить все заблокированные сети (список для блокировки сетей):

# ipset -N dropnet nethash

После создания списка, я добавлю несколько сетей в него (A — add):

# ipset -A dropnet 192.168.10.0/24
# ipset -A dropnet 192.168.11.0/24

Смотрим наши списки (L — list):

# ipset -L

Получаем:

Name: dropip
Type: hash:ip
Header: family inet hashsize 1024 maxelem 65536 
Size in memory: 16536
References: 0
Members:
192.168.103.67
192.168.103.66

Name: dropnet
Type: hash:net
Header: family inet hashsize 1024 maxelem 65536 
Size in memory: 16816
References: 0
Members:
192.168.10.0/24
192.168.11.0/24

Можно просматривать конкретные списки, для этого используйте опцию «-L  имя_вашего_списка», например:

# ipset -L dropip

Name: dropip
Type: hash:ip
Header: family inet hashsize 1024 maxelem 65536 
Size in memory: 16504
References: 0
Members:

Чтобы удалить IP из dropip set используйте (D — delete):

# ipset -D dropip 55.55.55.55

Можно проверить наличия IP в dropip set (T — test):

# ipset -T blacklist 77.77.77.77
77.77.77.77 is in set blacklist.

Чтобы удалить все IP-шники из dropip set используйте следующую команду (F — flush):

# ipset -F dropip

Для того чтобы удалить сам dropip set (X) используйте:

# ipset -X dropip

Вспомним путь прохождения внешнего пакета в правилах iptables, сверху вниз:

-t raw PREROUTING
-t mangle PREROUTING
-t nat PREROUTING
-t mangle INPUT
-t filter INPUT

Вот наглядная картинка:

прохождения внешнего пакета в правилах iptables

прохождения внешнего пакета в правилах iptables

И так, все списки уже создано и готовы к использованию, но необходимо связать их с правилами iptables, для этого выполняем:

# iptables -A INPUT -m set --set dropip src -j DROP
# iptables -A INPUT -m set --set dropnet dst -j DROP

или

# iptables -v -I INPUT -m set --match-set dropip src -j DROP

Расшифрую команду подробнее:

  • -m set —  это используемый модуль в ipset.
  • —set — dropip, dropnet  — эта опция необходима для перечисления  списка(ов) которые будут использоваться.
  • src — созданый список выполняет проверку с IP-шником источника
  • dst — созданый список выполняет проверку с IP-шником назначения

Можно просмотреть цепочку INPUT, и убедиться что добавлено правило ipset:

# iptables -L INPUT -n -v --line-numbers

Пример с FORWARD и логированием:

# iptables -v -I FORWARD -m set --match-set dropip src -j LOG --log-prefix "DROP blacklist entry"
# iptables -v -I FORWARD -m set --match-set dropip src -j DROP

Чтобы удалить правила, используйте:

# iptables -D INPUT -m set --match-set dropip src -j DROP
# iptables -D FORWARD -m set --match-set dropip src -j DROP
 # iptables -D FORWARD -m set --match-set blacklist src -j LOG --log-prefix "DROP blacklist entry"

ЗАМЕЧАНИЕ! Все лог-файлы ipset и iptables нужно искать в логах самого ядра, т.к это «ядерные» модули.

Я пользуюсь syslog-ng, kernel логи перенаправляю в нужный мне файл. Просмотреть заблокированные IP-шники можно следующим образом:

# grep "DROP blacklist entry" /var/log/syslog-ng/kernel.log

Если не помните где лежат лог файлы, то можно использовать команду:

# grep -r "DROP blacklist entry" /var/log/*

Для удобства, есть готовый скрипт, он будет получать из файла список блокировок. Для начала, я создам папку где будет лежать скрипт:

# mkdir /etc/blacklist

Далее, скачаем список IP-шников (так же, при нужде можно скрипт добавив в задание cron):

# cd /etc/blacklist
# wget http://www.stopforumspam.com/downloads/listed_ip_1.zip
# unzip listed_ip_1.zip

Так выглядит скрипт:

#!/bin/bash
echo -n "Applying blacklist to IPSET..."
ipset -N blacklist iphash
xfile=$(cat /etc/blacklist/listed_ip_1.txt)
for ipaddr in $xfile
do
ipset -A blacklist $ipaddr
done
echo "...Done"
echo -n "Applying blacklist to Netfilter..."
iptables -v -I INPUT -m set --match-set dropip src -j LOG --log-prefix "DROP blacklist entry"
iptables -v -I INPUT -m set --match-set dropip src -j DROP
echo "...Done"

Есть замечание для UDP, по правилу iptables. Если firewall был настроен должным образом, (политики DROP), и вы открыли только необходимые порты, следует прописать более конкретные правила, для нужного порта, например:

# iptables -I INPUT -m set --match-set dropip src -p TCP --destination-port 80 -j REJECT

# iptables -I INPUT -m set --match-set dropip src -p TCP --destination-port 80 -j LOG --log-prefix "DROP blacklist entry INPUT

Чтобы заблокировать IP-адреса, основанный на geoIP страна, можно следующим скриптом:

#!/bin/sh
ipset -N geoblock nethash
for IP in $(wget -O – http://www.ipdeny.com/ipblocks/data/countries/{cn,kr,pk,tw,sg,hk,pe}.zone)
do
ipset -A geoblock $IP
done
iptables -A INPUT -m set –set geoblock src -j DROP

Так же, можно добавить

Для автоматического тайм-аута (auto-timeout) добавляем правило (и не генерирует никакого сообщения, если он уже существует):

# ipset create test hash:ip timeout 10
# ipset add --exists test 91.83.231.25 120 (overwriting the default 10 seconds value)

Для автоматического разпознавания MAC адресов: (определить диапазон):

# ipset create test bitmap:ip,mac range 192.168.103.0/24
# ipset add test 192.168.103.11,11:11:22:22:11:11
# ipset add test 192.168.103.12 (this one will auto-learn)

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

# Create the new set and add the entries to it
ipset -N new-set ....
ipset -A new-set ....
...
# Swap the old and new sets
ipset -W old-set new-set
# Get rid of the old set, which is now under new-set
ipset -X new-set

Если сильно интересно, то можно посчитать количество IP адресов в списке:

# wc -l /etc/blacklist/listed_ip_7.txt

Смотрим наш ipset и какой его размер следующей командой:

# ipset --list -terse

После всех изменений, необходимо сохранить правила ipset, для этого существует команда:

# ipset -S > /etc/firewall/ipset-save

Можно добавить ipset в автозагрузку ОС, для этого нужно открыть:

# vim /etc/rc.local

И добавляем команду:

# cat /etc/firewall/ipset-save | /usr/sbin/ipset -R

Все готово, используйте. На этом, у меня все. Статья «Установка ipset в Linux (centOS/Debian/Ubuntu)»  завершена.

8 thoughts on “Установка ipset в Linux (centOS/Debian/Ubuntu)

  1. Почему везде приводят пример с ip-адресами? Покажите пример ipset с использованием списка портов.

  2. Отличный мануал!! Спасибо!
    Уточните маленький нюанс — вы даете скрипт, который подгружает весь список IP для бана. А как этот скрипт применить? В автозагрузку его поставить или еще как-то?

    • Можно добавить его в crontab и чтобы он выполнялся ( запускался) по указанному расписанию. Так же, можно запускать его переодически «в ручном режиме». Смотря как будет вам удобно.

  3. Со скриптами разобралась, и нашла ошибку в вашем:
    «Чтобы заблокировать IP-адреса, основанный на geoIP страна, можно следующим скриптом:»
    Ошибка в последней строке (неверный аргумент -set сработало такое правило:

    iptables -A INPUT -m set --match-set geoblock src -j DROP
    
  4. логирование

    -j LOG --log-prefix "DROP blacklist entry"
    

    не сработает, потому что стоит после дропа

Добавить комментарий

Ваш адрес email не будет опубликован.

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.