====== 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