Статьи

Повышение производительности netfilter, использование ipset

Повышение производительности netfilter, использование ipset

iptables — интерфейс к файрволу Linux (netfilter). При большом количестве правил iptables нагрузка может быть достаточно высокой и создавать проблемы.

Основная причина нагрузки

Для начала: из-за чего вообще возникает нагрузка при большом количестве правил? Из-за того, что каждому сетевому пакету, обрабатываемому ядром, приходится проходить сравнение по всему списку правил каждой цепочки. Приведу схему, которая отражает цепочки netfilter и порядок прохождения по ним пакетов:



На схеме видно через какие цепочки пройдет тот или иной пакет и можно оценить нагрузку. Возьмем одно простейшее правило:
Код:
-A INPUT -s 10.1.1.1/32 -p tcp --dport 25 -j DROP
Это правило указывает файрволлу отбрасывать все пакеты с IP-адреса 10.1.1.1 на порт 25 локальной машины. Таблицу (-t) я не указываю, поэтому будет использоваться дефолтная (-t filter), что нам и нужно. Понятно, что действие DROP выполняется далеко не всегда. Однако, сравнение IP-адреса источника будет проходить любой входящий на локальную машину пакет. А если таких правил тысяча?

Что делать?
Теперь подумаем, как можно ускорить работу файрволла. Первый ответ очевиден — сокращать количество правил. Но вряд ли удастся серьезно оптимизировать записи, особенно если они изначально составлялись грамотно. Где-то вместо правил на несколько IP-адресов можно написать одно правило на подсеть. Где-то вместо правил на несколько портов можно использовать -m multiport и --dports/--sports a,b,c (a,b,c — номера портов). И так далее.

Ветвление правил, дополнительные цепочки
А есть еще второй вариант — использование ветвлений правил. Суть его в том, что однотипные правила группируются в отдельную цепочку, а в основной цепочке остается одно правило, которое перенаправляет пакет в отдельную цепочку в зависимости от какого-то общего признака пакетов. Приведу пример. Имеются три правила:
Код:
-A INPUT -s 10.1.1.1/32 -p icmp -j ACCEPT
-A INPUT -s 10.1.1.2/32 -p icmp -j ACCEPT
-A INPUT -s 10.1.1.3/32 -p icmp -j ACCEPT
Что объединяет эти правила? Одинаковый протокол — icmp. Вот по этому признаку и стоит сгруппировать правила. Вообще в данном случае эффективнее использовать ipset, но об этом дальше. Для группировки необходимо создать новую цепочку, а затем создать правило, которое будет отправлять пакеты в эту цепочку.
Создать цепочку PROT_ICMP:
Код:
iptables -N PROT_ICMP
Определить правила в этой цепочке:
Цитата:
-A PROT_ICMP -s 10.1.1.1/32 -j ACCEPT
-A PROT_ICMP -s 10.1.1.2/32 -j ACCEPT
-A PROT_ICMP -s 10.1.1.3/32 -j ACCEPT
Как видите, протокол (-p) в этой цепочке мы уже не проверяем, т.к. отправлять в эту цепочку будем только ICMP пакеты. И наконец отправить все пакеты ICMP в эту цепочку:
Код:
-A INPUT -p icmp -g PROT_ICMP
Теперь входящий пакет, если он не ICMP, будет проходить лишь через одно правило вместо трех.

ipset
А теперь предположим следующую ситуацию:
Код:
-A INPUT -s 10.1.1.1/32 -j DROP
-A INPUT -s 10.1.1.2/32 -j DROP
-A INPUT -s 10.1.1.3/32 -j DROP
Несколько однотипных правил, но сгруппировать их или сделать дополнительную цепочку не представляется возможным. В таких случаях, когда необходимо делать проверку по большому количеству IP-адресов и/или портов, на помощь приходит ipset. ipset представляет из себя модуль ядра ip_set, ряд вспомогательных библиотек и утилиту ipset для задания параметров. Наверняка есть в репозиториях вашего дистрибутива, так что с установкой не должно быть проблем.
Используется следующим образом:
Создается список:
Код:
ipset -N dropips iphash
dropips — название списка, iphash — тип списка. Типы списков можно посмотреть в man ipset, они есть на любой вкус — для работы с ip-адресами, подсетями, портами, mac-адресами. iphash служит для хранения IP-адресов, использование хэширования предотвращает добавление в список дублирующих IP-адресов.
Добавляется IP-адрес в список:
Код:
ipset -A dropips 10.1.1.1
Создается правило для использования списка:
Код:
iptables -A INPUT -m set --set dropips src -j DROP
-m set указывает на использование модуля ipset, --set dropips указывает список IP-адресов, src указывает на то, что сверять нужно только IP-источника. Таким образом, будут отбрасываться все пакеты с IP-адресов, указанных в списке dropips.

В статье я не стал описывать тюнинг сетевых параметров ядра, а сделал упор на рациональную организацию правил файрволла.

3.13

голосов: 12
2011.04.17 20:50 // ozs теги: iptables

Новый контент

Hostname lookup своими руками! читать

Хэш нам не преграда, потому что нам его не надо! читать

Startup Delayer 3.0.319: управление автозагрузкой приложений читать

Чертовски хороший LAMP: Пошаговое руководство по установке стека (L)AMP на FreeBSD читать

Tweak-7 1.0.1125: твикер для Windows 7 или как оптимизировать работу Windows 7 читать

Linux и 3G модем. Определение, настройка для подключения к сети. читать

Cистема шифрования TrueCrypt читать

Многопользовательский чат на BAT читать

Исследование: администраторы баз данных мало заботятся о безопасности читать

Оффлайновый способ хранить пароль читать

Спам — как средство передачи шифровок? читать

Мониторинг жёстких дисков при помощи SMART читать

Повышение производительности netfilter, использование ipset читать

Дело об отказавшей системе читать

Атаки на домен: завладеваем корпоративной сетью читать

Теги

adobe android anonymous apache apple assembler brutforce bsd c++ cgi chrome ddos delphi djvu dns facebook fingerprinting firefox freebsd ftp google html http ibm icq inattack intel internet internet explorer ip it java javascript linux livejournal mail microsoft mysql network pdf perl php python scanner security shell skype sms softice twitter unix visual c++ web wi-fi wikileaks windows xml xss администрирование алгоритм анонимность арест архив атака базы данных безопасность браузер брутфорс взлом вирус вирусы вконтакте домен защита игры интернет исследования кибертерроризм крис касперски мыщъх обратная разработка операционная система пароль первая полоса перехват данных подбор поиск поисковик поисковые системы пользователь программирование программы процессор разработка разработки реверсинг россия Руссинович руткит самоучитель сети социальная сеть спам спецслужбы справочник статистика суд сша телефон теория технологии троян учебник уязвимости уязвимость форум хакер хакеры яндекс
© INATTACK 2003 — 2012

Взлом

— искусство,

Хакер

— его творец.