ウェブサイト検索

nftablesによる高度なファイアウォール管理:iptablesからの移行


nftablesはLinuxシステムにおけるiptablesの後継であり、以来デフォルトのファイアウォールとなっています。まだnftablesに移行していない場合、パフォーマンスの向上、コマンド構文の簡素化、ファイアウォールルールの管理が全体的に簡単になることを逃しています。このチュートリアルでは、iptablesからnftablesに移行する方法を学びます。そのためには、機能的な観点からnftablesがiptablesとどのように異なるか、ルールを設定するための新しいコマンド構文に慣れる必要があります。

このチュートリアルでは学びます:

  • nftablesはiptablesとはどのように異なって機能しますか?
  • iptables コマンドがどのように自動的に nftables に変換されるか
  • iptablesの観点からnftablesへの移行を始める方法

nftablesとiptables:機能の違い

iptablesには、iptables</code>、ip6tables</code>、arptables</code>、およびebtables</code>のような複数のツールが付属しています。これは、フィルタリングしようとしている内容に応じて複数のルールセットを維持する必要があるため、ルール管理をかなり複雑にする可能性があります。少なくとも、広く普及したIPv6の時代においては、ファイアウォールにルールを追加するたびにほぼ常にiptables</code>とip6tables</code>の両方でフィルタを書く必要があることを意味します。

nftablesはすべてを1つのツールに統合します。さらに、nftablesはファイアウォールルールの構造に対するより多くの制御を提供します。iptablesに存在するデフォルトのチェーンINPUT、OUTPUT、およびFORWARD、およびテーブルmangle、nat、filter、rawとは異なり、nftablesには自動的に作成されるチェーンやテーブルはありません。私たちは自分自身のテーブルとチェーンを作成し、名前を付け、ルールでそれらを埋めて機能を結びつける必要があります。その結果、ファイアウォールがネットワークトラフィックを処理する方法に対して、はるかに細かい制御が可能になります。

さらに、パフォーマンスにも違いがあります。iptablesがデフォルトのチェーンとテーブルを強制するため、この構造はシステムを流れるすべてのパケットで触れられ、ルールが構成されていなくてもネットワークパフォーマンスに測定可能な影響を与えます。nftablesは必要なものだけを正確に構成できるため、iptablesによって導入された不必要な部分を削減することができます。

iptablesからnftablesへの自動移行

良いニュースは、nftablesへの移行の一部が自動的に処理されていることです。

知っていましたか?<&47;b>
たとえあなたのシステムで古いiptablesコマンドを使用していても、これらのルールはnftablesの同等のものに変換され、設定はnftablesによって強制されています。つまり、2019年以前のような非常に古いシステムを使用していない限り、iptablesが内部で使用されていることはありません。

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</code>コマンドがiptables</code>コマンドを入力として受け取り、同等のnft</code>コマンドを出力するのに適した仕事をします。以下は、すべての確立された接続および関連接続を受け入れる例です。


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にある程度精通しているシステム管理者であるという前提で進めますが、nftablesについては何も知らないと仮定します。これは、iptablesに関する少しの知識を持っていることを前提に、nftablesに慣れるための導入となります。

nftablesで基本的なファイアウォール設定を適用するプロセスを見ていきながら、同じプロセスがiptablesでどのように行われるかも示しましょう。

  1. 前述のように、nftablesはデフォルトでテーブルやチェーンが作成されていない真っ白な状態を提供します。したがって、iptablesとは異なり、テーブルを作成することから始める必要があります。テーブルは、ファイアウォールルールを整理するために使用される最上位のコンテナです。filterという名前のテーブルを作成することから始めましょう。

    
    sudo nft add table inet filter
    

    nftはコマンドを開始し、nftablesと対話する方法です。addは、何かを追加したいことをユーティリティに伝えます。tableは追加したいものです。inetは、IPv4とIPv6の両方にルールを適用したいことを意味します。IPv4またはIPv6のみをフィルタリングしたい場合は、それぞれipまたはip6を指定することができます。最後に、filterは追加しているテーブルの名前です。

  2. 次に、テーブルにチェーンを追加する必要があります。このチェーンを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が最も高い優先度です)。

  3. ここまでで、filterという名前のテーブルと、inputという名前のチェーンがあります。これからチェーンにいくつかのルールを追加することができます。ポート80と443での受信トラフィックを許可するルールを追加するためのシンプルなnftコマンドを見てみましょう:

    
    sudo nft add rule inet filter input tcp dport { 80, 443 } accept
    

    iptablesにおける同等のルールは次のとおりです:

    
    sudo iptables -A INPUT -p tcp -m multiport --dports 80,443 -j ACCEPT
    

    これらのコマンドはどちらも同じことを行い、ポート80(HTTP)および443(HTTPS)での着信トラフィックがファイアウォールを通過し、サーバー上で実行されている公開サービスに到達できるようにします。nft<コマンドはよりシンプルであり、iptables<コマンドとは異なり、IPv4とIPv6の両方に適用されます。

  4. 次のコマンドを実行することで、nftablesの設定を確認できます:

    
    sudo nft list ruleset
    table inet filter {
    	chain input {
    		type filter hook input priority filter; policy accept;
    		tcp dport { 80, 443 } accept
    	}
    }
    

    出力はiptablesのものよりもはるかに理解しやすく、そのほとんどの功績は構造化されたフォーマットにあります。私たちは、filterという名前のinetテーブルがinputという名前のチェーンを含んでいること、チェーンが入力フックに接続されていること、ポート(dport) 80および443に向けられたトラフィックが受け入れられていることがわかります。

これらの手順を完了することで、nftablesにテーブルとチェーンを設定し、着信トラフィックに適用されるルールを作成しました。また、コマンドが元のiptablesの同等物からどのように変換されるかを理解しました。

圧倒されていますか?<&47;b>
nftablesはiptablesよりも少し簡単であることが証明されていますが、どちらも正直なところあまりユーザーフレンドリーではありません。新しい構文を学ぶことが困難に思える場合は、firewalldやufwのようなよりシンプルなフロントエンドが、システム上の基盤となるiptablesやnftablesファイアウォールと対話するためのはるかに簡単な方法を提供していることを思い出してください。これらはiptablesやnftablesを利用しながらも、より簡単な構文を持ち、いくつかの追加作業を代わりに行ってくれるユーザーフレンドリーな代替手段です。

締めくくりの考え

このチュートリアルでは、Linuxシステムでiptablesファイアウォールからnftablesファイアウォールに移行する方法を見ました。これは、両方のファイアウォールが複雑であり、十分に使いこなすためには多くの献身が必要であるため、表面的な紹介に過ぎません。

テーブル、チェーン、およびルールをnft</code>コマンドで作成する方法を知り、iptables</code> 構文をnft</code>に変換するiptables-translate</code>ツールを使用できるようになった今、Linuxシステムでiptablesからnftablesへの移行を開始することができます。複雑なルールには、さらなる調整が必要になる可能性があります。高度なルールやnftablesの設定の例を見ることができるnftablesウィキのさらなる読書をお勧めします。

関連記事: