Red Hat Training

A Red Hat training course is available for Red Hat Enterprise Linux

第6章 nftables の使用

nftables フレームワークは、パケットの分類機能を提供し、iptables ツール、ip6tables ツール、arptables ツール、ebtables ツール、および ipset ツールの後継となります。利便性、機能、パフォーマンスにおいて、以前のパケットフィルタリングツールに多くの改良が追加されました。以下に例を示します。
  • 線形処理の代わりに組み込みルックアップテーブルを使用
  • IPv4 プロトコルおよび IPv 6 プロトコルに対する 1 つのフレームワーク
  • 完全ルールセットのフェッチ、更新、および保存を行わず、すべてアトミックに適用されるルール
  • ルールセットにおけるデバッグおよびトレースへの対応(nftrace)およびトレースイベントの監視 (nft ツール)
  • より統一されたコンパクトな構文、プロトコル固有の拡張なし
  • サードパーティーのアプリケーション用 Netlink API
iptables と同様、nftables は、チェーンを保存するテーブルを使用します。このチェーンには、アクションを実行する個々のルールが含まれます。nft ツールは、以前のパケットフィルタリングフレームワークのツールをすべて置き換えます。libnftnl ライブラリーは、libmnl ライブラリーの Netlink API nftables で、低レベルの対話に使用できます。
ルールセット変更の影響を表示するには、nft list ruleset コマンドを使用します。これらのツールは、テーブル、チェーン、ルール、セットなどのオブジェクトを nftables ルールセットに追加するため、nft flush ruleset コマンドなどの nftables ルールセット操作は、先に別の従来のコマンドを使用してインストールしたルールセットに影響を及ぼす可能性があることに注意してください。

firewalld または nftables を使用する場合

  • firewalld - 簡単なファイアウォールのユースケースには 、firewalld ユーティリティーを使用します。このユーティリティーは、使いやすく、このようなシナリオの一般的な使用例に対応しています。
  • nftables: nftables ユーティリティーを使用して、ネットワーク全体など、複雑なパフォーマンスに関する重要なファイアウォールを設定します。
重要
異なるファイアウォールサービスが相互に影響することを回避するには、RHEL ホストでそのうちの 1 つだけを実行し、他のサービスを無効にします。

6.1. nftables スクリプトの作成および実行

nftables フレームワークは、シェルスクリプトを使用してファイアウォールルールを維持する上で主な利点をもたらします (スクリプトの実行はアトミックです)。つまり、システムがスクリプト全体を適用するか、エラーが発生した場合には実行を阻止することを意味します。これにより、ファイアウォールは常に一貫した状態になります。
さらに、管理者は、nftables スクリプト環境で以下を行うことができます。
  • コメントの追加
  • 変数の定義
  • 他のルールセットファイルの組み込み
本セクションでは、この機能を使用する方法と、nftables スクリプトの作成および実行方法を説明します。
nftables パッケージをインストールすると、Red Hat Enterprise Linux は自動的に *.nft スクリプトを /etc/nftables/ ディレクトリーに作成します。このスクリプトには、さまざまな目的でテーブルと空のチェーンを作成するコマンドが含まれます。

6.1.1. 対応している nftables スクリプトの形式

nftables スクリプト環境は、次の形式でスクリプトに対応します。
  • nft list ruleset コマンドがルールセットを表示するのと同じ形式でスクリプトを作成できます。
    #!/usr/sbin/nft -f
    
    # Flush the rule set
    flush ruleset
    
    table inet example_table {
      chain example_chain {
        # Chain for incoming packets that drops all packets that
        # are not explicitly allowed by any rule in this chain
        type filter hook input priority 0; policy drop;
    
        # Accept connections to port 22 (ssh)
        tcp dport ssh accept
      }
    }
    
  • nft コマンドと同じ構文を使用できます。
    #!/usr/sbin/nft -f
    
    # Flush the rule set
    flush ruleset
    
    # Create a table
    add table inet example_table
    
    # Create a chain for incoming packets that drops all packets
    # that are not explicitly allowed by any rule in this chain
    add chain inet example_table example_chain { type filter hook input priority 0 ; policy drop ; }
    
    # Add a rule that accepts connections to port 22 (ssh)
    add rule inet example_table example_chain tcp dport ssh accept
    

6.1.2. nftables スクリプトの実行

nftables スクリプトを実行するには、nft ユーティリティーに渡すか、スクリプトを直接実行します。

前提条件

  • このセクションの手順では、nftables スクリプトを /etc/nftables/example_firewall.nft ファイルに保存していることを前提としています

手順6.1 nft ユーティリティーを使用した nftables スクリプトの実行

  • nftables スクリプトを nft ユーティリティーに渡して実行するには、次のコマンドを実行します。
    # nft -f /etc/nftables/example_firewall.nft

手順6.2 nftables スクリプトを直接実行します。

  1. 以下の手順は、一度だけ必要です。
    1. スクリプトが以下のシバンシーケンスで始まることを確認します。
      #!/usr/sbin/nft -f
      重要
      -f パラメーターを省略すると、nft ユーティリティーはスクリプトを読み取らず、Error: syntax error, unexpected newline, expecting string を表示します。
    2. 必要に応じて、スクリプトの所有者を root に設定します。
      # chown root /etc/nftables/example_firewall.nft
    3. 所有者のスクリプトを実行ファイルに変更します。
      # chmod u+x /etc/nftables/example_firewall.nft
  2. スクリプトを実行します。
    # /etc/nftables/example_firewall.nft
    出力が表示されない場合は、システムがスクリプトを正常に実行します。
重要
nft はスクリプトを正常に実行しますが、ルールの配置やパラメーター不足、またはスクリプト内のその他の問題により、ファイアウォールが期待通り動作しなくなる可能性があります。

関連情報

  • ファイルの所有者の設定は、chown(1) man ページを参照してください。
  • ファイルのパーミッション設定の詳細は、chmod(1) の man ページを参照してください。
  • システム起動時に nftables ルールを読み込む方法は、を参照してください。 「システムの起動時に nftables ルールの自動読み込み」

6.1.3. nftables スクリプトでコメントの使用

nftables スクリプト環境は、# 文字の右側にあるすべてをコメントとして解釈します。

例6.1 nftables スクリプトのコメント

コメントは、コマンドの横だけでなく、行の先頭からも開始できます。
...
# Flush the rule set
flush ruleset

add table inet example_table  # Create a table
...

6.1.4. nftables スクリプトで変数の使用

nftables スクリプトで変数を定義するには、define キーワードを使用します。シングル値および匿名セットを変数に保存できます。より複雑なシナリオの場合は、名前付きセットまたは決定マップを使用します。

値を 1 つ持つ変数

以下の例では、INET_DEV という名前の変数を定義し、値が enp1s0 です。
define INET_DEV = enp1s0
スクリプトで変数を使用するには、$ 記号とそれに続く変数名を指定します。
...
add rule inet example_table example_chain iifname $INET_DEV tcp dport ssh accept
...

匿名セットを含む変数

以下の例では、匿名セットを含む変数を定義します。
define DNS_SERVERS = { 192.0.2.1, 192.0.2.2 }
スクリプトで変数を使用するには、$ 記号とそれに続く変数名を指定します。
add rule inet example_table example_chain ip daddr $DNS_SERVERS accept
注記
中括弧は、変数がセットを表していることを示すため、ルールで使用する場合は、特別なセマンティクスを持つことに注意してください。

関連情報

6.1.5. nftables スクリプトへのファイルの追加

nftables スクリプト環境を使用すると、管理者は include ステートメントを使用して他のスクリプトを追加できます。
絶対パスまたは相対パスのないファイル名のみを指定すると、nftables には、デフォルトの検索パスのファイルが含まれます。これは、Red Hat Enterprise Linux では /etc に設定されています。

例6.2 デフォルト検索ディレクトリーからのファイルを含む

デフォルトの検索ディレクトリーからファイルを指定するには、次のコマンドを実行します。
include "example.nft"

例6.3 ディレクトリーの *.nft ファイルをすべて含む

*.nft で終わるすべてのファイルを /etc/nftables/rulesets/ ディレクトリーに保存するには、次のコマンドを実行します。
include "/etc/nftables/rulesets/*.nft"
include ステートメントは、ドットで始まるファイルに一致しないことに注意してください。

関連情報

  • 詳細は、nft(8)man ページの Include files セクションを参照してください。

6.1.6. システムの起動時に nftables ルールの自動読み込み

systemd サービスは、/etc/sysconfig/nftables.conf ファイルに含まれるファイアウォールスクリプトを読み込みます。本セクションでは、システムの起動時にファイアウォールルールを読み込む方法を説明します。

前提条件

  • nftables スクリプトは、/etc/nftables/ ディレクトリーに保存されます。

手順6.3 システムの起動時に nftables ルールの自動読み込み

  1. /etc/sysconfig/nftables.conf ファイルを編集します。
    • nftables パッケージをインストールしたときに /etc/nftables/ に作成された *.nft スクリプトを拡張する場合は、そのスクリプトの include ステートメントのコメントを解除します。
    • スクリプトをゼロから作成する場合は、そのスクリプトを含む include ステートメントを追加します。たとえば、nftables サービスの起動時に /etc/nftables/example.nft スクリプトを読み込むには、以下を追加します
      include "/etc/nftables/example.nft"
  2. 必要に応じて、nftables サービスを開始して、システムを再起動せずにファイアウォールルールを読み込みます。
    # systemctl start nftables
  3. nftables サービスを有効にします。
    # systemctl enable nftables

関連情報