Использование ipset в iptables: руководство по оптимизации производительности - docs.devboxops.com

Использование 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Высокое при большом количестве правилМинимальное
УправляемостьСложно управлять тысячами правилПростое управление списками
ПамятьЛинейный рост с количеством правилОптимизированное использование

Практические рекомендации

  1. Используйте ipset для списков, содержащих более 10-15 IP-адресов
  2. Группируйте по назначению: создавайте отдельные списки для разных целей (офисные сети, CDN-провайдеры, whitelist и т.д.)
  3. Автоматизируйте обновление списков для динамически изменяющихся диапазонов (например, CloudFlare)
  4. Тестируйте изменения перед применением в бою
  5. Мониторьте размер списков — очень большие списки могут негативно влиять на производительность

Дополнительная информация

Использование ipset-списков является неотъемлемой частью эффективной настройки iptables на высоконагруженных серверах. Это решение особенно критично при защите от DDoS-атак и управлении большими whitelist/blacklist списками.

Top