Установка 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 -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)» завершена.
Почему везде приводят пример с ip-адресами? Покажите пример ipset с использованием списка портов.
А если наоборот, заблокировать всё кроме нескольких ip адресов?
Отличный мануал!! Спасибо!
Уточните маленький нюанс — вы даете скрипт, который подгружает весь список IP для бана. А как этот скрипт применить? В автозагрузку его поставить или еще как-то?
Можно добавить его в crontab и чтобы он выполнялся ( запускался) по указанному расписанию. Так же, можно запускать его переодически «в ручном режиме». Смотря как будет вам удобно.
Со скриптами разобралась, и нашла ошибку в вашем:
«Чтобы заблокировать IP-адреса, основанный на geoIP страна, можно следующим скриптом:»
Ошибка в последней строке (неверный аргумент -set сработало такое правило:
На момент написания статьи, все работало. Спасибо за помощь 😉
логирование
не сработает, потому что стоит после дропа
Спасибо! Поправил уже 😉