手当たり次第に書くんだ

飽きっぽいのは本能

Ubuntu 22.04 iptables ホストファイアウォール – nftables 時代の位置づけと設定例

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互換コマンドとしてルールを投入する
ip6tablesIPv6 側のルールを投入する
nft実際の ruleset を確認する
netfilter-persistent再起動後にルールを再適用する

現在の backend を確認する

まず iptables がどの backend を使っているかを確認します。iptables --versionnf_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 -v

IPv6 側も確認する

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-persistentnetfilter-persistent を使います。保存前に別セッションで SSH 接続を維持し、rollback できる状態にしておきます。

sudo DEBIAN_FRONTEND=noninteractive apt-get install -y iptables-persistent
sudo netfilter-persistent save
sudo netfilter-persistent reload

systemd 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.service

rollback 手順を用意する

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 save

conntrack を確認する

-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 --versionupdate-alternativesnft list ruleset を合わせて見れば、どの層でルールを扱っているかを把握できます。

実運用では、INPUT policy、管理元、IPv6、保存方法、rollback を先に決めます。特に DROP policy を適用する作業では、別経路で復旧できる状態を作ってから変更し、再起動後の反映まで確認します。

関連する記事
Ubuntu 22.04 iptables ホストファイアウォール – nftables 時代の位置づけと設定例

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)

トップへ戻る