nftablesによる高度なファイアウォール管理: iptablesからの移行
nftablesはLinuxシステムにおけるiptablesの後継であり、それ以来デフォルトのファイアウォールとなっています。まだnftablesに移行していない場合、パフォーマンスの向上、コマンド構文の簡易化、ファイアウォールルールの管理が全体的に簡単になる利点を見逃しています。このチュートリアルでは、iptablesからnftablesへの移行方法を学びます。そのためには、nftablesがiptablesと機能的にどのように異なるか、さらにルールを設定するための新しいコマンド構文に慣れる必要があります。
このチュートリアルでは、あなたは学びます:
- nftablesはiptablesとはどのように異なる機能を持っていますか?
iptablesコマンドがどのように自動的にnftablesに変換されるか- iptablesの観点からnftablesへの移行を始める方法
nftables と iptables の違い: 機能の違い
iptablesは、iptables、ip6tables、arptables、ebtablesなどの複数のツールを備えています。これにより、フィルタリングしようとする内容に応じて複数のルールセットを維持する必要があるため、ルール管理が非常に複雑になる可能性があります。少なくとも、広く普及しているIPv6の時代においては、ファイアウォールにルールを追加するたびにほぼ毎回、iptablesとip6tablesの両方でフィルタを作成する必要があることを意味しています。
nftablesはすべてを1つのツールに統合します。さらに、nftablesはファイアウォールルールの構造をより制御できるようにします。iptablesに存在するデフォルトのチェーンであるINPUT、OUTPUT、およびFORWARDに加えて、mangle、nat、filter、およびrawのテーブルとは異なり、nftablesには自動的に作成されるチェーンやテーブルはありません。私たちは自分たちのテーブルとチェーンを作成し、名前を付け、ルールで埋め、その機能を結びつける必要があります。その結果、ファイアウォールがネットワークトラフィックを処理する方法に対するはるかに詳細な制御が得られます。
さらに、パフォーマンスにも違いがあります。iptablesはデフォルトのチェーンとテーブルを強制するため、この構造はシステムを流れるすべてのパケットに触れ、ルールが設定されていなくてもネットワークパフォーマンスに測定可能な影響を与えます!nftablesは私たちが必要なものだけを正確に設定することを可能にするため、iptablesによって導入された不要な部分を削減することができます。
iptablesからnftablesへの自動移行
良いニュースは、nftablesへの移行の一部が自動的に処理されているということです。
たとえあなたのシステムで古い
iptables コマンドを使用していても、これらのルールはnftablesの同等のものに変換され、nftablesによって設定が適用されています。つまり、iptablesを内部でまだ利用している2019年以前の非常に古いシステムを使用していない限り、です。iptablesコマンドはほとんどのシステムでまだ使用できますが、現在は入力を同等のnftablesルールに変換するツールにリンクされており、その後、nftablesに構成を渡して適用します。
このことは、自分で確認できます。readlinkコマンドを使って、iptablesコマンドが実際には別のツールへのシンボリックリンクであることを確認できます。私たちのUbuntuテストシステムでは、xtables-nft-multiがiptablesと入力するたびに実行される実際のコマンドです。
readlink -f $(which iptables)
/usr/sbin/xtables-nft-multi
このツールのマニュアルページをman xtables-nft-multiで開くと、それが実際に何をするのかを見ることができます:
xtables-nft — iptables using nftables kernel api
このツールは単純にiptablesコマンドをnftables APIに送信します。
この翻訳は自動的に行われますが、古いiptablesコマンドの構文を放棄し、nftablesに移行することが推奨されます。複雑なルールの場合、APIを介した翻訳が予期通りに機能しない可能性があるため、nftコマンドを使用して直接nftablesとインターフェースする方が良いでしょう。それだけでなく、コマンドの構文は簡単で、ルールの管理も簡単です。
さらに、iptablesは将来のリリースで完全に非推奨になる可能性があり、この互換レイヤーは機能しなくなったり必要な機能を含まなくなるかもしれません。要するに、移行は避けられず、システム管理者にとって有利です。
iptablesをnftablesに翻訳する
iptablesで書かれた複雑なルールは、間違いなくnftablesに手動で変換する必要があります。しかし、より単純なルールについては、iptables-translateコマンドが適切にiptablesコマンドを入力して同等のnftコマンドを出力することができます。以下は、すべての確立された接続と関連する接続を受け入れる例です:
iptables-translate -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
nft add rule ip filter INPUT ct state related,established counter accept
iptablesコマンドを指定しますが、iptablesの代わりにiptables-translateを使用します。他の引数はiptablesには一般的です。次に、出力として、同じiptablesルールに直接翻訳されるnftコマンドが得られます。
ここに、着信ICMPトラフィックを遮断するもう一つの例があります:
iptables-translate -t mangle -A PREROUTING -p icmp -j DROP
nft add rule ip mangle PREROUTING ip protocol icmp counter drop
残念ながら、iptables-translateツールは完璧ではなく、
nftコマンドに直接対応するものがないより複雑なiptablesルールを与えると、簡単に対応できなくなります。nftablesとiptables: 移行の実施
このセクションでは、読者がiptablesに reasonably familiar であるシステム管理者であるという前提で進めますが、nftablesについては何も知らないと仮定します。これは、iptablesの知識を少し持っていることを前提に、nftablesに慣れるための入門となります。
nftablesでの基本的なファイアウォール設定の適用プロセスを説明しながら、同じプロセスが古い方法でiptablesでどのように行われるかも示しましょう:
前述の通り、nftablesはデフォルトでテーブルやチェーンが作成されていない真っ新な状態を提供します。したがって、iptablesとは異なり、テーブルを作成することから始める必要があります。テーブルは、ファイアウォールルールを整理するために使用される最上位のコンテナです。では、
filterという名前のテーブルを作成することから始めましょう:sudo nft add table inet filternftはコマンドを開始し、nftablesとのインタラクション方法です。addは、このユーティリティに何かを追加したいことを示します。tableは、私たちが追加したいものです。inetは、ルールをIPv4とIPv6の両方に適用したいことを意味します – もしIPv4またはIPv6のいずれかをフィルタリングしたい場合は、それぞれipやip6を指定できます。最後に、filterは、追加しているテーブルの名前です。次に、テーブルにチェーンを追加する必要があります。このチェーンに
inputという名前を付けて、これが受信したネットワークパケットを処理するために使用されることを明確にします:sudo nft 'add chain inet filter input { type filter hook input priority 0; }'私たちはすでに上記のいくつかの引数が何をするかを説明しました。次に、残りを説明しましょう。
chainは、ファイアウォールの設定にチェーンを追加しようとしていることを指定します。filterは、新しいチェーンを追加しているテーブルの名前です。inputはチェーンの名前で(目的を明確にするためによく選ばれる名前です)、波括弧の中でtype filterを指定して、このチェーンがパケットをフィルタリングすることを示します。hook inputは、チェーンが入力フックに接続されることを意味し、これはnftablesが受信するパケットを処理するために使用します。最後に、priority 0は、他のチェーンよりも高い優先順位をこのチェーンに与えます(番号が低いほど優先順位が高く、0が最も高い優先順位です)。ここまでで、
filterという名前のテーブルと、inputという名前のチェーンがあります。では、チェーンにいくつかのルールを追加する作業を続けましょう。ポート80および443での受信トラフィックを許可するルールを追加するためのシンプルなnftコマンドを見てみましょう。sudo nft add rule inet filter input tcp dport { 80, 443 } acceptiptablesの同等のルールは次のようになります:
sudo iptables -A INPUT -p tcp -m multiport --dports 80,443 -j ACCEPTこれらのコマンドはどちらも同じことを行います。すなわち、ポート80(HTTP)および443(HTTPS)での受信トラフィックがファイアウォールを通過し、サーバー上で実行されている公開サービスに到達できるようにすることです。
nftコマンドはよりシンプルで、iptablesコマンドとは異なり、IPv4とIPv6の両方に適用されます。次のコマンドを実行することで、nftablesの設定を見ることができます:
sudo nft list ruleset table inet filter { chain input { type filter hook input priority filter; policy accept; tcp dport { 80, 443 } accept } }出力はiptablesのものよりはるかに理解しやすく、ほとんどのクレジットはその構造化された形式によるものです。私たちの
inetテーブルにはfilterという名前のテーブルがあり、inputという名前のチェーンが含まれていて、そのチェーンは入力フックに接続されており、ポート(dport)80と443に向けられたトラフィックが受け入れられています。
これらのステップを完了することで、nftables にテーブルとチェーンを設定し、着信トラフィックに適用されるルールを作成し、コマンドが元の iptables の同等物からどのように翻訳されるかを理解しました。
nftablesはiptablesよりも少し簡単であることが証明されていますが、どちらもユーザーフレンドリーではないことは認められています。新しい構文を学ぶことが大変な作業に思える場合は、firewalldやufwのようなシンプルなフロントエンドが、システム上の基盤となるiptablesやnftablesファイアウォールと対話するためのはるかに簡単な方法を提供していることを思い出してください。これらはiptablesとnftablesを利用するユーザーフレンドリーな代替手段ですが、構文が簡単で、余分な作業をいくつかお手伝いしてくれます。
締めくくりの考え
このチュートリアルでは、Linuxシステムにおけるiptablesファイアウォールからnftablesファイアウォールへの移行方法を見ました。これは表面的な紹介に過ぎず、両方のファイアウォールは複雑であり、それらを十分に使いこなしたいと考える人には多くの献身が必要です。
テーブル、チェーン、ルールを nft コマンドで作成する方法がわかったので、iptables 構文を nft に変換するための iptables-translate ツールを使って、iptables から nftables への移行を Linux システムで開始することができるようになります。複雑なルールについては、追加の調整が必要になる可能性があります。高度なルールや nftables 構成の例を見ることができる nftables ウィキでのさらなる読み物をお勧めします。
