Я хочу подтвердить следующее. Если я создам цепочку, первое правило которой:
iptables -I INPUT -p tcp -m multiport --dports 25,465 -j name
Означает ли это, что любые дальнейшие указанные правила в цепочке не проверяются, если только пакет не поступает с этих портов?
Я использую fail2ban
, и я создал фильтр с правилом запрета, которое указывает порт 25, 465, используя -m multiport --dports 25,465
. Но этот фильтр в конечном итоге создал достаточно большое количество правил, что иногда процесс ksoftirqd
использовал много ресурсов ЦП, и сеть становилась медленной. Я заметил, что это происходило, когда на сервере было много ввода-вывода, происходящего на других портах.
Я предполагаю, что каждый пакет просматривал все правила в моей цепочке. Я надеюсь, что смогу избежать этого, добавив первое правило, показанное выше, так что пакеты, не приходящие на порты 25 и 465, не будут проверять остальные правила в этой цепочке. Если это не поможет, я был бы признателен за любое другое возможное решение.
решение1
Не «от», а «куда». --dports
спискиместо назначенияпорты. Правило, как вы написали, означает: "если пакет был отправлен на мой сервис, прослушивающий TCP-порт 25 или 465, обработать его в цепочке name
". То, как он будет обработан, зависит от содержимого этой цепочки. Если он не соответствует ни одномуокончательное действие( ACCEPT
, REJECT
, DROP
) правило в этой цепочке, или если оно соответствует правилу с RETURN
действием, его обработка будет продолжена в вызывающей цепочке ( INPUT
) с правилом, следующим за этим.
По умолчанию fail2ban
создает цепочку и правило, которое вызывает цепочку только для пакетов, предназначенных для определенного порта (если вы не используете ...-allports
действие, которое не является действием по умолчанию). В эту цепочку он добавляет правило DROP для каждого запрещенного IP. Так, например, пакеты веб-сервера не будут отправляться на обработку в цепочку, созданную для sshd
предоставленной тюрьмы. Поэтому намеренное «исключение» определенных портов из обработки fail2ban способом, который вы предлагаете, непродуктивно; это уже работает так.
Чтобы избежать создания цепочки со слишком большим количеством правил с помощью fail2ban, изучитеipset-связанные действия. Вместо создания цепочки f2b-jailname
он создаетIP-набори единственное правило, которое соответствует ipset. Каждый забаненный IP добавляется в ipset, вместо создания отдельного правила в цепочке. ipset имеет характеристику сложности O(1), что означает, что скорость его обработки не зависит от количества элементов в нем; он может содержать до 65536 элементов.
Чтобы использовать это, короче говоря, вам нужно переопределить default banaction = iptables
с помощью banaction = iptables-ipset
для ваших джейлов. Вы никогда не должны изменять файлы конфигурации, поставляемые дистрибутивом; вместо этого создайте /etc/fail2ban/jail.local
файл, в который вы добавляете свои переопределения:
[postfix]
bantime = 1h
enabled = true
banaction = iptables-ipset
(Это будет использовать предоставленный postfix
почтовый фильтр и реагировать на все smtpd
типы служб. Если вы используете другой почтовый сервер, настройте его соответствующим образом.)
Другой способ повысить эффективность брандмауэра — начать использоватьnftables
framework вместо iptables
. Имеет особенности IP-наборовинтегрированный, и вы можете использовать его с fail2ban, используя banaction = nftables
. Прирост эффективности для больших наборов будет примерно таким же.