Ниже приведен результат 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 - ПРИНЯТЬ, а они являются правилами ПРИНЯТЬ.
-A INPUT -p tcp -m tcp --dport 10000 -j ACCEPT
не разделены на NEW / REL, EST как другие?--state NEW
избыточно, почему CPU решает, было ли это NEW
каждый раз(?). Лучше создать дополнительную цепочку INPUT.NEW и использовать одиночный -A INPUT -m state --state NEW -j INPUT.NEW
направлять в него пакеты.-m multiport
.RELATED
тем не мение.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 .