Iptables – производительность роутера
Создано: 13-06-2009 19:58:54  Метки: sysadmin linux
http://centos.alt.ru/?p=32
Низкая производительность роутера может быть связанна с некорректными настройками iptables.
Первое, что Вам необходимо сделать если на роутере нет NAT — отключить connection tracking делается это в таблице nat цепочка PREROUTING.

*raw
-A PREROUTING -j NOTRACK
COMMIT

Имейте ввиду, что если у Вас используются правила iptables с использованием модуля match, то Вам придется отказаться от их использования, также у Вас перестанут работать правила использующие conntrack таблицу.
Следующее проверить какие правила iptables отрабатываются чаще всего, и поставить их первыми. Посмотреть какие правила срабатывают чаще всего можно так:

iptables -L -n -v

В iptables правила проверяются линейно по очереди и каждый сетевой пакет будет проходить через всю цепочку правил до первого срабатывания условия, если правил слишком много, то это будет сильно нагружать ЦП роутера. Один из выходов из данной ситуации приведен ниже.
Пример:
Допустим есть сеть домового провайдера. Количество клиентов порядка 10000. При блокировании клиента он блокируется в правилах iptables. На текущий момент заблокированно 2000 клиентов, т. е. в iptables 2000 правил для пакетного фильтра типа:

-A FORWARD -s 192.168.0.1 -j DROP
-A FORWARD -s 192.168.0.2 -j DROP
-A FORWARD -s 192.168.0.3 -j DROP
--/ И так дальше/--
-A FORWARD -s 192.168.1.1 -j DROP
-A FORWARD -s 192.168.1.2 -j DROP
-A FORWARD -s 192.168.1.3 -j DROP
--/ И так дальше/--
-A FORWARD -s 192.168.2.1 -j DROP
-A FORWARD -s 192.168.2.2 -j DROP
-A FORWARD -s 192.168.2.3 -j DROP
--/ И так дальше/--
-A FORWARD -s 192.168.7.1 -j DROP
-A FORWARD -s 192.168.7.2 -j DROP
-A FORWARD -s 192.168.7.254 -j DROP
# Всех остальных пропускаем
-A FORWARD -j ACCEPT

т.е. для того чтобы проверить пропустить или заблокировать пакеты от машины 192.168.8.254 будет произведено 2000 проверок в правилах iptables . ЭТО УЖАСНО. При интенсивном сетевом обмене ни о какой производительности речи быть не может.
Перепишем данные правила следующим образом:

-A FORWARD -s 192.168.0.0/24 -j NET-00
-A FORWARD -s 192.168.1.0/24 -j NET-01
-A FORWARD -s 192.168.2.0/24 -j NET-02
-A FORWARD -s 192.168.3.0/24 -j NET-03
-A FORWARD -s 192.168.4.0/24 -j NET-04
-A FORWARD -s 192.168.5.0/24 -j NET-05
-A FORWARD -s 192.168.6.0/24 -j NET-06
-A FORWARD -s 192.168.7.0/24 -j NET-07
//
-A NET-00 -s 192.168.0.1 -j DROP
-A NET-00 -s 192.168.0.2 -j DROP
-A NET-00 -s 192.168.0.3 -j DROP
--/ И так дальше/--
-A NET-01 -s 192.168.1.1 -j DROP
-A NET-01 -s 192.168.1.2 -j DROP
-A NET-01 -s 192.168.1.3 -j DROP
--/ И так дальше/--
-A NET-07 -s 192.168.7.1 -j DROP
-A NET-07 -s 192.168.7.2 -j DROP
-A NET-07 -s 192.168.7.3 -j DROP
-A FORWARD -j ACCEPT

В наших новых правилах для аналогичной проверки необходимо 255 проверок, итак немного модифицировав правила для iptables мы сократили количество проверок в пакетном фильтре в 4 раза.
Еще одним способом избавиться от узкого места в iptables – использовать ipset.
681 просмотров комментировать