この記事のポイント
- 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)を使って実際に動かした結果を交えながら、移行の手順を具体的に説明します。

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 の出力にこんな一文が入っています:
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 パッケージをインストールする

$ 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)
依存として libnftnl11・libnftables1 が自動的に入ります(ubuntu:24.04 で 2026-06-21 に実測)。
手順2:nftables サービスを有効化する
インストールしただけではサービスが起動していません。systemctl で起動と自動起動を設定します。
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 コマンドに変換します。試しに手元のルールに使って、どう変わるか確認するのに便利です。

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,RELATED→ct state related,established(conntrack モジュール相当)ip6tables-translateも同様に使え、IPv6 ルールをip6 filterテーブルに変換する
②一括変換する:iptables-restore-translate
設定ファイル全体をまとめて変換するには iptables-restore-translate を使います。-f オプションでファイルを指定します。

# 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 に保存して使えます:
$ 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 を一か所にまとめられます。移行後に書き直すなら次の形式がすっきりします。

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 filter(inet ファミリー)を使うと IPv4 と IPv6 のルールを1つのファイルにまとめられます。iptables では iptables と ip6tables で別管理でした。次に tcp dport { 80, 443 } のようにポートセット記法が使えます。iptables で書くと -m multiport を使う必要がありましたが、nftables では標準構文です。
設定ファイルの適用と確認コマンド
$ 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

よくあるエラーと対処法
「Operation not permitted」が出る
netlink: Error: cache initialization failed: Operation not permitted
sudo なしで nft を実行すると出ます。カーネルの netfilter サブシステムへのアクセスに root 権限が必要です。sudo nft list ruleset で解決します。
「iptables-restore-translate: missing file name」が出る
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 テーブルを作りますが、nft で inet 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 サーバー初期設定ガイドも合わせてどうぞ。


コメント