Сначала объявите пустую таблицу. Если таблица уже существует, она не выдает ошибку и не изменяет ее содержимое :ничего не происходит. Если она не существовала, значит, пустая таблица была только что создана. Теперь, когда он существует во всех случаях, его можно удалить. Все это можно сделать в том же наборе правил.
Итак, объявите таблицу без цепочки и правил, а затем удалите ее (справочная страница говорит, что ее очистка приведет к сбросу цепочек и правил, но это не удалит сами цепочки, они просто очиститься, что оставит старые переименованные цепочки или наборы на месте или будет конфликтовать с ними, если их свойства были изменены. Вики nftables содержит больше информации о поведении удаления и сброса . ). Теперь вы действительно можете создать его, все еще в том же и уникальном файле набора правил. Один и тот же набор правил теперь можно идемпотентно загружать несколько раз, не вызывая ошибки даже в первый раз.
#!/usr/sbin/nft -f
table ip my_table
delete table ip my_table
table ip my_table {
chain output {
type filter hook output priority 0; policy accept;
ip daddr 8.8.8.8 counter
# [...]
}
}
Вы можете использовать оператор include
, чтобы поместить все такие подготовительные строки в отдельный файл на случай, если их много и вы не хотите, чтобы они загрязняли набор правил.
Вы можете сделать то же самое на уровне цепочки, т.е. не изменяя другие цепочки в той же таблице, не предполагая и не требуя, чтобы таблица и ее цепочки были здесь раньше. Вот пример, когда reject_chain
деактивирует nftrace , что не удалит ни другие таблицы, ни цепочки my_table
. Пример не имеет реальной пользы, это просто пример.
#!/usr/sbin/nft -f
table ip my_table {
chain reject_chain {
}
}
delete chain ip my_table reject_chain
table ip my_table {
chain reject_chain {
nftrace set 0 counter reject
}
}
Примечание о совместимости. :ядрам объясняется в вики. Этот (и аналогичный для цепочек )будут работать даже на любой версии ядра :
.
table ip my_table
flush table ip my_table
delete table ip my_table
Нет ничего плохого в вашем zgrep
синтаксисе (, несмотря на то, что -c
только подсчитывает экземпляры и не отображает их ). Но, как прокомментировал Муру, вы запускаете его при подключении к SFTP, где невозможно запускать команды оболочки.
Для выполнения этой команды необходимо подключиться через SSH.