日常の運用でよく使う 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サーバー向けファイアウォールの構築例
- 設定の保存と永続化(再起動後もルールを保持する方法)
- iptablesからの移行(iptables-translateの活用)
- トラブルシューティングと安全な運用テクニック
- よくある質問(FAQ)
- まとめと関連記事
- 結論:nftablesでファイアウォールを有効化・永続化する最短手順
- nftablesとは?iptablesとの違いとメリット
- nftablesの基本概念(テーブル・チェーン・ルール)
- nftablesの主要コマンド一覧
- 【実践】Webサーバー向けファイアウォールの構築例
- 設定の保存と永続化(再起動後もルールを保持する方法)
- iptablesからの移行(iptables-translateの活用)
- トラブルシューティングと安全な運用テクニック
- よくある質問(FAQ)
- まとめと関連記事
- 関連記事
【実践】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 や ufw、firewalld などが独自のルールを自動挿入する場合があるため、意図しない通信遮断を防ぐ意味でも不要な管理ツールは無効化・整理することが推奨されます。
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 を実行してください。
まとめと関連記事
nftablesはiptablesの後継となる 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 や ufw、firewalld などが独自のルールを自動挿入する場合があるため、意図しない通信遮断を防ぐ意味でも不要な管理ツールは無効化・整理することが推奨されます。
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 を実行してください。
まとめと関連記事
nftablesはiptablesの後継となる Linux 標準のパケットフィルタリング機構。inetファミリーを使うことで IPv4 / IPv6 のルールを一括管理できる。- 設定を永続化するには
/etc/nftables.confに書き出しsystemctl enable --now nftablesを実行する。
Linux サーバーのセキュリティ対策やネットワーク構築の基礎として、ぜひ活用してください。
【関連する技術記事】

コメント