ipset — инструмент состоящий из модуля ядра, библиотек и утилиты, позволяющий организовать список сетей, IP или MAC адресов и т.д., который очень удобно использовать например с IPTables.
Команда установки в Ubuntu:
sudo apt install ipset
Установка в CentOS:
sudo yum install ipset
Приведу возможные типы списка:
net (сети, например 192.168.5.0/24)
ip (только ip, например 192.168.5.5)
mac (MAC адреса, например 11:22:33:44:55:66)
port (порты, удобно при создании списков ip,port)
iface (сетевые интерфейсы, удобно при создании списков ip,iface)
Приведу несколько примеров создания списка (где ixnfo — имя списка):
ipset -N ixnfo nethash
ipset create ixnfo nethash
ipset create ixnfo hash:net
ipset create ixnfo hash:ip
ipset create ixnfo hash:ip,port
ipset create ixnfo hash:ip,iface
ipset create ixnfo hash:mac
Пример удаления списка:
ipset destroy ixnfo
Приведу примеры добавления данных в списки:
ipset add ixnfo 192.168.5.5/24
ipset add ixnfo 192.168.5.5
ipset add ixnfo 192.168.5.5,80
ipset add ixnfo 192.168.5.5,udp:1812
ipset add ixnfo 192.168.5.5,eth0
ipset add ixnfo 11:22:33:44:55:66
Пример удаления элемента из списка:
ipset del ixnfo 192.168.5.5
Если добавляются одинаковые элементы, например скриптами, и чтобы не отображались лишние сообщения, что элемент уже добавлен, добавим к команде «-exist», например:
ipset add ixnfo 192.168.5.5 -exist
ipset не даст добавить в список одинаковые элементы, если добавить несколько одинаковых, в списке все равно будет один.
Пример просмотра списков (где ixnfo — имя списка):
ipset -L
ipset --list
ipset -L ixnfo
Подсчет количество строк в списке, вторая команда с grep считает только IP адреса, что удобно, так как не считаются 7 строк с техническим текстом (где ixnfo — имя списка):
ipset -L | wc -l
ipset -L ixnfo | /bin/grep '\([[:digit:]]\{1,3\}\.\)\{3\}[[:digit:]]\{1,3\}' | /usr/bin/wc -l
Переименовать список можно так:
ipset –e OLDNAME NEWNAME
Теперь когда у нас создан список, вручную или его заполняет скрипт, используя ipset и iptables например, очень удобно запретить доступ к серверу всем адресам которые есть в списке:
iptables -I INPUT -m set --match-set ixnfo src -j DROP
Или так (разрешить доступ всем, кроме адресов в списке):
iptables -I INPUT -m set ! --match-set ixnfo src -j ACCEPT
Смотрите также мои статьи:
Скрипт добавления IP адресов из файла в ipset
Настройка IPTables