Могут ли быстро меняющиеся правила iptables вызвать проблемы?

Могут ли быстро меняющиеся правила iptables вызвать проблемы?

Я пишу скрипт, который отслеживает различные показатели (например, использование полосы пропускания интерфейса) и iptablesсоответственно меняю правила. Эти изменения могут происходить как минимум 2 раза в секунду, до 1 раза 4 * number of interfacesв секунду.

Дело в том, что я не уверен, как iptablesобрабатывает изменения правил. Перекомпилируются ли вещи и скрипт будет сильно нагружать процессор? Или что происходит с пакетами, которые все еще обрабатываются во время изменения правил; будут ли они потеряны? Такого рода опасения.

Могут ли быстро меняющиеся правила iptables вызвать проблемы?

РЕДАКТИРОВАТЬ: Для моего конкретного приложения все правила уже есть. Они скорее включают или отключают (добавляют или удаляют) определенные правила. Другими словами, таблицы не будут расти со временем и становиться чрезвычайно большими.

решение1

Как изменить правила?

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

  • Захватите все таблицы/цепочки netfilter
  • Выполните ОДНО изменение по запросу
  • Загрузить все таблицы/цепочки netfilter обратно в ядро

Это произойдеткаждый iptablesпризывание.

Вопрос в следующем: каков характер изменений, которые вы вносите в правила?

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

Но если вы добавляете/удаляете правила, например, потому что вы меняете другие параметры на лету (например, меняете для rateболее/менее частого соответствия, меняете флаги QoS и т. д.), то, возможно, это ipsetвам не подойдет.

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

  • Захватите все таблицы/цепочки netfilter
    • Вы можете использовать iptables-saveутилиту или, в зависимости от того, на чем вы пишете свой скрипт, возможно, есть библиотека, которая может сделать это за вас.
  • Выполните ВСЕ необходимые изменения за один раз
  • Загрузить (зафиксировать) все таблицы/цепочки netfilter обратно в ядро
    • Вы можете использовать iptables-restoreутилиту или, аналогично шагу 1, использовать библиотеку, которая может сделать это за вас.

РЕДАКТИРОВАТЬ:

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

Вставьте -m condition --condition $NAMEв свое iptablesправило.

Это создаст файл, /proc/net/ipt_condition/$NAME. Сопоставление будет успешным, если файл содержит 1, и в противном случае, если файл содержит0

(Вы, конечно, можете использовать отрицание, !чтобы инвертировать соответствие.)

Например:

iptables -A INPUT -m condition --condition allow_880 -p tcp -m tcp --dport 880 -j ACCEPT

Чтобы включить правило:

echo 1 > /proc/net/ipt_condition/allow_880

Отключить:

echo 0 > /proc/net/ipt_condition/allow_880

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

Редактировать 1а:

Если вы уже создали таблицу, самый простой способ редактирования — сохранить вывод iptables-save, отредактировать его (добавить условия соответствия для правил, которым они нужны), а затем загрузить весь файл с помощью iptables-restoreилиiptables-apply

Помните: один файл условий может контролировать более одного правила; вам не обязательно иметь один файл на правило, если только вы действительно этого не хотите.

Редактировать 1б:

Как отметил @AB в комментариях (спасибо!), -m conditionэто может не быть стандартной функцией для встроенных в ваш дистрибутив iptables; в таком случае вам, скорее всего, потребуется установить дополнительный пакет, например, xtables-addons.

(Извините, забыл об этом, потому что я использую Gentoo, а iptablesпакет в Gentoo просто следует за тем, что есть в файле .config ядра.)

решение2

В этом случае Nftables может подойти лучше.Nftables разработан так, чтобы быть более эффективным и масштабируемым, чем iptables, особенно при сложных наборах правил или частых модификациях. Он обеспечивает лучшую производительность благодаря своей интеграции в ядро ​​Linux и оптимизированному синтаксису.

Связанный контент