8.2. iptables から nftables への移行
ファイアウォール設定が依然として iptables
ルールを使用している場合は、iptables
ルールを nftables
に移行できます。
8.2.1. firewalld、nftables、または iptables を使用する場合 リンクのコピーリンクがクリップボードにコピーされました!
RHEL 8 では、シナリオに応じて次のパケットフィルタリングユーティリティーを使用できます。
-
firewalld
:firewalld
ユーティリティーは、一般的なユースケースのファイアウォール設定を簡素化します。 -
nftables
:nftables
ユーティリティーを使用して、ネットワーク全体など、複雑なパフォーマンスに関する重要なファイアウォールを設定します。 -
iptables
: Red Hat Enterprise Linux のiptables
ユーティリティーは、legacy
バックエンドの代わりにnf_tables
カーネル API を使用します。nf_tables
API は、iptables
コマンドを使用するスクリプトが、Red Hat Enterprise Linux で引き続き動作するように、後方互換性を提供します。新しいファイアウォールスクリプトの場合は、nftables
を使用します。
さまざまなファイアウォール関連サービス (firewalld
、nftables
、または iptables
) が相互に影響を与えないようにするには、RHEL ホストでそのうち 1 つだけを実行し、他のサービスを無効にします。
8.2.2. nftables フレームワークの概念 リンクのコピーリンクがクリップボードにコピーされました!
iptables
フレームワークと比較すると、nftables
はより最新で効率的かつ柔軟な代替手段を提供します。nftables
フレームワークは、iptables
よりも高度な機能と改善点を備えており、ルール管理を簡素化し、パフォーマンスを向上させます。そのため、nftables
は高いパフォーマンスが求められる複雑なネットワーク環境向けの新しい選択肢となります。
- テーブルと名前空間
-
nftables
では、テーブルは関連するファイアウォールチェーン、セット、フローテーブル、およびその他のオブジェクトをグループ化する組織単位または名前空間を表します。nftables
では、テーブルにより、ファイアウォールルールと関連コンポーネントをより柔軟に構造化できます。一方、iptables
では、テーブルは特定の目的に合わせてより厳密に定義されていました。 - テーブルファミリー
-
nftables
内の各テーブルは、特定のファミリー (ip
、ip6
、inet
、arp
、bridge
、またはnetdev
) に関連付けられています。この関連付けによって、テーブルが処理できるパケットが決まります。たとえば、ip
ファミリーのテーブルは IPv4 パケットのみを処理します。一方、inet
はテーブルファミリーの特殊なケースです。これは IPv4 パケットと IPv6 パケットの両方を処理できるため、複数のプロトコルに対応した統一的なアプローチを実現します。もう 1 つの特殊なテーブルファミリーの例はnetdev
です。これは、ネットワークデバイスに直接適用されるルールに使用され、デバイスレベルでのフィルタリングを可能します。 - ベースチェーン
nftables
のベースチェーンは、パケット処理パイプライン内の高度に設定可能な項目です。これを使用すると、以下を指定できます。- チェーンのタイプ (例: "filter")
- パケット処理パスのフックポイント (例: "input"、"output"、"forward")
- チェーンの優先順位
この柔軟性により、パケットがネットワークスタックを通過するときにルールが適用されるタイミングと方法を正確に制御できます。チェーンの特殊なケースは
route
チェーンです。これは、パケットヘッダーに基づいてカーネルによって行われるルーティングの決定に影響を与えるために使用されます。- ルール処理用の仮想マシン
nftables
フレームワークは、ルールを処理するために内部仮想マシンを使用します。この仮想マシンは、アセンブリ言語の操作 (レジスターへのデータのロード、比較の実行など) に似た命令を実行します。このようなメカニズムにより、非常に柔軟かつ効率的なルール処理が可能になります。nftables
の機能拡張を、この仮想マシンの新しい命令として導入できます。これを行うには、通常、新しいカーネルモジュールと、libnftnl
ライブラリーおよびnft
コマンドラインユーティリティーの更新が必要です。または、カーネルを変更することなく、既存の命令を新しい方法で組み合わせることで、新しい機能を導入することもできます。
nftables
ルールの構文は、基盤となる仮想マシンの柔軟性を反映しています。たとえば、meta mark set tcp dport map { 22: 1, 80: 2 }
というルールは、TCP 宛先ポートが 22 の場合にパケットのファイアウォールマークを 1 に設定し、ポートが 80 の場合に 2 に設定します。このように複雑なロジックを簡潔に表現できます。- 複雑なフィルタリングと決定マップ
nftables
フレームワークは、ipset
ユーティリティーの機能を統合および拡張します。このユーティリティーは、iptables
において IP アドレス、ポート、その他のデータタイプ、そして何よりもその組み合わせの一括マッチングに使用されるものです。この統合により、大規模で動的なデータセットをnftables
内で直接管理することが容易になります。また、nftables
は、任意のデータ型の複数の値または範囲に基づいてパケットをマッチングすることをネイティブにサポートしています。これにより、複雑なフィルタリング要件を処理する機能が強化されています。nftables
を使用すると、パケット内の任意のフィールドを操作できます。nftables
では、セットは名前付きまたは匿名のいずれかです。名前付きセットは複数のルールによって参照され、動的に変更できます。匿名セットはルール内でインラインで定義され、不変です。セットには、IP アドレスとポート番号のペアなど、異なるタイプの組み合わせである要素を含めることができます。この機能により、複雑な条件のマッチングにおける柔軟性が向上します。カーネルは、セットを管理するために、特定の要件 (パフォーマンス、メモリー効率など) に基づいて最も適切なバックエンドを選択できます。セットは、キーと値のペアを持つマップとしても機能できます。値の部分は、データポイント (パケットヘッダーに書き込む値) として、またはジャンプ先の決定やチェーンとして使用できます。これにより、"決定マップ" と呼ばれる複雑で動的なルール動作が可能になります。- 柔軟なルール形式
nftables
ルールの構造はシンプルです。条件とアクションが左から右に順に適用されます。この直感的な形式により、ルールの作成とトラブルシューティングが簡素化されます。ルール内の条件は、論理的に (AND 演算子を使用して) 結合されます。そのため、ルールがマッチするには、すべての条件が "true" と評価される必要があります。いずれかの条件が失敗した場合、評価が次のルールに進みます。
nftables
内のアクションは、drop
やaccept
など、パケットのそれ以上のルール処理を停止する最終的なアクションにすることができます。counter log meta mark set 0x3
などの非終端アクションは、特定のタスク (パケットのカウント、ロギング、マークの設定など) を実行しますが、後続のルールの評価を許可します。
8.2.3. 非推奨の iptables フレームワークの概念 リンクのコピーリンクがクリップボードにコピーされました!
積極的にメンテナンスされている nftables
フレームワークと同様に、非推奨の iptables
フレームワークを使用すると、さまざまなパケットフィルタリングタスク、ロギングと監査、NAT 関連の設定タスクなどを実行できます。
iptables
フレームワークは複数のテーブルに構造化されています。各テーブルは特定の目的のために設計されています。
filter
- デフォルトのテーブル。一般的なパケットフィルタリングを提供します。
nat
- ネットワークアドレス変換 (NAT) 用。パケットの送信元アドレスと宛先アドレスの変更が含まれます。
mangle
- 特定のパケット変更用。これを使用すると、高度なルーティング決定のためにパケットヘッダーを変更できます。
raw
- 接続追跡の前に必要な設定。
これらのテーブルは、個別のカーネルモジュールとして実装されています。各テーブルは、INPUT
、OUTPUT
、FORWARD
など、一定の組み込みチェーンのセットを提供します。チェーンは、パケットの評価基準となる一連のルールです。このチェーンは、カーネル内のパケット処理フローの特定のポイントにフックします。チェーンの名前は異なるテーブル間で同じですが、チェーンの実行順序はそれぞれのフックの優先順位によって決まります。ルールが正しい順序で適用されるように、優先順位はカーネルによって内部的に管理されます。
もともと、iptables
は IPv4 トラフィックを処理するために設計されました。しかし、IPv6 プロトコルの登場に伴い、iptables
と同等の機能を提供し、ユーザーが IPv6 パケットのファイアウォールルールを作成および管理できるようにするために、ip6tables
ユーティリティーを導入する必要が生まれました。それと同じ理屈で、Address Resolution Protocol (ARP) を処理するために arptables
ユーティリティーが作成され、イーサネットブリッジフレームを処理するために ebtables
ユーティリティーが開発されました。これらのツールを使用すると、さまざまなネットワークプロトコルに iptables
のパケットフィルタリング機能を適用し、包括的なネットワークカバレッジを実現できます。
iptables
の機能を強化するために、機能拡張の開発が開始されました。通常、機能拡張は、ユーザー空間の動的共有オブジェクト (DSO) とペアになったカーネルモジュールとして実装されます。この拡張により、"マッチ" と "ターゲット" が導入されます。これらをファイアウォールルールで使用すると、より高度な操作を実行できます。この拡張は、複雑なマッチとターゲットを可能にするものです。たとえば、特定のレイヤー 4 プロトコルヘッダー値をマッチさせたり操作したり、レート制限を実行したり、クォータを適用したりすることができます。一部の拡張は、デフォルトの iptables
構文の制限に対処するように設計されています ("マルチポート" マッチ拡張など)。この拡張により、単一のルールを複数の非連続ポートにマッチさせることができるため、ルール定義が簡素化され、必要な個別のルールの数を減らすことができます。
ipset
は、iptables
に対する特別な種類の機能拡張です。これはカーネルレベルのデータ構造であり、パケットとマッチできる IP アドレス、ポート番号、その他のネットワーク関連要素のコレクションを作成するために、iptables
と一緒に使用されます。これらのセットにより、ファイアウォールルールの作成と管理のプロセスが大幅に効率化、最適化、高速化されます。
8.2.4. iptables および ip6tables ルールセットの nftables への変換 リンクのコピーリンクがクリップボードにコピーされました!
iptables-restore-translate
ユーティリティーおよび ip6tables-restore-translate
ユーティリティーを使用して、iptables
および ip6tables
ルールセットを nftables
に変換します。
前提条件
-
nftables
パッケージおよびiptables
パッケージがインストールされている。 -
システムに
iptables
ルールおよびip6tables
ルールが設定されている。
手順
iptables
ルールおよびip6tables
ルールをファイルに書き込みます。iptables-save >/root/iptables.dump ip6tables-save >/root/ip6tables.dump
# iptables-save >/root/iptables.dump # ip6tables-save >/root/ip6tables.dump
Copy to Clipboard Copied! Toggle word wrap Toggle overflow ダンプファイルを
nftables
命令に変換します。iptables-restore-translate -f /root/iptables.dump > /etc/nftables/ruleset-migrated-from-iptables.nft ip6tables-restore-translate -f /root/ip6tables.dump > /etc/nftables/ruleset-migrated-from-ip6tables.nft
# iptables-restore-translate -f /root/iptables.dump > /etc/nftables/ruleset-migrated-from-iptables.nft # ip6tables-restore-translate -f /root/ip6tables.dump > /etc/nftables/ruleset-migrated-from-ip6tables.nft
Copy to Clipboard Copied! Toggle word wrap Toggle overflow -
必要に応じて、生成された
nftables
ルールを手動で更新して、確認します。 nftables
サービスが生成されたファイルをロードできるようにするには、以下を/etc/sysconfig/nftables.conf
ファイルに追加します。include "/etc/nftables/ruleset-migrated-from-iptables.nft" include "/etc/nftables/ruleset-migrated-from-ip6tables.nft"
include "/etc/nftables/ruleset-migrated-from-iptables.nft" include "/etc/nftables/ruleset-migrated-from-ip6tables.nft"
Copy to Clipboard Copied! Toggle word wrap Toggle overflow iptables
サービスを停止し、無効にします。systemctl disable --now iptables
# systemctl disable --now iptables
Copy to Clipboard Copied! Toggle word wrap Toggle overflow カスタムスクリプトを使用して
iptables
ルールを読み込んだ場合は、スクリプトが自動的に開始されなくなったことを確認し、再起動してすべてのテーブルをフラッシュします。nftables
サービスを有効にして起動します。systemctl enable --now nftables
# systemctl enable --now nftables
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
検証
nftables
ルールセットを表示します。nft list ruleset
# nft list ruleset
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
8.2.5. 単一の iptables および ip6tables ルールセットの nftables への変換 リンクのコピーリンクがクリップボードにコピーされました!
Red Hat Enterprise Linux は、iptables
ルールまたは ip6tables
ルールを、nftables
で同等のルールに変換する iptables-translate
ユーティリティーおよび ip6tables-translate
ユーティリティーを提供します。
前提条件
-
nftables
パッケージがインストールされている。
手順
以下のように、
iptables
またはip6tables
の代わりにiptables-translate
ユーティリティーまたはip6tables-translate
ユーティリティーを使用して、対応するnftables
ルールを表示します。iptables-translate -A INPUT -s 192.0.2.0/24 -j ACCEPT
# iptables-translate -A INPUT -s 192.0.2.0/24 -j ACCEPT nft add rule ip filter INPUT ip saddr 192.0.2.0/24 counter accept
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 拡張機能によっては変換機能がない場合もあります。このような場合には、ユーティリティーは、以下のように、前に
#
記号が付いた未変換ルールを出力します。iptables-translate -A INPUT -j CHECKSUM --checksum-fill
# iptables-translate -A INPUT -j CHECKSUM --checksum-fill nft # -A INPUT -j CHECKSUM --checksum-fill
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
8.2.6. 一般的な iptables コマンドと nftables コマンドの比較 リンクのコピーリンクがクリップボードにコピーされました!
以下は、一般的な iptables
コマンドと nftables
コマンドの比較です。
すべてのルールをリスト表示します。
Expand iptables nftables iptables-save
nft list ruleset
特定のテーブルおよびチェーンをリスト表示します。
Expand iptables nftables iptables -L
nft list table ip filter
iptables -L INPUT
nft list chain ip filter INPUT
iptables -t nat -L PREROUTING
nft list chain ip nat PREROUTING
nft
コマンドは、テーブルおよびチェーンを事前に作成しません。これらは、ユーザーが手動で作成した場合にのみ存在します。firewalld によって生成されたルールの一覧表示:
nft list table inet firewalld nft list table ip firewalld nft list table ip6 firewalld
# nft list table inet firewalld # nft list table ip firewalld # nft list table ip6 firewalld
Copy to Clipboard Copied! Toggle word wrap Toggle overflow