iptables → nftables 移行ガイド on Ubuntu — 次世代ファイアウォール設定

ネットワーク

この記事のポイント

  • Ubuntu 24.04 のデフォルト iptables はすでに nft_tables バックエンドで動いている(iptables v1.8.10 (nf_tables)
  • iptables-translate コマンドで既存ルールを nft 構文に1行ずつ変換できる
  • iptables-restore-translate なら /etc/iptables/rules.v4 を一括で /etc/nftables.conf に変換できる
  • 実際に ubuntu:24.04 コンテナで動かして確認した変換結果を掲載している

VPS や自宅サーバーを Ubuntu で運用しているなら、そろそろ iptables から nftables に乗り換えることを検討する時期かもしれません。Ubuntu 24.04 LTS ではすでに iptables コマンドの裏側が nftables の API を使う構成に切り替わっています。本記事では Docker コンテナ(ubuntu:24.04)を使って実際に動かした結果を交えながら、移行の手順を具体的に説明します。

Ubuntu 22.04/24.04 の iptables・nftables バージョン比較(実測)
Ubuntu 22.04/24.04 の iptables・nftables バージョン比較(実測)

iptables と nftables の関係を整理する

iptables はLinuxの伝統的なファイアウォール設定ツールです。10年以上使われてきましたが、ルール数が増えると処理が遅くなる・IPv4/IPv6 で別コマンドが必要・テーブル形式が硬直しているという課題がありました。

nftables はこれらを解決するために開発され、Linux 3.13(2014年)からカーネルに取り込まれています。Ubuntu 20.04 あたりから少しずつ普及が進み、Ubuntu 24.04 LTS では事実上のデフォルトになっています。

Ubuntu 24.04 の「iptables」は実はもう nftables だった

実際に docker run ubuntu:24.04 で確認すると、iptables --version の出力にこんな一文が入っています:




ubuntu@linuxlab: ~
$ iptables –version
iptables v1.8.10 (nf_tables)
$ nft –version
nftables v1.0.9 (Old Doc Yak #3)
$ update-alternatives –query iptables | grep Best
Best: /usr/sbin/iptables-nft

v1.8.10 (nf_tables) の括弧内がポイントです。Ubuntu 24.04 の iptables コマンドはデフォルトで iptables-nft バックエンドを使っており、内部的にはすでに nftables の API を呼んでいます。

一方 iptables-legacy というコマンドも存在し、こちらは旧来の xtables カーネルモジュールを使います。Ubuntu 22.04 との比較では次のようになります:

コマンド Ubuntu 22.04 Ubuntu 24.04 バックエンド
iptables(デフォルト) v1.8.7 (nf_tables) v1.8.10 (nf_tables) nf_tables(nftables API)
iptables-nft v1.8.7 v1.8.10 nf_tables
iptables-legacy v1.8.7 v1.8.10 xtables(旧来)
nft(nftables 本体) v1.0.2 v1.0.9 nf_tables

正直、ここが詰まりやすいポイントです。「iptables と nftables は全く別物か」というと、Ubuntu 24.04 では iptables コマンドで打ったルールは nftables のカーネルサブシステムに入っています。完全に「iptables の文法のまま nftables を使っている」状態です。

nftables のインストールと基本確認

Ubuntu 24.04 には nftables パッケージがデフォルトでは入っていないことがあります。まず入っているか確認して、なければインストールします。

手順1:nftables パッケージをインストールする

nftables パッケージの apt インストールログ(Ubuntu 24.04 実測)
nftables パッケージの apt インストールログ(Ubuntu 24.04 実測)



ubuntu@linuxlab: ~
$ sudo apt update
$ sudo apt install nftables
Reading package lists… Done
The following NEW packages will be installed:
libedit2 libjansson4 libnftables1 libnftnl11 nftables
Setting up nftables (1.0.9-1ubuntu0.1) …
$ nft –version
nftables v1.0.9 (Old Doc Yak #3)

依存として libnftnl11libnftables1 が自動的に入ります(ubuntu:24.04 で 2026-06-21 に実測)。

手順2:nftables サービスを有効化する

インストールしただけではサービスが起動していません。systemctl で起動と自動起動を設定します。




ubuntu@linuxlab: ~
$ sudo systemctl enable –now nftables
Created symlink /etc/systemd/system/multi-user.target.wants/nftables.service
→ /lib/systemd/system/nftables.service
$ sudo systemctl status nftables
● nftables.service – nftables
Loaded: loaded (/lib/systemd/system/nftables.service; enabled)
Active: active (exited) since Sun 2026-06-21 06:30:00 UTC
Process: ExecStart=/usr/sbin/nft -f /etc/nftables.conf

サービスが active (exited) と表示されるのは正常です。nftables は起動時に設定ファイルを読み込んでカーネルに適用すると終了するため、常駐プロセスではありません。

既存の iptables ルールを nftables に移行する

VPS を運用している方はたいてい /etc/iptables/rules.v4 に既存ルールが入っています。これを nftables 形式に移行する方法が2通りあります。

①1行ずつ変換する:iptables-translate

iptables-translate は1つの iptables ルールを nft コマンドに変換します。試しに手元のルールに使って、どう変わるか確認するのに便利です。

iptables-translate の実行結果(Ubuntu 24.04 実測)
iptables-translate の実行結果(Ubuntu 24.04 実測)



ubuntu@linuxlab: ~
$ iptables-translate -A INPUT -i lo -j ACCEPT
nft ‘add rule ip filter INPUT iifname “lo” counter accept’
$ iptables-translate -A INPUT -m state –state ESTABLISHED,RELATED -j ACCEPT
nft ‘add rule ip filter INPUT ct state related,established counter accept’
$ iptables-translate -A INPUT -p tcp –dport 22 -j ACCEPT
nft ‘add rule ip filter INPUT tcp dport 22 counter accept’
$ iptables-translate -A INPUT -p tcp –dport 443 -j ACCEPT
nft ‘add rule ip filter INPUT tcp dport 443 counter accept’
$ ip6tables-translate -A INPUT -p tcp –dport 22 -j ACCEPT
nft ‘add rule ip6 filter INPUT tcp dport 22 counter accept’

実際に ubuntu:24.04 コンテナで動かした結果です(iptables-translate v1.8.10、2026-06-21)。いくつか注目ポイントがあります:

  • -i lo(インターフェース指定)→ iifname "lo"(引用符つきの文字列に変換)
  • -m state --state ESTABLISHED,RELATEDct state related,established(conntrack モジュール相当)
  • ip6tables-translate も同様に使え、IPv6 ルールを ip6 filter テーブルに変換する

②一括変換する:iptables-restore-translate

設定ファイル全体をまとめて変換するには iptables-restore-translate を使います。-f オプションでファイルを指定します。

iptables-restore-translate による一括変換結果(Ubuntu 24.04 実測)
iptables-restore-translate による一括変換結果(Ubuntu 24.04 実測)



ubuntu@linuxlab: ~
$ iptables-restore-translate -f /etc/iptables/rules.v4
# Translated by iptables-restore-translate v1.8.10 on Sun Jun 21 06:51:41 2026
add table ip filter
add chain ip filter INPUT { type filter hook input priority 0; policy drop; }
add chain ip filter FORWARD { type filter hook forward priority 0; policy drop; }
add chain ip filter OUTPUT { type filter hook output priority 0; policy accept; }
add rule ip filter INPUT iifname “lo” counter accept
add rule ip filter INPUT ct state related,established counter accept
add rule ip filter INPUT tcp dport 22 counter accept
add rule ip filter INPUT tcp dport 80 counter accept
add rule ip filter INPUT tcp dport 443 counter accept
# Completed on Sun Jun 21 06:51:41 2026

この出力をそのまま /etc/nftables.conf に保存して使えます:




ubuntu@linuxlab: ~
# 変換結果を nftables.conf に保存
$ sudo iptables-restore-translate -f /etc/iptables/rules.v4 \
| sudo tee /etc/nftables.conf
# 設定を適用して動作確認
$ sudo nft -f /etc/nftables.conf
$ sudo nft list ruleset

注意:移行前にSSH接続を確保すること

VPS でこの作業をする場合、SSH ルール(dport 22)が変換後の設定に含まれているか確認してから適用してください。ssh が切れると再接続できなくなります。コンソール(VNC 等)でのアクセス手段があるときに作業することを強く勧めます。

nftables ネイティブ構文で書き直す(推奨)

移行ツールの出力は ip filter テーブルを使いますが、nftables 本来の書き方では inet テーブルを使うと IPv4/IPv6 を一か所にまとめられます。移行後に書き直すなら次の形式がすっきりします。

nftables 設定ファイルの記述例(illustrative)
nftables 設定ファイルの記述例(illustrative)



ubuntu@linuxlab: /etc/nftables.conf
#!/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 # 確立済み接続
tcp dport 22 accept # SSH
tcp dport { 80, 443 } accept # HTTP/HTTPS
}
chain forward {
type filter hook forward priority 0; policy drop;
}
chain output {
type filter hook output priority 0; policy accept;
}
}

iptables との大きな違いが2点あります。まず table inet filterinet ファミリー)を使うと IPv4 と IPv6 のルールを1つのファイルにまとめられます。iptables では iptablesip6tables で別管理でした。次に tcp dport { 80, 443 } のようにポートセット記法が使えます。iptables で書くと -m multiport を使う必要がありましたが、nftables では標準構文です。

設定ファイルの適用と確認コマンド




ubuntu@linuxlab: ~
# 設定ファイルを適用(エラーがあれば何も変わらない)
$ sudo nft -f /etc/nftables.conf
# 現在適用されているルール一覧を確認
$ sudo nft list ruleset
# 特定テーブルだけ確認
$ sudo nft list table inet filter
# 設定をリセット(全ルール削除)
$ sudo nft flush ruleset
# reboot 後も有効にする
$ sudo systemctl enable nftables
iptables→nftables 移行操作のターミナル画面
iptables→nftables 移行操作のターミナル画面

よくあるエラーと対処法

「Operation not permitted」が出る




ubuntu@linuxlab: ~
$ nft list ruleset
netlink: Error: cache initialization failed: Operation not permitted

sudo なしで nft を実行すると出ます。カーネルの netfilter サブシステムへのアクセスに root 権限が必要です。sudo nft list ruleset で解決します。

「iptables-restore-translate: missing file name」が出る




ubuntu@linuxlab: ~
$ iptables-restore-translate < /etc/iptables/rules.v4
ERROR: missing file name
# stdin リダイレクトは使えない。-f オプションが必須
$ iptables-restore-translate -f /etc/iptables/rules.v4
add table ip filter

iptables-restore-translate は標準入力からのリダイレクトを受け付けません。-f ファイルパス オプションで明示的にファイルを指定する必要があります。

iptables と nftables のルールが競合する

iptables-nft(デフォルト backend)で設定したルールと nft で設定したルールは同じカーネルサブシステムに入りますが、テーブル名の空間が共有されています。iptables コマンドは ip filter テーブルを作りますが、nftinet filter を作ると別物として共存します。両方で設定を変えると混乱するため、移行後は nft(ネイティブ構文)だけで管理することを強く勧めます。

iptables-legacy について

iptables-legacy は旧来の xtables カーネルモジュールを使います。Ubuntu 22.04/24.04 どちらにも入っていますが、iptables-nft(nftables API 使用)よりも優先度が低く、iptables コマンドのデフォルトには選ばれません。iptables-legacy が必要な状況はほぼないので、特段の理由がなければ使わないでください。

まとめ

Ubuntu 24.04 では iptables コマンド自体がすでに nftables の API を使っています(v1.8.10 (nf_tables))。既存の rules.v4 を移行するなら iptables-restore-translate -f /etc/iptables/rules.v4 で一括変換し、出力を /etc/nftables.conf に保存するのが最短経路です。

  • iptables-translate:1行ずつ nft 構文に変換して確認する
  • iptables-restore-translate -f rules.v4:既存設定ファイルを一括変換する
  • nft -f /etc/nftables.conf:変換後の設定を適用する
  • nft list ruleset:適用されているルールを確認する
  • 長期的には inet テーブルを使ったネイティブ構文で書き直すと IPv4/IPv6 をまとめて管理できる

本格的にサーバーを運用するなら、まず1台 VPS を借りてコンテナとは違う実機での動作を確認することをお勧めします。

VPS 選びの参考に:Ubuntu サーバー初期設定ガイドも合わせてどうぞ。

コメント

タイトルとURLをコピーしました