Установка 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"
    

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

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

Ваш e-mail не будет опубликован. Обязательные поля помечены *