第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 スクリプトの形式」 を参照してください。