nftablesコマンドでLinuxのパケットフィルタリングを設定する方法|iptablesとの違いやRHEL9対応も

宮崎智広 この記事の監修:宮崎智広(Linux実務・教育歴20年以上・受講者3,100名超)
HOMELinux技術 リナックスマスター.JP(Linuxマスター.JP)Linuxtipsセキュリティ > nftablesコマンドでLinuxのパケットフィルタリングを設定する方法|iptablesとの違いやRHEL9対応も
「iptables -L を実行したら "WARNING: iptables-legacy tables present" と表示された」「RHEL 9 からは nftables を使うと聞いたが、何が変わったのか分からない」——こうした疑問は、Linux サーバー管理者なら今まさに直面している問題です。

nftables は Linux カーネル 3.13 で導入されたパケットフィルタリングフレームワークで、RHEL 9 / Rocky Linux 9 / Ubuntu 22.04 以降ではデフォルトのファイアウォール基盤として採用されています。firewalld は内部でこの nftables を呼び出しており、直接 nft コマンドを操作することで、より細かいパケット制御が可能になります。

この記事では、nft コマンドの基本的な使い方から、テーブル・チェーン・ルールの構造、iptables からの移行方法、よく使う実務設定パターンまで解説します。実行環境は RHEL 9.4 / Rocky Linux 9 / Ubuntu 24.04 LTS で動作確認済みです。

この記事のポイント

・nft list ruleset で現在の全ルールをまとめて確認できる
・テーブル→チェーン→ルールの3層構造を理解すれば設定がシンプルになる
・/etc/nftables.conf に書いて systemctl enable nftables で永続化する
・iptables-translate コマンドで既存ルールを nftables 形式に変換できる


nftablesコマンドでLinuxのパケットフィルタリングを設定する方法|iptablesとの違いやRHEL9対応も

「このままじゃマズい」と感じていませんか?
参考書を開く気力もない、同年代に取り残される不安——
でも安心してください。プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
図解60P/登録10秒/解除も3秒 / 詳細はこちら

nftables とは何か?iptables との違い

iptables はLinuxの伝統的なパケットフィルタリングツールで、20年以上にわたって使われてきました。しかし「IPv4 と IPv6 でコマンドが分かれている(iptables と ip6tables)」「プロトコル別にコマンドが乱立している(arptables、ebtables)」という問題がありました。

nftables はこれらを1つのフレームワークに統合したものです。nft コマンド1本で IPv4・IPv6・ARP・Ethernet フレームのフィルタリングをすべて扱えます。

主な違いをまとめます。
項目 iptables nftables
IPv4/IPv6 対応 コマンドが分かれる(iptables/ip6tables) nft コマンド1つで両対応
設定の可読性 オプションが多く読みにくい 構造化された構文で読みやすい
パフォーマンス ルール数が増えると低下しやすい セット機能で大量IPでも高速
設定の保存 iptables-save/iptables-restore /etc/nftables.conf に直接記述
RHEL 9 での扱い iptables-legacy として後方互換のみ デフォルトのパケットフィルタ基盤

nftables の3層構造を理解する

nftables の設定を理解するには「テーブル→チェーン→ルール」という3層構造を先に頭に入れておくことが重要です。

テーブル(table):プロトコルファミリーの器。inet(IPv4+IPv6共通)、ip(IPv4専用)、ip6(IPv6専用)などがある
チェーン(chain):フックポイントと優先度を持つルールの集合。input・forward・output などのパケット処理タイミングを指定する
ルール(rule):実際のマッチ条件とアクション(accept・drop・reject)

たとえば「外部からSSHポートのみ受け入れ、それ以外は拒否する」という設定は、1つのテーブルの中に1つのチェーンを作り、そこにルールを並べることで実現します。

基本的な使い方

1. 現在のルールを確認する

まず現在のルールセット全体を確認します。

# 全テーブル・チェーン・ルールを一覧表示 nft list ruleset # 特定テーブルのみ確認 nft list table inet filter # テーブル一覧のみ確認 nft list tables

実際の出力例です(Rocky Linux 9.4 サーバー上で確認):

$ nft list ruleset table inet filter { chain input { type filter hook input priority filter; policy drop; ct state established,related accept iifname "lo" accept tcp dport 22 accept } chain forward { type filter hook forward priority filter; policy drop; } chain output { type filter hook output priority filter; policy accept; } }

type filter hook input priority filter; policy drop; の行が重要です。policy drop はデフォルトで全パケットを拒否することを意味します。後続の rule でマッチしたものだけが通過します。

2. テーブルとチェーンを作成する

新しい設定を一から作る場合の手順です。

# テーブルを作成(inet は IPv4+IPv6 両対応) nft add table inet myfilter # input チェーンを作成(policy drop でデフォルト拒否) nft add chain inet myfilter input '{ type filter hook input priority 0; policy drop; }' # output チェーンを作成(policy accept でデフォルト許可) nft add chain inet myfilter output '{ type filter hook output priority 0; policy accept; }'

3. ルールを追加する

作成したチェーンにルールを追加します。

# 確立済みセッションと関連パケットを許可(必須の設定) nft add rule inet myfilter input ct state established,related accept # ループバックインタフェース(lo)を許可 nft add rule inet myfilter input iifname "lo" accept # SSH(TCP 22番ポート)を許可 nft add rule inet myfilter input tcp dport 22 accept # HTTP/HTTPS を許可 nft add rule inet myfilter input tcp dport { 80, 443 } accept # 特定IPアドレスからのみSSHを許可 nft add rule inet myfilter input ip saddr 192.168.1.0/24 tcp dport 22 accept

複数のポートをまとめて指定する { 80, 443 } の書き方が nftables の便利な機能です。iptables では -m multiport を使う必要がありましたが、nftables では直感的に書けます。

4. ルールを削除・変更する

# 全ルールを確認してハンドル番号を調べる nft list ruleset -a # 出力例(handle XX の番号を使って削除) # table inet myfilter { # chain input { # type filter hook input priority filter; policy drop; # ct state established,related accept # handle 3 # tcp dport 22 accept # handle 5 # } # } # ハンドル番号を指定してルールを削除 nft delete rule inet myfilter input handle 5 # チェーン全体を削除(ルールを先にすべて削除してから実行) nft delete chain inet myfilter input # テーブル全体を削除 nft delete table inet myfilter

設定を永続化する(/etc/nftables.conf)

nft コマンドで追加したルールは再起動すると消えます。永続化するには /etc/nftables.conf を編集して systemd サービスを有効化します。

# 現在のルールセットを設定ファイルに書き出す nft list ruleset > /etc/nftables.conf # nftables サービスを有効化(OS起動時に自動でルールを読み込む) systemctl enable nftables # すぐに設定を反映する systemctl start nftables # または設定ファイルを直接読み込む nft -f /etc/nftables.conf

/etc/nftables.conf の記述例です。

#!/usr/sbin/nft -f # 既存ルールをすべてクリアしてから適用 flush ruleset table inet filter { chain input { type filter hook input priority filter; policy drop; # 確立済みセッションを許可 ct state established,related accept # ループバックを許可 iifname "lo" accept # ICMPを許可(pingなど) ip protocol icmp accept ip6 nexthdr icmpv6 accept # SSH を許可 tcp dport 22 accept # HTTP/HTTPS を許可 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; } }

実務で使う応用設定パターン

1. IPアドレスのセットで一括管理する

許可するIPアドレスが多い場合、セット機能を使うと管理が楽になります。

# ファイルで named set を使った設定例 table inet filter { set allowed_ssh { type ipv4_addr elements = { 192.168.1.10, 192.168.1.20, 10.0.0.0/8 } } chain input { type filter hook input priority filter; policy drop; ct state established,related accept iifname "lo" accept # セットに含まれるIPからのSSHのみ許可 ip saddr @allowed_ssh tcp dport 22 accept } }

セットに後からIPを追加・削除することも可能です。

# セットにIPを追加 nft add element inet filter allowed_ssh { 192.168.1.30 } # セットからIPを削除 nft delete element inet filter allowed_ssh { 192.168.1.20 }

Linux ポート確認の全コマンドも合わせて参照してください。

2. レート制限(ブルートフォース攻撃対策)

# SSH への接続を1分間に5回に制限 table inet filter { chain input { type filter hook input priority filter; policy drop; ct state established,related accept iifname "lo" accept # SSHへの接続試行を1分間5回に制限(ブルートフォース対策) tcp dport 22 ct state new limit rate 5/minute accept tcp dport { 80, 443 } accept } }

3. iptables のルールを nftables 形式に変換する

既存の iptables ルールを移行する場合は、iptables-translate コマンドが便利です。

# 単一ルールの変換例 iptables-translate -A INPUT -p tcp --dport 22 -j ACCEPT # 出力: nft add rule ip filter INPUT tcp dport 22 counter accept # 既存のルールセット全体を変換 iptables-save | iptables-restore-translate -f /etc/nftables.conf # ip6tables のルールも変換 ip6tables-save | ip6tables-restore-translate >> /etc/nftables.conf

Linux DNS 設定の基本を参照しながらサーバー構築を進めている場合は、nftables と合わせて設定することで一貫したセキュリティ構成を作れます。

トラブルシュート・エラー対処

1. 「Error: Could not process rule」が出た時

構文エラーの場合に発生します。-c オプションで構文チェックができます。

# 設定ファイルの構文チェック(実際には適用しない) nft -c -f /etc/nftables.conf # 確認できたら実際に適用 nft -f /etc/nftables.conf

2. firewalld と nftables の競合

RHEL 9 / Rocky Linux 9 では firewalld が nftables を内部で使用しています。firewalld が動いている状態で nft コマンドを直接使うと設定が競合することがあります。

# firewalld の状態確認 systemctl status firewalld # nft を直接使う場合は firewalld を停止する systemctl stop firewalld systemctl disable firewalld # または firewalld 経由で管理する(推奨) firewall-cmd --add-port=80/tcp --permanent firewall-cmd --reload

どちらを使うかは用途によって決まります。GUI や zone ベースの管理が必要なら firewalld、細かいルールを直接制御したい場合は nft コマンドを選んでください。

3. ルール適用後に SSH 接続が切れた

誤ってデフォルトポリシーを drop に設定してSSHルールを忘れた場合、接続できなくなります。対処法です。

# 緊急回避:全ルールをクリアしてデフォルト許可に戻す # (コンソール接続が必要な場合) nft flush ruleset # または systemd サービスを停止 systemctl stop nftables

必ず設定前に別セッションで接続を確保するか、at コマンドで数分後にルールをリセットする復元スクリプトをセットしておきましょう。本番サーバーでは特に重要な習慣です。
Linux ポート確認の全コマンドで現在のポート状態を確認してから作業に入ることをおすすめします。

本記事のまとめ

やりたいこと コマンド
現在のルールを全確認 nft list ruleset
テーブルを作成 nft add table inet テーブル名
チェーンを作成(デフォルト拒否) nft add chain inet テーブル名 input '{ type filter hook input priority 0; policy drop; }'
SSHを許可するルールを追加 nft add rule inet テーブル名 input tcp dport 22 accept
ルールをハンドル番号で削除 nft delete rule inet テーブル名 チェーン名 handle 番号
現在のルールを設定ファイルに保存 nft list ruleset > /etc/nftables.conf
設定ファイルを読み込む nft -f /etc/nftables.conf
iptables ルールを nftables 形式に変換 iptables-translate -A INPUT ...
nftables サービスを自動起動 systemctl enable nftables

nftables の設定を理解しても「本番に適用するのが怖い」と感じていませんか?

パケットフィルタリングは設定ミスでサーバーへの接続が遮断される危険があります。正しい手順と「型」を知っていれば安全に運用できますが、独学では落とし穴に気づきにくいものです。
ネットの切れ端の情報をコピペするだけでなく、現場で通用する安全なLinuxサーバー構築の「型」を体系的に身につけたい方へ、『Linuxサーバー構築入門マニュアル(図解60P)』を完全無料でプレゼントしています。

「独学の時間がもったいない」「プロから直接、現場の技術を最短で学びたい」という本気の方には、2日で実務レベルのスキルが身につく【初心者向けハンズオンセミナー】も開催しています。

無料メルマガで学習を続ける

Linuxの実践スキルをメールで毎週お届け。
登録は1分、解除もいつでも可。

登録無料・いつでも解除できます

暗記不要・1時間後にはサーバーが動く

3,100名以上が実践した「型」を無料で公開中

プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
その「型」を図解60Pにまとめた入門マニュアルを、完全無料でプレゼントしています。

登録10秒/合わなければ解除3秒 / 詳細はこちら

Linux無料マニュアル(図解60P) 名前とメールで30秒登録
宮崎 智広

この記事を書いた人

宮崎 智広(みやざき ともひろ)

株式会社イーネットマーキュリー代表。現役のLinuxサーバー管理者として15年以上の実務経験を持ち、これまでに累計3,100名以上のエンジニアを指導してきたLinux教育のプロフェッショナル。「現場で本当に使える技術」を体系的に伝えることをモットーに、実践型のLinuxセミナーの開催や無料マニュアルの配布を通じてLinux人材の育成に取り組んでいる。

趣味は、キャンプにカメラ、トラウト釣り。好きな食べ物は、ラーメンにお酒。休肝日が作れない、酒量を減らせないのが悩み。最近、ドラマ「フライトエンジェル」を観て涙腺が崩壊しました。