====== IPSET ======
ipset — это утилита для создания и управления наборами (сетами) IP-адресов, сетей, портов и их комбинаций. Она работает в связке с iptables/nftables, позволяя обрабатывать тысячи адресов в одном правиле, что значительно ускоряет фильтрацию.
===== Основные типы сетов =====
^ Тип ^ Описание ^
| ''hash:ip'' | Набор отдельных IP-адресов |
| ''hash:net'' | Набор подсетей (например, 192.168.1.0/24) |
| ''hash:ip,port'' | Пары IP:порт |
| ''hash:net,port'' | Сеть + порт |
| ''bitmap:ip'' | Диапазон IP (фиксированный размер) |
| ''list:set'' | Список из других сетов |
===== Основные команды =====
==== 1. Создать сет ====
ipset create <имя_сета> <тип> [опции]
Примеры:
Создать хеш-таблицу для 1000 IP-адресов
ipset create blacklist hash:ip hashsize 1024 maxelem 100000
Создать набор подсетей
ipset create allow_nets hash:net
Создать набор IP+порт (например, для блокировки порта 22 с определённых IP)
ipset custom_ssh hash:ip,port
==== 2. Добавить элемент ====
ipset add <имя_сета> <значение>
Примеры:
ipset add blacklist 192.168.1.100
ipset add blacklist 10.0.0.5
ipset add allow_nets 192.168.0.0/16
ipset add custom_ssh 203.0.113.5,22
==== 3. Удалить элемент ====
ipset del <имя_сета> <значение> ipset del blacklist 192.168.1.100
==== 4. Просмотреть содержимое ====
ipset list # все сеты ipset list blacklist # конкретный сет
==== 5. Сохранить и восстановить ====
# Сохранить все сеты в файл ipset save > /etc/ipset.conf
Восстановить из файла
ipset restore < /etc/ipset.conf
Автозагрузка (для systemd)
systemctl enable ipset
systemctl start ipset
==== 6. Удалить сет ====
ipset destroy <имя_сета> # удалить конкретный ipset destroy # удалить ВСЕ сеты (осторожно!)
==== 7. Очистить сет (удалить элементы) ====
ipset flush blacklist ipset flush # очистить все
==== 8. Проверить наличие элемента ====
ipset test blacklist 192.168.1.100
===== Примеры использования с iptables =====
==== Пример 1: Чёрный список IP ====
# Создаём сет для чёрного списка ipset create blocklist hash:ip
Добавляем IP для блокировки
ipset add blocklist 1.2.3.4
ipset add blocklist 5.6.7.0/24
Правило iptables: блокировать все пакеты из этих IP
iptables -I INPUT -m set --match-set blocklist src -j DROP
==== Пример 2: Белый список порта 22 только для разрешённых сетей ====
ipset create ssh_allow hash:net ipset add ssh_allow 192.168.1.0/24 ipset add ssh_allow 10.0.0.0/8
iptables -A INPUT -p tcp --dport 22 -m set --match-set ssh_allow src -j ACCEPT
iptables -A INPUT -p tcp --dport 22 -j DROP
==== Пример 3: Блокировка по IP+порт (например, ботнеты на 443) ====
ipset create bad_ssl hash:ip,port ipset add bad_ssl 203.0.113.10,443 ipset add bad_ssl 198.51.100.22,443
iptables -A INPUT -m set --match-set bad_ssl src,dst -j DROP
===== Полезные опции =====
''timeout'' — автоматическое удаление элемента через N секунд:
ipset create temp_ban hash:ip timeout 60
''counters'' — включить счётчики пакетов/байт:
ipset create stat_net hash:net counters
''comment'' — добавлять комментарии к элементам:
ipset create with_comments hash:ip comment
ipset add with_comments 8.8.8.8 comment "Google DNS"
===== Важные замечания =====
Сеты живут только в памяти (до перезагрузки), поэтому нужны ''ipset save/restore'' и автозагрузка.
Максимальное количество элементов задаётся при создании (''maxelem'').
Для ''hash:ip'' размер хеша (''hashsize'') лучше выбирать как степень двойки.
При удалении сета, на который ссылаются правила iptables, нужно сначала удалить эти правила.
===== Просмотр статистики =====
ipset list -t # краткий вывод ipset list blacklist -o save # в формате, совместимом с restore