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 とは何か?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
$ 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
#!/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を追加 nft add element inet filter allowed_ssh { 192.168.1.30 } # セットからIPを削除 nft delete element inet filter allowed_ssh { 192.168.1.20 }
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
トラブルシュート・エラー対処
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
3. ルール適用後に SSH 接続が切れた
誤ってデフォルトポリシーを drop に設定してSSHルールを忘れた場合、接続できなくなります。対処法です。# 緊急回避:全ルールをクリアしてデフォルト許可に戻す # (コンソール接続が必要な場合) nft flush ruleset # または systemd サービスを停止 systemctl stop nftables
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日で実務レベルのスキルが身につく【初心者向けハンズオンセミナー】も開催しています。
3,100名以上が実践した「型」を無料で公開中
プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
その「型」を図解60Pにまとめた入門マニュアルを、完全無料でプレゼントしています。
登録10秒/合わなければ解除3秒 / 詳細はこちら
- 前のページへ:firewall-cmdコマンドでポートを開放・管理する方法|ゾーン・サービス・永続化の使い分け
- この記事の属するカテゴリ:セキュリティへ戻る

無料メルマガで学習を続ける
Linuxの実践スキルをメールで毎週お届け。
登録は1分、解除もいつでも可。
登録無料・いつでも解除できます