Пока замена атомарного правила задокументирована:
Замена атомарного правила
Вы можете использовать -f
возможность атомарного обновления вашего набора правил:
%nft -f файл
это явно не задокументировано для элемент замена, но на самом деле это просто случай замены правил. Можно удалить и снова добавить элемент в одной атомарной транзакции, представленной с помощью -f
: это заменит старую запись более новой и ее обновленным временем истечения срока действия, при этом элемент никогда не будет временно потерян.
Поэтому вместо того, чтобы делать следующее, что не было бы атомарным, потому что между двумя вызовами нфт
, элемент будет временно не существовать, и правила, зависящие от этого набора, временно не будут совпадать:
# nft удалить элемент ip mytable myset '{ 10.10.10.1 }'
# nft добавить элемент ip mytable myset '{ 10.10.10.1 timeout 60s expires 60s }'
это должно быть сделано с помощью -f
и входной файл (-
стоя за стандартный ввод считается действительным входным файлом):
# nft -f - <<'EOF'
удалить элемент ip mytable myset {10.10.10.1}
добавить элемент ip mytable myset {10.10.10.1 timeout 60s}
EOF
где элемент никогда не перестанет существовать, потому что это атомарное изменение.
Как обычно с этим нфт построить, если кто-то хочет сделать это идемпотентно, не зная, существует ли элемент уже, и не касаясь других элементов, он должен быть добавлен, удален и повторно добавлен, потому что добавление существующего элемента не является ошибкой, удаление отсутствующий элемент будет ошибкой:
# nft -f - <<'EOF'
добавить элемент ip mytable myset {10.10.10.1}
удалить элемент ip mytable myset {10.10.10.1}
добавить элемент ip mytable myset {10.10.10.1 timeout 60s}
EOF
Это по-прежнему одна атомарная транзакция.
Дополнительные примечания
из пути пакета
При выполнении этого из пути пакета есть различие между добавить @myset
который установит тайм-аут только при создании нового элемента, но не будет обновлять тайм-аут уже существующего элемента, что позволит ему позже истечь время ожидания в течение всей его продолжительности, и обновить @myset
который устанавливает тайм-аут во всех случаях.
обновление атомарного правила не ограничивается элементами, но может использоваться на любом уровне
Например, то же самое можно сделать на уровне набора, если есть один элемент, о котором нужно заботиться:
# nft -f - <<'EOF'
добавить набор ip mytable myset { type ipv4_addr; тайм-аут флагов; }
удалить set ip mytable myset
добавить набор ip mytable myset {
введите ipv4_addr
тайм-аут флагов
элементы = {127.0.0.1 тайм-аут 1 м}
}
EOF
На самом деле приведенный выше пример, скорее всего, потерпит неудачу, потому что, вероятно, есть правило, ссылающееся на набор, поэтому его нельзя удалить даже во время транзакции (вместо этого можно было бы аналогичным образом переписать всю таблицу с добавить таблицу ip mytable
, удалить таблицу ip mytable
, добавить таблицу ip mytable {...
). Если известно, что набор существует ранее, достаточно сбросить его перед добавлением одного элемента:
# nft -f - <<'EOF'
флеш установить ip mytable myset
добавить элемент ip mytable myset {127.0.0.1 timeout 1m}
EOF
Конечно, реальный файл можно использовать вместо - <<'ЭОФ'
...EOF
.