
Я пишу скрипт, который отслеживает различные показатели (например, использование полосы пропускания интерфейса) и 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 и оптимизированному синтаксису.