Рейтинг:1

Как обновить тайм-аут заданного элемента в nftables?

флаг us

Как обновить значение тайм-аута/истечения заданного элемента с помощью nft до истечения срока его действия?

Добавление существующего элемента в набор не сбрасывает значение времени ожидания/истечения:

nft добавить элемент ip mytable myset {10.10.10.1 тайм-аут 60 с}
# подождите 10 секунд
nft добавить элемент ip mytable myset { 10.10.10.1 тайм-аут 60 с истекает 60 с }
nft list set ip mytable myset

С помощью iptables/ipset я мог обновить тайм-ауты, добавив существующие элементы:

ipset добавить myset 10.10.10.1 тайм-аут 60
# подождите 10 секунд
ipset добавить myset 10.10.10.1 - существует тайм-аут 60
список ipset
Рейтинг:2
флаг cl
A.B

Пока замена атомарного правила задокументирована:

Замена атомарного правила

Вы можете использовать -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.

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.