Использование ipset в iptables: руководство по оптимизации производительности
Подробное руководство по использованию ipset-списков в iptables для оптимизации производительности брандмауэра Linux
Использование ipset-списков в iptables
Зачем нужен ipset
Изначально ipset создавался как более эффективная альтернатива тысячам однотипных правил в iptables (когда различается только IP-адрес). Плюс это полезно в паре с fail2ban, когда набегает действительно много ботов.
Преимущество ipset — более низкая нагрузка на процессор при проверке присутствует ли нужное значение в списке. iptables же в случае с парой тысяч правил и высоком packet rate начинает нещадно жрать процессор.
Интеграция на примере Ubuntu
Для примера нам нужно разрешить серверам CloudFlare (а список большой и часто меняется) доступ к нашему серверу.
Установка
В большинстве дистрибутивов есть в репозитории, либо ставится по умолчанию. Устанавливаем в Ubuntu:
apt-get install ipset
⚠️ Важно: Практически всегда ipset недоступен в OpenVZ контейнерах и включить его нет возможности.
Готовим списки
Помимо банального списка IP-адресов ipset умеет еще кучу других полезных типов списков. Подробнее можно посмотреть в man ipset
.
Создание списка вручную
Если клиент просит добавить определенные IP-адреса в списки, то делаем отдельный список и добавляем вручную:
ipset -N somelist hash:ip
ipset -A somelist 10.10.10.10
Где:
somelist
— название спискаhash:ip
— тип списка (только для единичных адресов)hash:net
— тип списка (только для подсетей адресов)
Просмотр результата
~# ipset save
create somelist hash:ip family inet hashsize 1024 maxelem 65536
add somelist 10.10.10.10
Удаление записи
ipset del somelist 10.10.10.10
Применение: Сценарий выше подходит, например, если необходимо открыть доступ к базе для определенных IP-адресов или предоставить доступ к серверу и т.п.
Автозагрузка
Сохранение списка
Сохраняем список (при условии добавления через ipset add
):
ipset save > /etc/network/ipset.list
Настройка автозагрузки
Добавляем в /etc/network/interfaces
как pre-up
к “внешнему” интерфейсу:
pre-up /sbin/ipset -exist restore < /etc/network/ipset.list
⚠️ Важно: Добавить загрузку списков ДО загрузки правил iptables, иначе iptables-restore
закончится ошибкой.
Пример использования в iptables
Для IPv4
iptables -A custom_input -p icmp -m icmp --icmp-type echo-request \
-m set --match-set cf-v4 src \
-m comment --comment "ping-pong for cf-v4" \
-j ACCEPT
Для IPv6
ip6tables -A custom_input -p ipv6-icmp -m icmp6 --icmpv6-type echo-request \
-m set --match-set cf-v6 src \
-m comment --comment "ping-pong for cf-v6" \
-j ACCEPT
Таким образом, каждый адрес источника ICMP пакета типа echo-request (пинг-запрос) проверяется в ipset списке под названием cf-v4
/cf-v6
.
Полезные возможности
Дополнительные функции ipset
Помимо базового функционала стоит обратить внимание на:
- timeout для записей, добавленных в список
- обработчик SET (
-j SET
) в iptables для добавления или удаления записей на лету
Преимущества использования ipset
Критерий | iptables (множество правил) | ipset |
---|---|---|
Производительность | Снижается с ростом количества правил | Константная скорость поиска |
Использование CPU | Высокое при большом количестве правил | Минимальное |
Управляемость | Сложно управлять тысячами правил | Простое управление списками |
Память | Линейный рост с количеством правил | Оптимизированное использование |
Практические рекомендации
- Используйте ipset для списков, содержащих более 10-15 IP-адресов
- Группируйте по назначению: создавайте отдельные списки для разных целей (офисные сети, CDN-провайдеры, whitelist и т.д.)
- Автоматизируйте обновление списков для динамически изменяющихся диапазонов (например, CloudFlare)
- Тестируйте изменения перед применением в бою
- Мониторьте размер списков — очень большие списки могут негативно влиять на производительность
Дополнительная информация
Использование ipset-списков является неотъемлемой частью эффективной настройки iptables на высоконагруженных серверах. Это решение особенно критично при защите от DDoS-атак и управлении большими whitelist/blacklist списками.