iptablesとnftablesの違い|コマンド・仕組み・設定方法を比較

ITインフラ
この記事は約17分で読めます。

この記事の最終更新日: 2026年6月23日


Linuxサーバーのファイアウォール設定を調べていると、よく出てくるのが iptablesnftables です。

どちらもLinuxの通信制御に関係する仕組みですが、初心者にとっては次のような疑問が出てくると思います。

「iptablesとnftablesは何が違うの?」
「コマンドの書き方はどう変わるの?」
「今から覚えるならどちらを使うべき?」
「既存サーバーでは何を確認すればいい?」

結論から言うと、iptablesは従来から使われてきたLinuxのファイアウォール管理ツールで、nftablesはその後継にあたる新しい仕組みです。

Netfilter公式でも、nftablesは従来の iptablesip6tablesarptablesebtables を置き換えるものとして説明されています。つまり、nftablesはiptables系ツールの後継として位置づけられています。(Netfilter)

この記事では、iptablesとnftablesの違いを、コマンド・仕組み・設定方法の観点から比較して解説します。


まず結論:iptablesは旧方式、nftablesは新方式

かなりざっくり言うと、iptablesとnftablesの関係は次のようになります。

iptables  = 従来のLinuxファイアウォール管理ツール
nftables  = iptables系ツールの後継となる新しい仕組み

iptablesは長年使われてきたため、古い記事や既存サーバーの設定では今でもよく見かけます。

一方、nftablesはiptablesの後継として登場した新しい仕組みで、より柔軟にルールを管理できるようになっています。

ただし、iptablesがすぐに完全に使えなくなるという意味ではありません。実務では、既存環境や古い手順書でiptablesが出てくる場面も多いです。

そのため、現実的には次のように考えるとよいです。

新しく学ぶなら nftables を優先
既存環境を読むなら iptables も必要


iptablesとは?

iptables は、Linuxカーネル内のパケットフィルタリングルールを設定・管理・確認するためのツールです。

iptablesとip6tablesは、IPv4・IPv6のパケットフィルタルールを設定、管理、確認するためのツールとして説明されています。(man7.org)

たとえば、iptablesでは以下のような制御ができます。

  • SSHの22番ポートを許可する
  • HTTPの80番ポートを許可する
  • HTTPSの443番ポートを許可する
  • 特定のIPアドレスを拒否する
  • NATやポートフォワーディングを設定する

iptablesでSSHを許可する場合は、次のように書きます。

iptables -A INPUT -p tcp --dport 22 -j ACCEPT

このコマンドは、INPUTチェインに「TCPの22番ポート宛て通信を許可する」というルールを追加しています。


nftablesとは?

nftables は、iptablesの後継として使われる新しいパケットフィルタリングの仕組みです。

nftablesでは、主に nft コマンドを使ってルールを設定・確認します。nft は、nftablesフレームワークにおいてLinuxカーネル内のパケットフィルタリングや分類ルールを設定・管理・確認するためのコマンドです。(Netfilter)

nftablesでSSHを許可する場合は、次のように書けます。

nft add rule inet filter input tcp dport 22 accept

iptablesとはコマンドの書き方が違いますが、目的は同じです。

どちらも「Linuxサーバーに入ってくる通信を制御する」ために使われます。


iptablesとnftablesの違いまとめ

まずは全体像を表で比較します。

比較項目iptablesnftables
位置づけ従来のファイアウォール管理ツールiptables系の後継
主なコマンドiptables, ip6tablesnft
IPv4 / IPv6コマンドが分かれるinet familyでまとめやすい
ルール構造table / chain / ruletable / chain / rule
書き方オプションを並べる形式より構造化された形式
複数条件の扱い似たルールが増えやすいsetやmapでまとめやすい
確認コマンドiptables -L, iptables-savenft list ruleset
学習優先度既存環境の理解に必要新規学習で優先したい

ポイントは、どちらもLinuxの通信制御に使うが、nftablesの方が新しく、統一的に扱いやすいという点です。


違い1:使うコマンドが違う

iptablesでは、主に iptables コマンドを使います。

iptables -L -n -v

IPv6の場合は、ip6tables を使います。

ip6tables -L -n -v

一方、nftablesでは nft コマンドを使います。

nft list ruleset

iptablesではIPv4用の iptables、IPv6用の ip6tables のようにコマンドが分かれています。

nftablesでは、nft コマンドでより統一的にルールを扱えます。


違い2:IPv4とIPv6の扱いが違う

iptablesでは、IPv4とIPv6でコマンドが分かれます。

iptables    # IPv4
ip6tables   # IPv6

そのため、IPv4とIPv6の両方に対応する場合、似たようなルールをそれぞれ管理する必要があります。

一方、nftablesでは inet familyを使うことで、IPv4とIPv6をまとめて扱いやすくなります。

たとえば、次のような形です。

table inet filter {
    chain input {
        type filter hook input priority 0;
        policy drop;

        tcp dport 22 accept
        tcp dport 80 accept
        tcp dport 443 accept
    }
}

このように、nftablesではIPv4とIPv6を一つの設定として整理しやすくなっています。


違い3:ルールの構造がより整理しやすい

iptablesにもnftablesにも、次のような概念があります。

  • table
  • chain
  • rule

nftablesでは、これらをより明示的に構造化して扱います。

nftables公式Wikiでは、tableはchainを入れるコンテナ、chainはruleを入れるコンテナ、ruleはchain内に設定されるアクションとして説明されています。(nftables Wiki)

イメージとしては、次のような階層です。

table
└── chain
    └── rule

たとえば、nftablesでは次のような構成で書けます。

table inet filter {
    chain input {
        type filter hook input priority 0;
        policy drop;

        iif lo accept
        ct state established,related accept
        tcp dport 22 accept
        tcp dport 80 accept
        tcp dport 443 accept
    }
}

この設定では、以下のような意味になります。

設定意味
table inet filterIPv4/IPv6を扱うfilterテーブル
chain inputサーバーに入ってくる通信を扱うchain
policy drop基本的に通信を破棄
iif lo acceptループバック通信を許可
ct state established,related accept確立済み・関連通信を許可
tcp dport 22 acceptSSHを許可
tcp dport 80 acceptHTTPを許可
tcp dport 443 acceptHTTPSを許可

iptablesでも同じような通信制御はできますが、nftablesの方が設定全体を構造として把握しやすいです。


違い4:設定方法の書き方が違う

iptablesでは、コマンドを1行ずつ追加していく書き方がよく使われます。

たとえば、SSH・HTTP・HTTPSを許可する場合は次のようになります。

iptables -A INPUT -p tcp --dport 22 -j ACCEPT
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
iptables -A INPUT -p tcp --dport 443 -j ACCEPT

一方、nftablesでは次のように書けます。

nft add rule inet filter input tcp dport 22 accept
nft add rule inet filter input tcp dport 80 accept
nft add rule inet filter input tcp dport 443 accept

また、設定ファイルとしてまとめる場合は、次のように構造化して書けます。

table inet filter {
    chain input {
        type filter hook input priority 0;
        policy drop;

        tcp dport 22 accept
        tcp dport 80 accept
        tcp dport 443 accept
    }
}

nftablesは、コマンドで1行ずつ追加することもできますが、設定ファイルとして読むと全体像を把握しやすいです。


違い5:複数条件をまとめやすい

iptablesでは、複数のIPアドレスやポートを扱うときに、似たようなルールが増えがちです。

たとえば、複数のIPアドレスを許可する場合、iptablesでは次のような書き方になります。

iptables -A INPUT -s 192.168.1.10 -j ACCEPT
iptables -A INPUT -s 192.168.1.11 -j ACCEPT
iptables -A INPUT -s 192.168.1.12 -j ACCEPT

nftablesでは、set を使って複数の値をまとめて扱えます。

nft add set inet filter allowed_ips { type ipv4_addr\; }
nft add element inet filter allowed_ips { 192.168.1.10, 192.168.1.11, 192.168.1.12 }

このように、許可IPや拒否IPが増える場合、nftablesの方が整理しやすくなります。

小規模なサーバーでは大きな差を感じにくいかもしれませんが、ルール数が増えるほどnftablesのメリットは大きくなります。


違い6:確認コマンドが違う

iptablesのルールを確認するには、次のコマンドを使います。

iptables -L -n -v

より正確に現在の設定を確認したい場合は、次のコマンドもよく使います。

iptables-save

nftablesの場合は、次のコマンドで現在のルールセットを確認します。

nft list ruleset

nftablesでは、table、chain、ruleをまとめて確認できるため、設定全体を把握しやすいです。


違い7:iptablesコマンドでも中身がnftablesの場合がある

ここは少しややこしいポイントです。

最近のLinux環境では、iptables コマンドを使っていても、内部的にはnftablesの仕組みを使っている場合があります。

Netfilter公式でも、iptables/ip6tablesと同じ構文でnftables基盤上で実行できる互換レイヤーがあると説明されています。(Netfilter)

確認するには、次のコマンドを使います。

iptables --version

表示例として、次のように出る場合があります。

iptables v1.8.x (nf_tables)

この場合、コマンド名は iptables ですが、バックエンドはnftablesです。

一方、次のように表示される場合もあります。

iptables v1.8.x (legacy)

この場合は、従来のiptablesバックエンドです。

つまり、単に iptables コマンドが使われているからといって、必ずしも古いiptablesだけで動いているとは限りません。


設定例で比較:SSHを許可する

ここからは、よくある設定をiptablesとnftablesで比較します。

まずはSSHを許可する例です。

iptablesの場合

iptables -A INPUT -p tcp --dport 22 -j ACCEPT

nftablesの場合

nft add rule inet filter input tcp dport 22 accept

どちらも、TCPの22番ポート宛て通信を許可しています。

SSHポートを変更している場合は、22番ではなく実際に使っているポート番号を指定します。


設定例で比較:HTTP/HTTPSを許可する

WebサーバーでHTTPとHTTPSを許可する場合です。

iptablesの場合

iptables -A INPUT -p tcp --dport 80 -j ACCEPT
iptables -A INPUT -p tcp --dport 443 -j ACCEPT

nftablesの場合

nft add rule inet filter input tcp dport 80 accept
nft add rule inet filter input tcp dport 443 accept

nftablesでは、setを使ってポートをまとめることもできます。

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

このように、複数ポートをまとめて扱えるため、設定がすっきりします。


設定例で比較:基本拒否にする

ファイアウォールでは、「基本は拒否して、必要な通信だけ許可する」という考え方がよく使われます。

iptablesの場合

iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT

nftablesの場合

table inet filter {
    chain input {
        type filter hook input priority 0;
        policy drop;
    }

    chain forward {
        type filter hook forward priority 0;
        policy drop;
    }

    chain output {
        type filter hook output priority 0;
        policy accept;
    }
}

nftablesでは、chainごとに policy droppolicy accept を設定します。

ただし、リモートサーバーで policy drop を設定する場合は注意が必要です。SSHを許可する前にINPUTをdropにすると、自分自身がサーバーから締め出される可能性があります。


設定例で比較:現在の状態を確認する

iptablesの場合

iptables -L -n -v
iptables-save

nftablesの場合

nft list ruleset

既存サーバーを触る場合、まずは設定変更よりも現状確認が重要です。

いきなりルールを追加・削除するのではなく、現在どの方式でルールが管理されているのかを確認しましょう。


iptablesからnftablesへ移行するときの注意点

iptablesからnftablesへ移行するときは、単純にコマンドを書き換えるだけでは済まない場合があります。

特に注意したいのは、以下の点です。

1. 既存ルールを必ずバックアップする

移行前には、現在のiptablesルールを保存しておきます。

iptables-save > iptables-backup.txt
ip6tables-save > ip6tables-backup.txt

nftables側も確認します。

nft list ruleset

現在の状態を把握せずに移行すると、必要な通信が止まったり、不要な通信を許可してしまったりする可能性があります。


2. iptables legacyとnftablesを混在させない

iptables-legacy、iptables-nft、nftablesが混在すると、どのルールが実際に効いているのか分かりにくくなります。

最低限、次のコマンドで現在のiptablesバックエンドを確認しましょう。

iptables --version

nf_tables と表示される場合は、iptablesコマンドを使っていてもnftablesバックエンドです。

iptables v1.8.x (nf_tables)

legacy と表示される場合は、従来のiptablesバックエンドです。

iptables v1.8.x (legacy)


3. SSHの許可を最優先で確認する

VPSやクラウドサーバーをリモートで操作している場合、SSHの許可設定は最優先で確認する必要があります。

SSHを22番で使っているなら、nftablesでは次のようなルールが必要です。

nft add rule inet filter input tcp dport 22 accept

SSHポートを変更しているなら、そのポート番号を許可します。

nft add rule inet filter input tcp dport 2222 accept

特に、policy drop を使う場合は、SSH許可ルールを入れ忘れないように注意しましょう。


4. DockerやKubernetesを使っている環境では慎重に確認する

DockerやKubernetesを使っている環境では、ネットワーク周りでiptablesやnftablesが関係することがあります。

そのため、単純にiptablesルールを削除したり、nftablesへ移行したりすると、コンテナ通信やポート公開に影響する可能性があります。

移行する場合は、以下のような観点で確認するとよいです。

  • Dockerのポート公開に影響しないか
  • コンテナ間通信に影響しないか
  • KubernetesのServiceやPod通信に影響しないか
  • NATやMASQUERADE設定が失われないか
  • ホストOS側とコンテナランタイム側の設定が競合しないか

通常のWebサーバーよりも、コンテナ環境の方がネットワーク構成が複雑になりやすいです。


初心者はどちらを覚えるべき?

これからLinuxファイアウォールを学ぶなら、基本的には nftablesを優先するのがおすすめです。

理由は、nftablesがiptables系ツールの後継として位置づけられているからです。(Netfilter)

ただし、iptablesも最低限は読めるようにしておいた方がよいです。

実務では、古いサーバーや既存の運用手順でiptablesが残っていることがあります。

おすすめの学習順は次の通りです。

1. Linuxファイアウォールの基本を理解する
2. INPUT / OUTPUT / FORWARD を理解する
3. iptablesの基本的な読み方を知る
4. nftablesのtable / chain / ruleを学ぶ
5. 新規設定ではnftablesを中心に使う
6. 既存環境ではiptablesとの関係を確認する

重要なのは、コマンドを丸暗記することではありません。

本質的には、次の考え方を理解することが大切です。

どの通信を
どの方向で
どの条件に一致したら
許可するのか、拒否するのか

この考え方は、iptablesでもnftablesでも変わりません。


よく使うコマンド比較まとめ

最後に、よく使うコマンドを比較してまとめます。

やりたいことiptablesnftables
バージョン確認iptables --versionnft --version
ルール確認iptables -L -n -vnft list ruleset
ルール保存iptables-savenft list ruleset > backup.nft
SSH許可iptables -A INPUT -p tcp --dport 22 -j ACCEPTnft add rule inet filter input tcp dport 22 accept
HTTP許可iptables -A INPUT -p tcp --dport 80 -j ACCEPTnft add rule inet filter input tcp dport 80 accept
HTTPS許可iptables -A INPUT -p tcp --dport 443 -j ACCEPTnft add rule inet filter input tcp dport 443 accept
基本拒否iptables -P INPUT DROPpolicy drop

この表を見れば、同じ目的でもコマンドの書き方がかなり違うことが分かります。


まとめ

iptablesとnftablesは、どちらもLinuxのファイアウォール設定に関係する仕組みです。

iptablesは従来から使われてきたツールで、nftablesはその後継として登場した新しい仕組みです。

この記事のポイントをまとめると、次の通りです。

  • iptablesは従来のLinuxファイアウォール管理ツール
  • nftablesはiptables系ツールの後継
  • iptablesでは iptablesip6tables を使う
  • nftablesでは nft コマンドを使う
  • nftablesはIPv4とIPv6をまとめて扱いやすい
  • nftablesはtable / chain / ruleで構造化しやすい
  • setやmapを使うと複数条件を整理しやすい
  • 最近の環境では、iptablesコマンドでも中身がnftablesの場合がある
  • 新しく学ぶならnftablesを優先するのがおすすめ
  • 既存環境を扱うならiptablesの基本も知っておくべき

結論として、新規学習や新しいサーバー構築ではnftablesを優先しつつ、既存環境を読むためにiptablesの知識も持っておくのが現実的です。

Linuxファイアウォールを安全に扱うためには、まず現在の状態を確認することが重要です。

iptables --version
iptables -L -n -v
nft list ruleset

設定を変更する前に、これらのコマンドで現状を確認するところから始めましょう。

コメント

タイトルとURLをコピーしました