web-dev-qa-db-ja.com

ターミナルを介してNftablesで定義された変数を使用する方法(スクリプトではない)

これらの2つのコマンドを対話型シェルで次々に実行したいと思います(ルートとして、「フィルター」テーブルと「入力」チェーンをロードして):

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

シェルの展開を避けるために「$」をエスケープしているのがわかります。しかし、このエラーメッセージ「不明な識別子 'lala'」が表示されます。 「$」をエスケープしないと、代わりに次のエラーメッセージが表示されます。「構文エラー、予期しない受け入れ」。代わりに\ $$ lalaと書くと、代わりに次のエラーメッセージが表示されます。「構文エラー、受け入れられていない受け入れ、文字列が必要です」という誤った規則が表示されます。

それでは、対話型シェル内でNft変数を使用できるようにするための正しい構文は何ですか。 Nftスクリプト内で同じことを行うと、うまく機能します(エスケープの心配はありません)。

どうもありがとう

1
Osqui

シンボリック変数nftuserspaceコマンドで使用中の値に解決されますonlyこのコマンドによって。 nftコマンドは、変数を割り当てられた値に解決して、最終結果を組み立てます。 次にnftコマンドは netlink API を使用してカーネルと通信し、新しいルールをに送信します追加。カーネルneverlala=1.2.3.4を認識せず、シンボリック変数の概念もありません。

したがって、nftコマンドを2つの呼び出しに分割すると、次のようになります。

  • 最初のnftコマンドは、後で使用するためのシンボリック変数を定義します。しかし、他には何もしません。ルールセットの変更は要求されないため、カーネルと通信する必要さえありません。 (実際には通信しますが、コマンドnft ''のように "何も"を送信しません)。コマンドの最後で、シンボルの定義は使用されずに失われます。

  • nftコマンドの2回目の呼び出しでは、$lalaシンボルを解決する必要がありますが、定義が見つかりません:nftはエラーで停止します。

したがって、これはすべてonenft呼び出しで実行する必要があるため、2番目のステートメントは依然としてシンボリック変数について認識しています。これには複数の方法があります。入力しないでくださいシェルとnftのプロンプトの下の例を残しました。

  • インタラクティブ nft

    -i, --interactive
    インタラクティブなreadline CLIから入力を読み取ります。 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
    
  • 1つのnft呼び出しで2つのコマンド。

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

    このコンテキストではnftがパラメーターの1行を受け取るため、必要な追加の;に注意してください。ただし、これらは2つの論理コマンドに分割する必要があります。また、nftには独自のパーサーがあり、コマンドが単一のコマンドパラメーターとして受信されるか、複数の個別のパラメーターとして受信されるかは関係ありません。ここでは、'';の両方の文字に関するシェルの問題を回避するために、すべてが$のペアで囲まれています。

  • 次に、nftには、ファイルから読み取るオプションがあります。ファイルから読み取る場合、すべての入力は同じnftコマンドコンテキストの一部です。

    -f, --file filename
    ファイル名から入力を読み取ります。ファイル名が-の場合、標準入力から読み取ります。

    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
    

    以下のバリアントは、「nftables言語」でスクリプトを実行します。 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のみを受信しました。

2
A.B