nftablesの使い方と基本コマンド解説!iptablesとの違いや設定の保存・永続化まで

コマンドリファレンス

日常の運用でよく使う nft コマンドの実行例一覧です。

確認・一覧表示系コマンド

# 全ルールセットを表示
sudo nft list ruleset

# ハンドル番号(ルール個別の識別ID)付きで全ルールを表示
sudo nft list ruleset -a

# テーブル一覧のみを表示
sudo nft list tables

# 特定テーブル(inet filter)の内容だけを表示
sudo nft list table inet filter

テーブル・チェーンの追加と削除

# inet ファミリーに filter テーブルを作成
sudo nft add table inet filter

# input チェーンを作成(受信パケットを監視、デフォルト拒否)
sudo nft add chain inet filter input '{ type filter hook input priority 0; policy drop; }'

# 特定チェーン内のルールを全削除
sudo nft flush chain inet filter input

# テーブル全体(および全チェーン・ルール)を削除
sudo nft delete table inet filter

# 全ルールセットを一括クリア(初期化)
sudo nft flush ruleset

ルールの追加・挿入・特定削除

# チェーンの末尾にルールを追加(SSH許可)
sudo nft add rule inet filter input tcp dport 22 accept

# チェーンの先頭にルールを挿入
sudo nft insert rule inet filter input tcp dport 22 accept

# ハンドル番号を確認した上で特定のルールを1件削除
sudo nft list ruleset -a
# (出力例: tcp dport 22 accept # handle 4)
sudo nft delete rule inet filter input handle 4
    1. 確認・一覧表示系コマンド
    2. テーブル・チェーンの追加と削除
    3. ルールの追加・挿入・特定削除
  1. 【実践】Webサーバー向けファイアウォールの構築例
    1. 要件定義
    2. 設定コマンドの一括実行
    3. 適用結果の確認
  2. 設定の保存と永続化(再起動後もルールを保持する方法)
    1. 1. 設定ファイルへの書き出し
    2. 2. 設定ファイルの文法チェックと手動ロード
    3. 3. systemdサービスの自動起動有効化
  3. iptablesからの移行(iptables-translateの活用)
    1. 1件ずつのコマンド変換(iptables-translate)
    2. 既存ルールファイルの一括変換(iptables-restore-translate)
  4. トラブルシューティングと安全な運用テクニック
    1. 1. SSH締め出し(ロックアウト)の防止策
    2. 2. パケット破棄のログ出力と確認
    3. 3. リアルタイムパケットトレース(nft monitor trace)
  5. よくある質問(FAQ)
    1. Q1. iptablesとnftablesを同時に使っても大丈夫ですか?
    2. Q2. ルールの順番変更や特定行への挿入はどうすればいいですか?
    3. Q3. 設定ファイルを書き換えたのに反映されません。
  6. まとめと関連記事
  7. 結論:nftablesでファイアウォールを有効化・永続化する最短手順
  8. nftablesとは?iptablesとの違いとメリット
    1. iptablesとnftablesの主要機能比較
    2. UFWやfirewalldとの関係性
  9. nftablesの基本概念(テーブル・チェーン・ルール)
    1. 1. テーブル(Table)
    2. 2. チェーン(Chain)
    3. 3. ルール(Rule)
  10. nftablesの主要コマンド一覧
    1. 確認・一覧表示系コマンド
    2. テーブル・チェーンの追加と削除
    3. ルールの追加・挿入・特定削除
  11. 【実践】Webサーバー向けファイアウォールの構築例
    1. 要件定義
    2. 設定コマンドの一括実行
    3. 適用結果の確認
  12. 設定の保存と永続化(再起動後もルールを保持する方法)
    1. 1. 設定ファイルへの書き出し
    2. 2. 設定ファイルの文法チェックと手動ロード
    3. 3. systemdサービスの自動起動有効化
  13. iptablesからの移行(iptables-translateの活用)
    1. 1件ずつのコマンド変換(iptables-translate)
    2. 既存ルールファイルの一括変換(iptables-restore-translate)
  14. トラブルシューティングと安全な運用テクニック
    1. 1. SSH締め出し(ロックアウト)の防止策
    2. 2. パケット破棄のログ出力と確認
    3. 3. リアルタイムパケットトレース(nft monitor trace)
  15. よくある質問(FAQ)
    1. Q1. iptablesとnftablesを同時に使っても大丈夫ですか?
    2. Q2. ルールの順番変更や特定行への挿入はどうすればいいですか?
    3. Q3. 設定ファイルを書き換えたのに反映されません。
  16. まとめと関連記事
  17. 関連記事

【実践】Webサーバー向けファイアウォールの構築例

実際のWebサーバー運用で求められる標準的なセキュリティ設定(受信拒否+必要な通信のみ許可)を構成してみましょう。

要件定義

  • 外部からの全受信(input)はデフォルトで拒否(drop)
  • 自機からの送信(output)はデフォルトで許可(accept)
  • ループバック通信(lo)を許可
  • 自機から開始した通信の応答(established, related)を許可
  • SSH通信(22/tcp)、HTTP(80/tcp)、HTTPS(443/tcp)を許可
  • PING応答(ICMP / ICMPv6)を許可

設定コマンドの一括実行

# 初期化
sudo nft flush ruleset

# テーブル作成
sudo nft add table inet filter

# チェーン作成
sudo nft add chain inet filter input '{ type filter hook input priority 0; policy drop; }'
sudo nft add chain inet filter forward '{ type filter hook forward priority 0; policy drop; }'
sudo nft add chain inet filter output '{ type filter hook output priority 0; policy accept; }'

# ルール追加
sudo nft add rule inet filter input iifname "lo" accept
sudo nft add rule inet filter input ct state established,related accept
sudo nft add rule inet filter input icmp type echo-request accept
sudo nft add rule inet filter input icmpv6 type { echo-request, nd-neighbor-solicit, nd-router-advert, nd-neighbor-advert } accept
sudo nft add rule inet filter input tcp dport 22 accept
sudo nft add rule inet filter input tcp dport { 80, 443 } accept

適用結果の確認

sudo nft list ruleset を実行すると、以下のように構造化された設定が出力されます。

table inet filter {
	chain input {
		type filter hook input priority filter; policy drop;
		iifname "lo" accept
		ct state established,related accept
		icmp type echo-request accept
		icmpv6 type { echo-request, nd-neighbor-solicit, nd-router-advert, nd-neighbor-advert } accept
		tcp dport 22 accept
		tcp dport { 80, 443 } accept
	}

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

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

設定の保存と永続化(再起動後もルールを保持する方法)

nft コマンドで設定した内容はメモリ上の一時的なものです。サーバーを再起動すると設定が初期化されてしまうため、設定ファイルに書き出し、nftables サービスを有効化する必要があります。

1. 設定ファイルへの書き出し

現在のメモリ上のルールセットを /etc/nftables.conf に保存します。

sudo nft list ruleset | sudo tee /etc/nftables.conf

2. 設定ファイルの文法チェックと手動ロード

設定ファイルを直接編集した場合は、適用前にエラーがないか文法チェック(-c / --check オプション)を行い、適用(-f オプション)します。

# 構文チェック(適用はしない)
sudo nft -c -f /etc/nftables.conf

# 構文に問題がなければファイルを読み込んで反映
sudo nft -f /etc/nftables.conf

3. systemdサービスの自動起動有効化

# 起動時自動実行を有効化&即時起動
sudo systemctl enable --now nftables

# サービスの状態確認
sudo systemctl status nftables

iptablesからの移行(iptables-translateの活用)

既存の iptables ルールがある場合、手動で書き直す代わりに変換ツールを利用するとスムーズに移行できます。

1件ずつのコマンド変換(iptables-translate)

iptables-translate -A INPUT -p tcp --dport 22 -j ACCEPT
# 出力結果: nft add rule ip filter INPUT tcp dport 22 accept

既存ルールファイルの一括変換(iptables-restore-translate)

# 既存の iptables ルールを出力
sudo iptables-save > /tmp/iptables.rules

# nftables 形式に一括変換して表示
sudo iptables-restore-translate -f /tmp/iptables.rules

トラブルシューティングと安全な運用テクニック

1. SSH締め出し(ロックアウト)の防止策

リモート環境で policy drop を設定する際は、現在接続している SSH セッションを切断せずに残した状態で、別ウィンドウ・別端末から新規 SSH 接続ができるか確認してください。

2. パケット破棄のログ出力と確認

拒否(drop)された通信の原因を調べるには、ドロップする直前に log ルールを追加します。

# ログ接頭辞を付けてドロップルールを追加
sudo nft add rule inet filter input log prefix "NFT-DROP: " drop

# カーネルログから検出されたドロップ通信を確認
sudo journalctl -k -g "NFT-DROP"

3. リアルタイムパケットトレース(nft monitor trace)

パケットがどのルールにマッチして処理されたかリアルタイム追跡できます。

# パケットにトレースフラグを付与するルールを一時追加
sudo nft insert rule inet filter input meta nftrace set 1

# リアルタイムでイベントをモニター表示
sudo nft monitor trace

よくある質問(FAQ)

Q1. iptablesとnftablesを同時に使っても大丈夫ですか?

現代の Linux ディストリビューションでは iptables-nft という互換レイヤーが使われており、iptables コマンドを実行しても内部では nftables のルールセットに変換されて評価されます。
ただし、Docker や ufwfirewalld などが独自のルールを自動挿入する場合があるため、意図しない通信遮断を防ぐ意味でも不要な管理ツールは無効化・整理することが推奨されます。

Q2. ルールの順番変更や特定行への挿入はどうすればいいですか?

sudo nft list ruleset -a で各ルールのハンドル番号(# handle X)を確認し、position を指定して挿入します。

# handle 3 の直後にルールを追加
sudo nft add rule inet filter input position 3 tcp dport 80 accept

Q3. 設定ファイルを書き換えたのに反映されません。

/etc/nftables.conf を編集しただけではメモリ上の設定は更新されません。編集後は sudo nft -f /etc/nftables.conf または sudo systemctl restart nftables を実行してください。

まとめと関連記事

  • nftablesiptables の後継となる Linux 標準のパケットフィルタリング機構。
  • inet ファミリーを使うことで IPv4 / IPv6 のルールを一括管理できる。
  • 設定を永続化するには /etc/nftables.conf に書き出し systemctl enable --now nftables を実行する。

Linux サーバーのセキュリティ対策やネットワーク構築の基礎として、ぜひ活用してください。

【関連する技術記事】

nftables は、長年 Linux で利用されてきた iptables に代わる次世代のパケットフィルタリング・ファイアウォールフレームワークです。
RHEL 8/9、Debian 10/11/12、Ubuntu 20.04/22.04/24.04 LTS など、主要な Linux ディストリビューションで標準採用が進んでいます。

nftables の仕組みが分からない」「iptables との違いを知りたい」「設定の永続化方法やコマンド一覧をまとめたい」というサーバー管理者や Bash ユーザーに向けて、本記事では nftables の基本概念からコマンド実行例、永続化、iptables からの移行手順まで分かりやすく解説します。

結論:nftablesでファイアウォールを有効化・永続化する最短手順

まずは、最もよく使われる IPv4/IPv6 共通のファイアウォール構築と、再起動後も設定を維持する永続化の最短手順です。SSH(22番ポート)の許可を忘れずに実行してください。

# 1. メモリ上のルールセットをクリア
sudo nft flush ruleset

# 2. IPv4/IPv6統合テーブル(inet filter)を作成
sudo nft add table inet filter

# 3. 受信(input)および送信(output)チェーンを作成(デフォルトポリシー設定)
sudo nft add chain inet filter input '{ type filter hook input priority 0; policy drop; }'
sudo nft add chain inet filter output '{ type filter hook output priority 0; policy accept; }'

# 4. 必要な通信を許可するルールを追加
sudo nft add rule inet filter input iifname "lo" accept
sudo nft add rule inet filter input ct state established,related accept
sudo nft add rule inet filter input tcp dport 22 accept

# 5. 設定ファイルに保存して自動起動を有効化(永続化)
sudo nft list ruleset | sudo tee /etc/nftables.conf
sudo systemctl enable --now nftables

nftablesとは?iptablesとの違いとメリット

nftables は、Linux カーネルの netfilter サブシステムを操作するための新しいパケット処理ツールです。従来の iptables が抱えていた構造的な複雑さやパフォーマンス問題を解消するために開発されました。

iptablesとnftablesの主要機能比較

項目 iptables nftables
操作コマンド iptables, ip6tables, arptables など分離 nft コマンド1つに統合
プロトコル管理 IPv4とIPv6で別々に設定が必要 inet ファミリーでIPv4/IPv6を括って一括管理可能
ルールの処理方式 パケットごとに順次評価(ルール増加で低速化) バイトコード実行・Set構造による高速検索
ルール更新の安全性 個別変更時にも全テーブルの再ロードが発生しがち アトミック(不可分)なトランザクション更新に対応
構文(シンタックス) フラグ指定(-A, -p, -j)中心で複雑 人間が読みやすい構造化された自然な構文

UFWやfirewalldとの関係性

Ubuntu の ufw や Red Hat 系の firewalld は、パケットフィルタリングをより扱いやすくするためのフロントエンド管理ツールです。
近年の Linux では、これらフロントエンドツールのバックエンドエンジンとしても nftables が利用されています。

詳細なフロントエンド・従来型ツールの操作方法については、以下の既存記事も参照してください。

nftablesの基本概念(テーブル・チェーン・ルール)

nftables のルールセットは、テーブル(Table)チェーン(Chain)ルール(Rule)の3つの階層構造で成り立っています。

1. テーブル(Table)

ルールを格納する最上位のグループ(コンテナ)です。作成時に「アドレスファミリー」を指定します。

  • inet: IPv4とIPv6の両方に適用(最も推奨される設定)
  • ip: IPv4専用
  • ip6: IPv6専用
  • arp / bridge / netdev: Layer 2やネットワークデバイス層の制御用

2. チェーン(Chain)

テーブル内に作成され、どのパケット評価タイミング(フック)で処理を実行するかを指定します。

  • type: チェーンの目的(filter, nat, route など)
  • hook: トラフィックのフックポイント(input: 自機宛受信, output: 自機発送信, forward: 転送, prerouting, postrouting
  • priority: 評価の優先順位(数値が小さいほど高優先)
  • policy: ルールに該当しなかった場合のデフォルト動作(accept または drop

3. ルール(Rule)

チェーン内に定義する「マッチ条件」と「アクション」の組み合わせです。例えば「TCPの22番ポート宛て通信(条件)を許可する(アクション)」といった設定を行います。

nftablesの主要コマンド一覧

日常の運用でよく使う nft コマンドの実行例一覧です。

確認・一覧表示系コマンド

# 全ルールセットを表示
sudo nft list ruleset

# ハンドル番号(ルール個別の識別ID)付きで全ルールを表示
sudo nft list ruleset -a

# テーブル一覧のみを表示
sudo nft list tables

# 特定テーブル(inet filter)の内容だけを表示
sudo nft list table inet filter

テーブル・チェーンの追加と削除

# inet ファミリーに filter テーブルを作成
sudo nft add table inet filter

# input チェーンを作成(受信パケットを監視、デフォルト拒否)
sudo nft add chain inet filter input '{ type filter hook input priority 0; policy drop; }'

# 特定チェーン内のルールを全削除
sudo nft flush chain inet filter input

# テーブル全体(および全チェーン・ルール)を削除
sudo nft delete table inet filter

# 全ルールセットを一括クリア(初期化)
sudo nft flush ruleset

ルールの追加・挿入・特定削除

# チェーンの末尾にルールを追加(SSH許可)
sudo nft add rule inet filter input tcp dport 22 accept

# チェーンの先頭にルールを挿入
sudo nft insert rule inet filter input tcp dport 22 accept

# ハンドル番号を確認した上で特定のルールを1件削除
sudo nft list ruleset -a
# (出力例: tcp dport 22 accept # handle 4)
sudo nft delete rule inet filter input handle 4

【実践】Webサーバー向けファイアウォールの構築例

実際のWebサーバー運用で求められる標準的なセキュリティ設定(受信拒否+必要な通信のみ許可)を構成してみましょう。

要件定義

  • 外部からの全受信(input)はデフォルトで拒否(drop)
  • 自機からの送信(output)はデフォルトで許可(accept)
  • ループバック通信(lo)を許可
  • 自機から開始した通信の応答(established, related)を許可
  • SSH通信(22/tcp)、HTTP(80/tcp)、HTTPS(443/tcp)を許可
  • PING応答(ICMP / ICMPv6)を許可

設定コマンドの一括実行

# 初期化
sudo nft flush ruleset

# テーブル作成
sudo nft add table inet filter

# チェーン作成
sudo nft add chain inet filter input '{ type filter hook input priority 0; policy drop; }'
sudo nft add chain inet filter forward '{ type filter hook forward priority 0; policy drop; }'
sudo nft add chain inet filter output '{ type filter hook output priority 0; policy accept; }'

# ルール追加
sudo nft add rule inet filter input iifname "lo" accept
sudo nft add rule inet filter input ct state established,related accept
sudo nft add rule inet filter input icmp type echo-request accept
sudo nft add rule inet filter input icmpv6 type { echo-request, nd-neighbor-solicit, nd-router-advert, nd-neighbor-advert } accept
sudo nft add rule inet filter input tcp dport 22 accept
sudo nft add rule inet filter input tcp dport { 80, 443 } accept

適用結果の確認

sudo nft list ruleset を実行すると、以下のように構造化された設定が出力されます。

table inet filter {
	chain input {
		type filter hook input priority filter; policy drop;
		iifname "lo" accept
		ct state established,related accept
		icmp type echo-request accept
		icmpv6 type { echo-request, nd-neighbor-solicit, nd-router-advert, nd-neighbor-advert } accept
		tcp dport 22 accept
		tcp dport { 80, 443 } accept
	}

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

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

設定の保存と永続化(再起動後もルールを保持する方法)

nft コマンドで設定した内容はメモリ上の一時的なものです。サーバーを再起動すると設定が初期化されてしまうため、設定ファイルに書き出し、nftables サービスを有効化する必要があります。

1. 設定ファイルへの書き出し

現在のメモリ上のルールセットを /etc/nftables.conf に保存します。

sudo nft list ruleset | sudo tee /etc/nftables.conf

2. 設定ファイルの文法チェックと手動ロード

設定ファイルを直接編集した場合は、適用前にエラーがないか文法チェック(-c / --check オプション)を行い、適用(-f オプション)します。

# 構文チェック(適用はしない)
sudo nft -c -f /etc/nftables.conf

# 構文に問題がなければファイルを読み込んで反映
sudo nft -f /etc/nftables.conf

3. systemdサービスの自動起動有効化

# 起動時自動実行を有効化&即時起動
sudo systemctl enable --now nftables

# サービスの状態確認
sudo systemctl status nftables

iptablesからの移行(iptables-translateの活用)

既存の iptables ルールがある場合、手動で書き直す代わりに変換ツールを利用するとスムーズに移行できます。

1件ずつのコマンド変換(iptables-translate)

iptables-translate -A INPUT -p tcp --dport 22 -j ACCEPT
# 出力結果: nft add rule ip filter INPUT tcp dport 22 accept

既存ルールファイルの一括変換(iptables-restore-translate)

# 既存の iptables ルールを出力
sudo iptables-save > /tmp/iptables.rules

# nftables 形式に一括変換して表示
sudo iptables-restore-translate -f /tmp/iptables.rules

トラブルシューティングと安全な運用テクニック

1. SSH締め出し(ロックアウト)の防止策

リモート環境で policy drop を設定する際は、現在接続している SSH セッションを切断せずに残した状態で、別ウィンドウ・別端末から新規 SSH 接続ができるか確認してください。

2. パケット破棄のログ出力と確認

拒否(drop)された通信の原因を調べるには、ドロップする直前に log ルールを追加します。

# ログ接頭辞を付けてドロップルールを追加
sudo nft add rule inet filter input log prefix "NFT-DROP: " drop

# カーネルログから検出されたドロップ通信を確認
sudo journalctl -k -g "NFT-DROP"

3. リアルタイムパケットトレース(nft monitor trace)

パケットがどのルールにマッチして処理されたかリアルタイム追跡できます。

# パケットにトレースフラグを付与するルールを一時追加
sudo nft insert rule inet filter input meta nftrace set 1

# リアルタイムでイベントをモニター表示
sudo nft monitor trace

よくある質問(FAQ)

Q1. iptablesとnftablesを同時に使っても大丈夫ですか?

現代の Linux ディストリビューションでは iptables-nft という互換レイヤーが使われており、iptables コマンドを実行しても内部では nftables のルールセットに変換されて評価されます。
ただし、Docker や ufwfirewalld などが独自のルールを自動挿入する場合があるため、意図しない通信遮断を防ぐ意味でも不要な管理ツールは無効化・整理することが推奨されます。

Q2. ルールの順番変更や特定行への挿入はどうすればいいですか?

sudo nft list ruleset -a で各ルールのハンドル番号(# handle X)を確認し、position を指定して挿入します。

# handle 3 の直後にルールを追加
sudo nft add rule inet filter input position 3 tcp dport 80 accept

Q3. 設定ファイルを書き換えたのに反映されません。

/etc/nftables.conf を編集しただけではメモリ上の設定は更新されません。編集後は sudo nft -f /etc/nftables.conf または sudo systemctl restart nftables を実行してください。

まとめと関連記事

  • nftablesiptables の後継となる Linux 標準のパケットフィルタリング機構。
  • inet ファミリーを使うことで IPv4 / IPv6 のルールを一括管理できる。
  • 設定を永続化するには /etc/nftables.conf に書き出し systemctl enable --now nftables を実行する。

Linux サーバーのセキュリティ対策やネットワーク構築の基礎として、ぜひ活用してください。

【関連する技術記事】

Bash玄

はじめまして!Bash玄です。

エンジニアとしてシステム運用に携わる中で、手作業の多さに限界を感じ、Bashスクリプトを活用して業務を効率化したのがきっかけで、この道に入りました。「手作業は負け」「スクリプトはシンプルに」をモットーに、誰でも実践できるBashスクリプトの書き方を発信しています。

このサイトでは、Bashの基礎から実践的なスクリプト作成まで、初心者でもわかりやすく解説しています。少しでも「Bashって便利だな」と思ってもらえたら嬉しいです!

# 好きなこと
- シンプルなコードを書くこと
- コマンドラインを快適にカスタマイズすること
- 自動化で時間を生み出すこと

# このサイトを読んでほしい人
- Bashに興味があるけど、何から始めればいいかわからない人
- 定型業務を自動化したい人
- 効率よくターミナルを使いこなしたい人

Bashの世界に一歩踏み出して、一緒に「Bash道」を極めていきましょう!

Bash玄をフォローする

コメント