第6章 nftables の使用
nftables
フレームワークは、パケットの分類機能を提供し、iptables
ツール、ip6tables
ツール、arptables
ツール、ebtables
ツール、および ipset
ツールの後継となります。利便性、機能、パフォーマンスにおいて、以前のパケットフィルターリングツールに多くの改良が追加されました。以下に例を示します。
- 線形処理の代わりに組み込みルックアップテーブルを使用
IPv4
プロトコルとIPv6
プロトコルの両方に対する単一のフレームワーク- 完全ルールセットのフェッチ、更新、および保存を行わず、すべてアトミックに適用されるルール
- ルールセットでのデバッグとトレースのサポート(
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 は、
/etc/nftables/
ディレクトリーに *.nft
スクリプトを自動的に作成します。このスクリプトには、さまざまな目的でテーブルと空のチェーンを作成するコマンドが含まれます。
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
スクリプトを直接実行します。
- 以下の手順は、一度だけ必要です。
- スクリプトが以下のシバンシーケンスで始まることを確認します。
#!/usr/sbin/nft -f
重要-f
パラメーターを省略すると、nft
ユーティリティーはスクリプトを読み取らず、Error: syntax error, unexpected newline, expecting string を表示します。 - 必要に応じて、スクリプトの所有者を
root
に設定します。# chown root /etc/nftables/example_firewall.nft
- 所有者のスクリプトを実行ファイルに変更します。
# chmod u+x /etc/nftables/example_firewall.nft
- スクリプトを実行します。
# /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 つ持つ変数
以下の例は、値が enp1s0 の
INET_DEV
という名前の変数を定義します。
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
注記
中括弧は、変数がセットを表していることを示すため、ルールで使用する場合は、特別なセマンティクスを持つことに注意してください。
関連情報
- セットの詳細は、「nftables コマンドを使用したセットの使用」 を参照してください。
- 決定マップの詳細は、「nftables コマンドにおける決定マップの使用」 を参照してください。
6.1.5. nftables スクリプトへのファイルの追加
nftables
スクリプト環境を使用すると、管理者は include ステートメントを使用して他のスクリプトを 含める
ことができます。
絶対パスまたは相対パスなしでファイル名のみを指定すると、
nftables
には、Red Hat Enterprise Linux では /etc
に設定されているデフォルトの検索パスからのファイルが含まれます。
例6.2 デフォルト検索ディレクトリーからのファイルを含む
デフォルトの検索ディレクトリーからファイルを指定するには、次のコマンドを実行します。
include "example.nft"
例6.3 ディレクトリーからの *.nft
ファイルをすべて含む
/etc/nftables/rulesets/
ディレクトリーに保存されている *.nft
で終わるすべてのファイルを含めるには、次のコマンドを実行します。
include "/etc/nftables/rulesets/*.nft"
include
ステートメントは、ドットで始まるファイルと一致しないことに注意してください。
関連情報
- 詳細は、
nft (8)
man ページのInclude files
セクションを参照してください。
6.1.6. システムの起動時に nftables ルールの自動読み込み
nftables
systemd サービスは、/etc/sysconfig/nftables.conf
ファイルに含まれるファイアウォールスクリプトを読み込みます。本セクションでは、システムの起動時にファイアウォールルールを読み込む方法を説明します。
前提条件
nftables
スクリプトは、/etc/nftables/
ディレクトリーに保存されます。
手順6.3 システムの起動時に nftables ルールの自動読み込み
/etc/sysconfig/nftables.conf
ファイルを編集します。- nftables パッケージをインストールしたときに
/etc/nftables/
で作成された*.nft
スクリプトを強化する場合は、これらのスクリプトの include ステートメントのコメントを解除します。 - スクリプトを新規に作成する場合は、そのスクリプトを含む include ステートメントを追加します。たとえば、
nftables
サービスの起動時に/etc/nftables/example.nft
スクリプトを読み込むには、以下を追加します。include "/etc/nftables/example.nft"
- 必要に応じて、
nftables
サービスを起動し、システムを再起動せずにファイアウォールルールを読み込みます。# systemctl start nftables
- nftables サービスを有効にします。
# systemctl enable nftables
関連情報
- 詳細は、「対応している nftables スクリプトの形式」 を参照してください。