Невозможно смыть набор nftable элемента

На самом деле я учусь использовать nftables в тестовой среде, и я на самом деле работаю с наборами nftables. У меня была версия 0.7, и поскольку мои тесты не работали, я обновился до версии 0.9.4, но моя проблема осталась прежней.

Я могу без проблем создавать свои наборы на своем столе. И мои элементы набора должны содержать адреса ipv4. Я работал с таблицами, цепочками и наборами nftables без проблем, мои правила работали и т. Д.

Итак, что я хочу сделать, но не могу найти, как это сделать, так это удалить все элементы моего набора, не уточняя адреса ipv4 один за другим.

Скажем, имя моей таблицы - test, а имя моего набора - tmp с типом ipv4_addr, моя конфигурация будет выглядеть так:

table ip test {
        set tmp {
                type ipv4_addr
        }
}

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

nft add element ip test tmp { 10.10.10.10 }

Теперь я хочу удалить все элементы моего набора, я просмотрел страницу руководства nft и сказал, что я могу очистить все элементы из моего набора с помощью команды flush:

SETS
[...]
flush    Remove all elements from the specified set.

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

nft flush set test tmp

Но он возвращает мне эту ошибку:

Error: Could not process rule: Invalid argument
flush set test tmp
^^^^^^^^^^^^^^^^^^^

Я пробовал много команд таким же образом (добавление таблицы перед установкой, без уточнения таблицы), он всегда возвращает мне ошибку, но не каждый раз одинаково.

Я думаю, что должен сделать что-то не так, но не могу понять, что именно. Если у вас есть идеи, пожалуйста? Буду очень признателен!

Может быть, моя общая конфигурация плохая, и я не должен так думать о наборах?

И если невозможно очистить элементы из набора, есть ли способ удалить все элементы из набора (помимо определения тайм-аута флага)?

Извините, если мое сообщение неясно, я француз, и мне немного сложно писать на другом языке, чтобы описать проблему...

Спасибо!

С уважением.

2 ответа

Решение

Я связался с командой netfilter и дал мне ответ.

Опция сброса для набора работает только с Linux 4.10 и выше, и моя версия была ниже.

Я нашел способ очистить таблицу с помощью этих команд в Debian, если вам интересно:

Сохраните элементы из набора в переменной:

elements=$(nft list set test tmp | awk '/{ /,/}/' | cut -d '=' -f 2)

Удалите элементы с помощью команды удаления

nft delete element test tmp ${ip_elements}

Надеюсь, это поможет некоторым людям.

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

Используя именованный набор, вы бы сделали что-то вроде

#!/usr/sbin/nft -f

flush set ip test tmp

table ip test {
  set tmp {
    type ipv4_addr
    elements = { 10.10.10.10 }
  }

  chain somechain {
    type filter hook input priority 0; policy accept
    ip saddr @tmp meta nftrace set 1
  }
}

но так как это не работает, вы можете сделать это вместо

define tmp = { 10.10.10.10 }

flush chain ip test somechain

table ip test {
  chain somechain {
    type filter hook input priority 0; policy accept
    ip saddr $tmp meta nftrace set 1
  }
}

Это сохраняет удобочитаемость использования именованного набора, но при выполнении он преобразуется во встроенный анонимный набор.

Это обновляет все правило и, таким образом, "сбрасывает" старые значения в наборе.

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

Другие вопросы по тегам