Ubuntu 22.04 では、iptables コマンドを使っていても、実際の backend は nftables になっている場合があります。そのため、iptables を扱う記事でも、従来の iptables だけを前提にせず、nftables との関係を確認してからルールを決める必要があります。
この記事では、Ubuntu 22.04 のホストファイアウォールを iptables / ip6tables で扱う場合の確認手順、最小限の INPUT ルール、保存、rollback、systemd unit、conntrack の見方をまとめます。新規環境では nftables や UFW を採用する選択肢もあるため、ここでは互換レイヤーを含む運用確認として扱います。
- Ubuntu 22.04 での iptables と nftables backend の関係
- 既存ルールと現在の backend の確認
- INPUT を中心にした最小限のホストファイアウォール例
- IPv6、保存、rollback、systemd unit の扱い
- conntrack と運用時の確認ポイント
書籍
ストーリーで覚える Linux CLI 入門
Linux のコマンドライン操作を基礎から確認したい場合の参考書籍です。価格や在庫はリンク先で確認してください。
Amazon で見るこのリンクは Amazon アソシエイトリンクです。
iptables と nftables の位置づけ
Ubuntu 22.04 の iptables は、環境によって iptables-nft backend を使います。コマンド名は iptables でも、kernel 側のルールセットは nftables として見えるため、トラブル時は両方の視点で確認します。
| 項目 | 確認すること |
iptables | 互換コマンドとしてルールを投入する |
ip6tables | IPv6 側のルールを投入する |
nft | 実際の ruleset を確認する |
netfilter-persistent | 再起動後にルールを再適用する |
現在の backend を確認する
まず iptables がどの backend を使っているかを確認します。iptables --version に nf_tables と出る場合は nftables backend です。
sudo iptables --version
sudo ip6tables --version
sudo update-alternatives --display iptables
sudo nft list ruleset既存ルールを確認する
既存のルールを確認してから作業します。既存サービスがあるサーバーでは、先に現在の状態を保存し、接続元の管理アドレスを確認してから変更します。
sudo iptables -S
sudo iptables -L -n -v
sudo ip6tables -S
sudo ip6tables -L -n -v方針を決める
ホストファイアウォールは、INPUT、FORWARD、OUTPUT の扱いを先に決めます。一般的なサーバーでは、INPUT は必要な通信だけ許可し、OUTPUT は監査方針に応じて決めます。
- 管理用 SSH の送信元を限定する
- 公開サービスのポートを明示する
- loopback と established / related を許可する
- IPv4 と IPv6 を別々に確認する
- rollback 手順を作ってから DROP policy を適用する
最小限の INPUT ルールを試す
次の例は、SSH の送信元を 192.0.2.0/24 に限定し、loopback、確立済み通信、ICMP を許可する最小例です。実際の管理ネットワークと公開ポートに置き換えて使います。
sudo iptables -P INPUT DROP
sudo iptables -P FORWARD DROP
sudo iptables -P OUTPUT ACCEPT
sudo iptables -A INPUT -i lo -j ACCEPT
sudo iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
sudo iptables -A INPUT -p tcp -s 192.0.2.0/24 --dport 22 -j ACCEPT
sudo iptables -A INPUT -p icmp -j ACCEPT
sudo iptables -L -n -vIPv6 側も確認する
IPv6 が有効なサーバーでは、IPv4 だけを制限しても十分ではありません。ip6tables 側でも同じ方針を確認します。IPv6 ICMP は近隣探索や Path MTU Discovery に関係するため、安易に止めないようにします。
sudo ip6tables -P INPUT DROP
sudo ip6tables -P FORWARD DROP
sudo ip6tables -P OUTPUT ACCEPT
sudo ip6tables -A INPUT -i lo -j ACCEPT
sudo ip6tables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
sudo ip6tables -A INPUT -p tcp -s 2001:db8:100::/64 --dport 22 -j ACCEPT
sudo ip6tables -A INPUT -p ipv6-icmp -j ACCEPT
sudo ip6tables -L -n -vルールを保存する
再起動後も同じルールを適用する場合は、iptables-persistent と netfilter-persistent を使います。保存前に別セッションで SSH 接続を維持し、rollback できる状態にしておきます。
sudo DEBIAN_FRONTEND=noninteractive apt-get install -y iptables-persistent
sudo netfilter-persistent save
sudo netfilter-persistent reloadsystemd unit で反映する
ルールの再読み込みを unit として明示したい場合は、netfilter-persistent reload を呼び出す oneshot unit を用意できます。
sudo tee /etc/systemd/system/host-firewall.service >/dev/null <<'EOF'
[Unit]
Description=Apply host firewall rules
Before=network-online.target
Wants=network-online.target
[Service]
Type=oneshot
ExecStart=/usr/sbin/netfilter-persistent reload
RemainAfterExit=yes
[Install]
WantedBy=multi-user.target
EOF
sudo systemctl daemon-reload
sudo systemctl enable --now host-firewall.servicerollback 手順を用意する
DROP policy を扱う作業では、rollback を先に用意します。管理端末から切断された場合に備えて、コンソール、スケジュール実行、別セッションのいずれかで戻せる状態にします。
sudo iptables -P INPUT ACCEPT
sudo iptables -P FORWARD ACCEPT
sudo iptables -F
sudo ip6tables -P INPUT ACCEPT
sudo ip6tables -P FORWARD ACCEPT
sudo ip6tables -F
sudo netfilter-persistent saveconntrack を確認する
-m conntrack --ctstate ESTABLISHED,RELATED を使う場合は、conntrack の状態も確認対象です。通信が想定どおり戻らない場合は、ルールだけでなく conntrack table や関連モジュールも見ます。
sudo lsmod | grep nf_conntrack || true
sudo sysctl net.netfilter.nf_conntrack_count
sudo sysctl net.netfilter.nf_conntrack_max
sudo conntrack -S 2>/dev/null || true運用時に見るポイント
ホストファイアウォールは、設定した瞬間だけでなく、サービス追加、アドレス変更、IPv6 有効化、再起動後の反映で差が出ます。変更後は、ルール、待ち受け、外部からの疎通を組み合わせて確認します。
- SSH の管理元を広く許可しすぎていないか
- IPv6 側に抜け道が残っていないか
- nftables ruleset と iptables 表示に矛盾がないか
- 再起動後に
netfilter-persistentが反映されるか - アプリケーション追加時に必要なポートだけを許可しているか
まとめ
Ubuntu 22.04 で iptables を使う場合は、コマンド名だけで判断せず、nftables backend との関係を確認することが重要です。iptables --version、update-alternatives、nft list ruleset を合わせて見れば、どの層でルールを扱っているかを把握できます。
実運用では、INPUT policy、管理元、IPv6、保存方法、rollback を先に決めます。特に DROP policy を適用する作業では、別経路で復旧できる状態を作ってから変更し、再起動後の反映まで確認します。

