Назад | Перейти на главную страницу

Понимание / оптимизация вывода iptables

Ниже приведен результат iptables-save с сервера Ubuntu Linux. У меня вопрос: есть ли в этом что-то неправильное или неоптимальное?

Например, я считаю, что правила обрабатываются по порядку, поэтому следует ли переместить правила для портов 80 и 3306 (www / mysql) наверх?

Кроме того, что делают правила после DROP? Они кажутся похожими на правила, приведенные выше.

# Generated by iptables-save v1.4.1.1 on Sun Feb 13 16:11:59 2011
*filter
:INPUT DROP [1:52]
:FORWARD DROP [0:0]
:OUTPUT ACCEPT [496336:22258327]
-A INPUT -p tcp -m tcp --dport 10000 -j ACCEPT 
-A INPUT -i lo -j ACCEPT 
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT 
-A INPUT -p tcp -m tcp --dport 22 -m state --state NEW -j ACCEPT 
-A INPUT -p tcp -m tcp --dport 80 -m state --state NEW -j ACCEPT 
-A INPUT -p tcp -m tcp --dport 443 -m state --state NEW -j ACCEPT 
-A INPUT -p udp -m udp --dport 53 -m state --state NEW -j ACCEPT 
-A INPUT -p tcp -m tcp --dport 53 -m state --state NEW -j ACCEPT 
-A INPUT -p udp -m udp --dport 69 -m state --state NEW -j ACCEPT 
-A INPUT -p tcp -m tcp --dport 69 -m state --state NEW -j ACCEPT 
-A INPUT -p tcp -m tcp --dport 25 -m state --state NEW -j ACCEPT 
-A INPUT -p tcp -m tcp --dport 110 -m state --state NEW -j ACCEPT 
-A INPUT -p tcp -m tcp --dport 143 -m state --state NEW -j ACCEPT 
-A INPUT -p udp -m udp --dport 123 -m state --state NEW -j ACCEPT 
-A INPUT -p icmp -j ACCEPT 
-A INPUT -p tcp -m tcp --dport 20 -m state --state NEW -j ACCEPT 
-A INPUT -p tcp -m tcp --dport 21 -m state --state NEW -j ACCEPT 
-A INPUT -p tcp -m tcp --dport 3306 -m state --state NEW -j ACCEPT 
-A INPUT -p udp -m udp --dport 3306 -m state --state NEW -j ACCEPT 
-A INPUT -j DROP 
-A OUTPUT -o lo -j ACCEPT 
-A OUTPUT -m state --state NEW,RELATED,ESTABLISHED -j ACCEPT 
COMMIT
# Completed on Sun Feb 13 16:11:59 2011

Я бы, наверное, переехал RELATED,ESTABLISHED ... ACCEPT правило в цепочке INPUT до самого верха этой цепочки. Если большинство ваших соединений не очень недолговечны, я готов поспорить, что подавляющее большинство входящих пакетов будет частью соединения и должно быть ПРИНЯТО этим правилом.

Чтобы лучше понять, куда попадают пакеты в вашем наборе правил, вы можете запустить это:

iptables -t filter -L -n -v

и обратите особое внимание на количество пакетов и байтов. Вы, вероятно, заметите, что правило, которое я упомянул выше, потребовало наибольшее количество пакетов с довольно большим отрывом. Если какие-либо другие правила соответствуют значительному количеству пакетов, вы можете оптимизировать свой набор правил, переместив их выше менее «популярных» правил.

Наконец, я заметил, что ваша цепочка OUTPUT имеет политику ACCEPT. Это делает правила ACCEPT в цепочке OUTPUT избыточными, и их следует удалить. Точно так же, поскольку ваша политика цепочки INPUT - DROP, последнее правило DROP в цепочке INPUT не нужно.

В общем, установка правил, позволяющая быстро выйти из брандмауэра, - это хорошо. Если большая часть трафика идет на порты 80 и 3306, то они, как вы предлагаете, должны быть выше в списке таблицы INPUT.

Iptables работает на таблицах. У вас есть 3: INPUT, FORWARD и OUTPUT. Команда DROP находится в таблице INPUT. Правила после DROP предназначены для цепочки OUTPUT, поэтому они будут обрабатываться только для исходящих пакетов. Их можно удалить, поскольку политика в таблице OUTPUT - ПРИНЯТЬ, а они являются правилами ПРИНЯТЬ.

  1. Зачем -A INPUT -p tcp -m tcp --dport 10000 -j ACCEPT не разделены на NEW / REL, EST как другие?
  2. Множество --state NEW избыточно, почему CPU решает, было ли это NEW каждый раз(?). Лучше создать дополнительную цепочку INPUT.NEW и использовать одиночный -A INPUT -m state --state NEW -j INPUT.NEW направлять в него пакеты.
  3. INPUT.NEW может быть заполнен сравнениями портов. Количество строк можно уменьшить, если использовать -m multiport.
  4. Принимать все ICMP небезопасно, поскольку это означает не только эхо-запросы. Выберите только те ICMP, которые вы можете разрешить (это может быть всего несколько эхо-запросов). И помните, что законные другие протоколы (например, TCP), определенные ICMP, будут обрабатываться с RELATED тем не мение.
  5. Нет смысла (если таковой имеется) разрешать OUTPUT быть только NEW,RELATED,ESTABLISHED. Разрешить без подразделения.

Выглядит хорошо. Я бы отказался от подтверждения на порту 20, поскольку он должен обрабатываться как связанный пакет с FTP-соединением. Обычно я использую порт 123 в качестве первой проверки, чтобы минимизировать задержку для NTP.

Для цепочки OUTPUT имеют смысл только правила DROP или REJECT. Существующие правила вывода ничего не делают, кроме как дублируют политику.

Вы можете посмотреть на свои счетчики и соответствующим образом изменить порядок правил.

Рассмотрите возможность использования разных цепочек для новых подключений на каждом интерфейсе.

Рассмотрите возможность записи в журнал непринятых пакетов.

Используя такой инструмент, как Shorewall создание брандмауэра может упростить установку всего на свои места.

Вместо того, чтобы использовать одно явное правило для комбинации протокола / порта, я настоятельно рекомендую использовать ipset.

Сделайте 2 набора, по одному для TCP и UDP:

ipset -N Allowed_TCP_Ports portmap --from 0 --to 65535
ipset -N Allowed_UDP_Ports portmap --from 0 --to 65535

Заполните каждый набор:

for p in $TCP_PORTS; do ipset -A Allowed_TCP_Ports; done
for p in $UDP_PORTS; do ipset -A Allowed_UDP_Ports; done

Затем вы можете упростить правила, связанные с портами, до двух правил:

-A INPUT -p tcp -m set --match-set Allowed_TCP_Ports dst -j ACCEPT 
-A INPUT -p udp -m set --match-set Allowed_UDP_Ports dst -j ACCEPT 

Примечание: я удаляю -m state --state NEW Спички. Я имею в виду, зачем? После -m state --state RELATED,ESTABLISHED правило все пакеты либо НОВЫЕ, либо НЕДЕЙСТВИТЕЛЬНЫЕ.

Примечание 2: Ubuntu ipset пакет скреплен; вы должны скачать и установить из исходников. Я объяснил, как это сделать в своем блоге. Вы можете прочитать это здесь: http://pepoluan.posterous.com/powertip-howto-install-ipset-on-ubuntu .