Назад | Перейти на главную страницу

Как использовать определенные переменные в Nftables через терминал (не в скрипте)

Я хочу запустить эти две команды в интерактивной оболочке, одну за другой (как root и с загруженной таблицей «filter» и «input» цепочкой):

nft define lala=1.2.3.4
nft add rule ip filter input ip saddr \$lala accept

Вы можете видеть, что я избегаю символа «$», чтобы избежать расширения оболочки. Но я получаю это сообщение об ошибке «Неизвестный идентификатор lala». Если я не экранирую символ «$», я получаю вместо этого сообщение об ошибке: «Синтаксическая ошибка, непредвиденное принятие». Если я напишу \ $$ лала вместо этого я получаю это сообщение об ошибке: «Синтаксическая ошибка, неподтвержденный прием, ожидающая строка», и отображается это неправильное правило: добавить правило ip filter input ip saddr $ accept.

Итак, каков правильный синтаксис, чтобы иметь возможность использовать переменные Nft внутри интерактивной оболочки. То же самое внутри сценария Nft работает хорошо (не беспокоясь о побеге).

большое спасибо

Символьные переменные используется nft пространство пользователя команда разрешена в свои значения только по этой команде. В nft команда преобразовывает переменную в присвоенное ей значение, чтобы собрать окончательный результат. затем в nft команды используют netlink API для связи с ядром и отправки ему нового правила для добавления. Ядро никогда видит lala=1.2.3.4 также не имеет понятия символической переменной.

Итак, если вы разделите свой nft в двух вызовах происходит следующее:

  • Первый nft Команда определяет символьную переменную для дальнейшего использования. Но больше ничего не делает. Ему даже не нужно связываться с ядром, поскольку не требуется изменение набора правил. (На самом деле он общается, но для отправки «ничего», как с командой nft ''). В конце команды определение символа теряется, но не используется.

  • Второй вызов nft команде необходимо разрешить $lala символ, но не могу найти определение: nft останавливается с ошибкой.

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

  • интерактивный nft

    -i, --interactive
    Прочтите ввод из интерактивного интерфейса командной строки readline. Ты можешь использовать quit для выхода или используйте маркер EOF, обычно это CTRL-D.

    # nft -i
    nft> define lala=1.2.3.4
    nft> add rule ip filter input ip saddr $lala accept
    nft> quit
    
  • две команды в одном nft призыв.

    # nft 'define lala=1.2.3.4; add rule ip filter input ip saddr $lala accept'
    

    Обратите внимание на дополнительные ; необходимо, потому что в этом контексте nft получает одну строку параметров, но их следует разбить на две логические команды. Также nft имея собственный синтаксический анализатор, ему все равно, принимаются ли команды как один параметр команды или как несколько отдельных параметров. Здесь все было заключено в пару '' чтобы избежать проблем с оболочкой с обоими ; и $ персонажи.

  • затем nft есть возможность читать из файла. При чтении из файла все входные данные являются частью одного и того же nft командный контекст.

    -f, --file filename
    Прочитать ввод из имени файла. Если имя файла -, читать из stdin.

    скрипты nft должны запускаться #!/usr/sbin/nft -f

    Итак, с файлом с именем test.nft имеющий это содержание:

    define lala=1.2.3.4
    add rule ip filter input ip saddr $lala accept
    

    Затем это можно использовать:

    # nft -f test.nft
    

    Вариант ниже выполняет сценарий в "столы язык ". Имея test.nft содержимое файла как:

    #!/usr/sbin/nft -f
    define lala=1.2.3.4
    add rule ip filter input ip saddr $lala accept
    

    Затем:

    # chmod a+rx test.nft
    # ./test.nft
    

    Это также сработало бы:

    # nft -f - <<'EOF'
    > define lala=1.2.3.4
    > add rule ip filter input ip saddr $lala accept
    > EOF
    

Для каждой предыдущей команды результирующий набор правил одинаков (при условии, что таблица и цепочка были созданы ранее):

# nft list chain ip filter input
table ip filter {
    chain input {
        type filter hook input priority filter; policy accept;
        ip saddr 1.2.3.4 accept
    }
}

Больше не будет никаких следов $lala осталось: ядро ​​не получено $lala но только 1.2.3.4 и вот что он возвращает.