「iptables で設定したルールが効いていない気がする」「RHEL 8 に移行したら nftables という名前を見かけるようになったが、何が変わったのかわからない」——こういった声は、インフラエンジニアや社内 SE から最近よく聞きます。
RHEL / Rocky Linux 8 以降、Ubuntu 20.04 以降の Linux 環境では、nftables(エヌエフテーブルス)が標準のパケットフィルタリングエンジンになっています。iptables は互換レイヤー経由で動くだけで、内部ではすでに nftables が処理していることがほとんどです。
この記事では、nftables の基本概念から実際のルール設定・永続化まで、現場で使えるレベルで解説します。iptables との違い、firewalld との関係、リモート設定中のロックアウト対策まで合わせて確認していきましょう。
nftablesとは?iptablesとの違いを理解する
nftables は Linux カーネル 3.13(2014年リリース)から導入されたパケットフィルタリング・パケット分類フレームワークです。iptables・ip6tables・arptables・ebtables という複数のツールを統合した後継として設計されました。
1. iptables が抱えていた課題
iptables には長年使われてきた実績がある一方、設計上の限界がいくつかありました。
・IPv4/IPv6 が別管理: iptables(IPv4)と ip6tables(IPv6)を別々に管理する必要があり、ルールの整合性を保つのが手間でした。
・動的なルール更新が非効率: iptables はルールを更新するたびにルールセット全体をカーネルに書き直します。ルール数が増えると 1 回の更新コストが大きくなります。
・構文が一貫していない: テーブル・チェーン・ルールの操作コマンドがそれぞれ異なり、学習コストが高い部分がありました。
2. nftables が解決したこと
・IPv4/IPv6 を統一管理: inet ファミリーを使えば、1 つのルールセットで IPv4 と IPv6 を同時に制御できます。
・増分更新に対応: ルールの追加・削除が差分更新で行われるため、大規模なルールセットでも効率よく処理できます。
・構文が統一されている: テーブル・チェーン・ルールの操作が nft コマンド 1 つで完結し、可読性が向上しました。
・セット(集合)機能が標準搭載: IP アドレスや Port の集合を効率よく扱える「セット」という仕組みが組み込まれています。
3. 主要ディストリビューションの移行状況
| ディストリビューション | nftables デフォルト化 | 備考 |
|---|---|---|
| RHEL / Rocky Linux 8 | 8.0(2019年) | firewalld のバックエンドも nftables に切替 |
| Debian 10(Buster) | 2019年 | iptables は nft 互換レイヤー経由 |
| Ubuntu 20.04 LTS | 2020年 | ufw バックエンドも nftables に移行中 |
| CentOS Stream 8以降 | 8系以降 | RHEL に準じる |
既存の iptables コマンドが動く環境でも、裏側では nftables が処理していることが増えています。「iptables で設定したルールと nftables のルールが競合した」というトラブルを避けるためにも、nftables を直接扱う知識は現代のインフラエンジニアに必須です。
nftablesのインストールと動作確認
多くの現代的な Linux ディストリビューションでは nftables が最初からインストールされています。まず現状を確認しましょう。
1. インストール確認とサービス起動
# nftables のバージョン確認 nft --version # サービスの状態確認 systemctl status nftables # サービスが停止している場合は起動・自動起動設定 sudo systemctl start nftables sudo systemctl enable nftables
2. 現在のルールセットを確認する
設定変更の前に、必ず現在の状態を把握しておきましょう。
# 現在のルールセットをすべて表示 sudo nft list ruleset # テーブル一覧のみ表示 sudo nft list tables
何も設定していない初期状態では出力は空のことが多いです。firewalld を有効にしている環境では、firewalld が管理するルールが表示されます。
nftablesの基本構造:3つの階層を理解する
nftables を正しく使うには、テーブル・チェーン・ルールという 3 つの階層構造を理解することが重要です。
テーブル(Table)
テーブルはルールの最上位コンテナです。作成時にアドレスファミリーを指定します。
・ip: IPv4 のみを扱う
・ip6: IPv6 のみを扱う
・inet: IPv4 と IPv6 を統合して扱う(推奨)
・arp: ARP パケットを扱う
・bridge: ブリッジフレームを扱う
チェーン(Chain)
チェーンはテーブル内に作成する処理の連鎖です。フックポイント(パケットが通過するタイミング)とデフォルトポリシーを指定します。
・input: 自分宛てに届いたパケット
・output: 自分が送信するパケット
・forward: 転送するパケット(ルーター用途)
・prerouting: ルーティング判断前(NAT 用途)
・postrouting: ルーティング判断後(NAT 用途)
ルール(Rule)
ルールはチェーン内の個々の判断ロジックです。マッチ条件(送信元 IP、宛先ポートなど)とアクション(accept / drop / reject 等)を組み合わせて記述します。ルールは記述した順番に評価されます。
実践的なルール設定:サーバーを守る基本パターン
実際にサーバーに適用する、安全で実用的な設定例を紹介します。
1. テーブルとチェーンを作成する
# inet ファミリーでテーブルを作成 sudo nft add table inet filter # input チェーン(デフォルトポリシー: drop) sudo nft add chain inet filter input \ '{ type filter hook input priority 0 ; policy drop ; }' # output チェーン(デフォルトポリシー: accept) sudo nft add chain inet filter output \ '{ type filter hook output priority 0 ; policy accept ; }' # forward チェーン(ルーターでない場合は drop) sudo nft add chain inet filter forward \ '{ type filter hook forward priority 0 ; policy drop ; }'
2. 基本的な許可ルールを追加する
# ループバックインターフェースの通信を許可 sudo nft add rule inet filter input iif lo accept # 確立済み・関連セッションを許可(ステートフル制御の基本) sudo nft add rule inet filter input ct state established,related accept # 無効なパケットを破棄 sudo nft add rule inet filter input ct state invalid drop # SSH(ポート 22)を許可 sudo nft add rule inet filter input tcp dport 22 accept # HTTP / HTTPS を許可(Webサーバーの場合) sudo nft add rule inet filter input tcp dport { 80, 443 } accept # ICMPv4(ping など)を許可 sudo nft add rule inet filter input ip protocol icmp accept # ICMPv6 を許可(IPv6 近隣探索に必要) sudo nft add rule inet filter input ip6 nexthdr icmpv6 accept
3. 設定を確認する
# 現在のルールセットを表示 sudo nft list ruleset # 特定のテーブルのみ表示 sudo nft list table inet filter
セキュリティをさらに高める応用設定
基本設定ができたら、より実践的なセキュリティ強化を検討しましょう。
1. SSH への接続元 IP を制限する
SSH は攻撃者が最も狙うポートの一つです。接続元 IP アドレスを絞るだけで、インターネットからのブルートフォース攻撃の大半を防ぐことができます。
# 社内ネットワーク(192.168.1.0/24)からのみ SSH を許可 sudo nft add rule inet filter input \ ip saddr 192.168.1.0/24 tcp dport 22 accept # 上記以外の SSH 接続はすべて拒否 # ※ 必ず上記の許可ルールの後に追加すること sudo nft add rule inet filter input tcp dport 22 drop
2. セット(Set)を使って複数 IP をまとめて管理する
許可 IP が複数ある場合、セットを使うと管理がしやすくなります。
# 許可する IP アドレスのセットを作成 sudo nft add set inet filter allowed_ssh_ips \ '{ type ipv4_addr ; }' # セットに IP を追加 sudo nft add element inet filter allowed_ssh_ips \ '{ 192.168.1.10, 203.0.113.5 }' # セットを参照してルールを作成(@ でセット名を参照) sudo nft add rule inet filter input \ ip saddr @allowed_ssh_ips tcp dport 22 accept
3. レートリミットでブルートフォース攻撃を抑制する
nftables 単体でも接続頻度の制限が可能です。fail2ban との組み合わせも有効ですが、まず nftables レベルで入り口を絞っておくと多層防御になります。
# SSH への新規接続を 1 分間に 5 回までに制限(超過はドロップ) sudo nft add rule inet filter input \ tcp dport 22 ct state new limit rate 5/minute accept
設定の永続化:再起動後もルールを有効にする
コマンドラインで追加したルールは、システムを再起動すると消えてしまいます。永続化のためには設定ファイルへの書き出しと systemd サービスの有効化が必要です。
1. 現在のルールセットをファイルに書き出す
# 現在のルールセットを設定ファイルに保存 sudo nft list ruleset > /etc/nftables.conf # 内容を確認 cat /etc/nftables.conf
2. nftables サービスを有効化する
# 起動時に nftables サービスを自動起動に設定 sudo systemctl enable nftables # 設定ファイルを再読み込みして変更を反映する sudo systemctl restart nftables # または設定ファイルを直接読み込む sudo nft -f /etc/nftables.conf
3. 設定ファイルを直接編集する(推奨)
ルール数が増えてきたら、コマンドで逐一追加するよりも設定ファイルを直接編集する方が管理しやすくなります。以下は実用的なテンプレートです。
#!/usr/sbin/nft -f # 既存のルールセットをすべてクリア flush ruleset table inet filter { chain input { type filter hook input priority 0 ; policy drop ; # ループバック許可 iif lo accept # 確立済み・関連セッション許可 ct state established,related accept # 無効パケット破棄 ct state invalid drop # ICMPv4 許可 ip protocol icmp accept # ICMPv6 許可(IPv6 近隣探索に必要) ip6 nexthdr icmpv6 accept # SSH: 社内ネットワークからのみ許可 ip saddr 192.168.1.0/24 tcp dport 22 accept # HTTP / HTTPS 許可 tcp dport { 80, 443 } accept } chain output { type filter hook output priority 0 ; policy accept ; } chain forward { type filter hook forward priority 0 ; policy drop ; } }
この形式で /etc/nftables.conf を管理することで、変更履歴が残りやすく、レビューもしやすくなります。git で管理すれば変更差分の追跡も簡単です。
中小企業でも今日からできること
「本番環境への適用は不安」という方も、段階を踏んで進める方法があります。
・まず現状把握から始める: sudo nft list ruleset を実行して、現在どのようなルールが適用されているか確認しましょう。firewalld や ufw が管理しているルールも表示されます。
・検証機でテストしてから本番へ: 新しい設定は必ず検証機で試してから本番サーバーに適用する習慣をつけましょう。
・変更前にバックアップを取る: sudo nft list ruleset > /tmp/nftables_backup_$(date +%Y%m%d).conf で現状を記録しておくと、ロールバックが容易になります。
・firewalld との役割分担を決める: RHEL / Rocky Linux 系では firewalld が nftables を管理しています。firewalld を使い続けるなら nftables を直接操作する必要はありませんが、両方を同時に操作すると設定が競合します。どちらを主体にするかを最初に決めておきましょう。
・ログを有効にして可視化する: ドロップされたパケットのログを取ることで、正常なトラフィックまでブロックしていないか確認できます。
# ドロップされたパケットをシステムログに記録する sudo nft add rule inet filter input \ limit rate 10/minute log prefix "nftables-drop: " drop
よくある誤解と注意点
【誤解1】「iptables が動くなら nftables の知識は不要」
iptables の互換レイヤー(iptables-nft)を使えば従来のコマンドは動きますが、内部では nftables に変換して実行しています。nftables と直接書いたルールが競合してトラブルになることがあります。新規構築の場合は最初から nftables ネイティブで書くことを推奨します。
【誤解2】「firewalld を使えば nftables の知識は不要」
firewalld は便利な抽象レイヤーですが、複雑な要件(特定ポートへのレートリミット、高度な NAT 設定など)では直接 nftables を記述する必要が出てきます。「firewalld で設定したはずのルールが想定通り動かない」というトラブルを解決するにも、nftables の知識は必要です。
【注意】ルール追加の順序に気をつける
nftables のルールは記述した順番に評価されます。「先に drop ルールがある状態で accept ルールを後から追加してもパケットが届かない」というミスは現場でよく起きます。ルール一覧を nft list table inet filter で確認しながら設定する習慣をつけましょう。
【注意】リモート設定変更中のロックアウト対策
SSH でサーバーに接続しながら nftables を設定変更する際、ミスによって SSH 接続自体が切れてしまうことがあります。次の「タイムアウト保険」を事前にセットしておくと安全です。
# 5 分後にルールセットを全フラッシュ(保険としてセットしてから作業開始) echo "sudo nft flush ruleset" | at now + 5 minutes # 設定変更後、問題がなければ at ジョブを削除 atq # ジョブ番号を確認 atrm <番号> # ジョブを削除
本記事のまとめ
nftables について要点をまとめます。
| 項目 | ポイント |
|---|---|
| iptables との関係 | nftables は後継。RHEL 8 / Ubuntu 20.04 以降はデフォルト採用 |
| 主なメリット | IPv4/IPv6 統合・構文の統一・セット機能・増分更新による効率化 |
| 基本単位 | テーブル → チェーン → ルールの 3 階層 |
| 推奨ファミリー | inet(IPv4/IPv6 を 1 つのルールセットで管理できる) |
| 永続化の方法 | /etc/nftables.conf に書き出し + systemctl enable nftables |
| firewalld との関係 | firewalld が nftables をバックエンドとして使用。直接操作との競合に注意 |
| SSH 接続元制限 | ip saddr で送信元 IP を絞る。セットを使えば複数 IP も管理しやすい |
nftables は最初こそ iptables と構文が異なり戸惑うかもしれませんが、仕組みを理解すると設定の見通しが良くなり、結果的に管理しやすくなります。特に新規でサーバーを構築する際は、最初から nftables ネイティブで設定することをお勧めします。
Linuxのファイルパーミッションやアクセス制御については、姉妹サイトLinuxMaster.JPでも詳しく解説しています。ファイアウォール設定と合わせてサーバーのセキュリティを体系的に固めたい方はぜひ参考にしてください。
Linuxサーバーのセキュリティ設定、ひとつひとつ正しく積み上げていますか?
nftables や SELinux・auditd など、個別の設定を組み合わせて初めて「守れるサーバー」になります。
正しいセキュリティ知識を体系的に身につけたい方へ、メルマガで実践的なセキュリティ対策ノウハウをお届けしています。
