手当たり次第に書くんだ

飽きっぽいのは本能

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

Ubuntu 22.04 でホストファイアウォールを iptables で設定する例です。現在の Ubuntu では iptables コマンドを使っていても、内部的には nftables バックエンドで動作していることがあります。そのため、この記事では iptables を「互換フロントエンド」として使う前提で整理します。

iptables を使う位置づけ

Ubuntu 22.04 では、ホストファイアウォールの選択肢として ufwnftablesiptables があります。新規設計では nftables を直接使う方が筋が良い場面もありますが、既存資産や運用経験を重視する場合は iptables 形式で管理することもあります。

方式位置づけ
ufw簡易的なホストファイアウォール管理。Ubuntu では扱いやすい。
nftables現在の Linux firewall の中核。新規設計では本命。
iptables従来の設定体系。Ubuntu 22.04 では nftables バックエンドで動く場合がある。

前提

この記事の例では、1 NIC のサーバーを想定します。INPUT と FORWARD は DROP、OUTPUT は ACCEPT とし、lo、RELATED / ESTABLISHED、ICMP、管理セグメント、公開ポートだけを許可します。

  • IPv4 / IPv6 の両方を設定する。
  • 管理セグメントからの通信を許可する。
  • 公開サービスは変数で指定する。
  • ルールはチェインに分けて整理する。
  • 設定後に netfilter-persistent で永続化する。

iptables のバックエンド確認

まず、現在の iptables が nftables バックエンドなのか、legacy バックエンドなのかを確認します。

iptables --version
ip6tables --version
update-alternatives --display iptables
update-alternatives --display ip6tables

Ubuntu 22.04 では iptables v1.8.x (nf_tables) のように表示されることがあります。この場合、コマンドは iptables でも内部的には nftables 側で処理されています。

永続化パッケージ

iptables ルールを再起動後も維持するため、iptables-persistent または netfilter-persistent を使用します。

sudo apt update
sudo DEBIAN_FRONTEND=noninteractive apt install -y iptables-persistent netfilter-persistent

設定スクリプト

以下は、IPv4 と IPv6 をまとめて設定するシンプルな例です。管理セグメントと公開ポートは環境に合わせて変更します。

sudo tee /usr/local/sbin/host-firewall.sh <<'EOF'
#!/bin/bash
set -eu

mgmt_ipv4="10.0.0.0/18"
mgmt_ipv6="fd00:0000:0000:0000:0000:0000:0a00:0000/114"
public_port="53"

for cmd in iptables ip6tables; do
    ${cmd} -P INPUT DROP
    ${cmd} -P FORWARD DROP
    ${cmd} -P OUTPUT ACCEPT

    ${cmd} -F
    ${cmd} -X
    ${cmd} -Z

    for table in filter nat mangle; do
        ${cmd} -t ${table} -F || true
        ${cmd} -t ${table} -X || true
        ${cmd} -t ${table} -Z || true
    done

    ${cmd} -N BASIC
    ${cmd} -A BASIC -i lo -j ACCEPT
    ${cmd} -A BASIC -m state --state RELATED,ESTABLISHED -j ACCEPT

    ${cmd} -N ICMP
    case ${cmd} in
        iptables)  ${cmd} -A ICMP -p icmp -j ACCEPT ;;
        ip6tables) ${cmd} -A ICMP -p ipv6-icmp -j ACCEPT ;;
    esac

    ${cmd} -N MGMT
    case ${cmd} in
        iptables)  ${cmd} -A MGMT -s ${mgmt_ipv4} -j ACCEPT ;;
        ip6tables) ${cmd} -A MGMT -s ${mgmt_ipv6} -j ACCEPT ;;
    esac

    ${cmd} -N PUBLIC
    for proto in tcp udp; do
        ${cmd} -A PUBLIC -m state --state NEW -m multiport -p ${proto} --dports ${public_port} -j ACCEPT
    done

    for chain in BASIC ICMP MGMT PUBLIC; do
        ${cmd} -A INPUT -j ${chain}
    done

    ${cmd} -A INPUT -j LOG
    ${cmd} -A INPUT -j DROP
done

netfilter-persistent save
EOF

sudo chmod 0755 /usr/local/sbin/host-firewall.sh

適用

SSH 接続中に firewall を変更する場合は、管理セグメントの許可条件を間違えると接続できなくなります。可能であればコンソール接続を確保してから実行します。

sudo /usr/local/sbin/host-firewall.sh
sudo netfilter-persistent reload

確認

sudo iptables -S
sudo ip6tables -S
sudo iptables -L -n -v
sudo ip6tables -L -n -v
sudo systemctl status netfilter-persistent --no-pager

設計上の注意

  • SSH を許可する場合は、公開ポートに含めるのではなく管理セグメントで許可する方が安全。
  • DNS のように TCP / UDP の両方を使うサービスは、両方を許可する必要がある。
  • ICMP / IPv6 ICMP を雑に落とすと、経路 MTU や IPv6 の基本動作に影響する。
  • Docker や Kubernetes を使うホストでは、コンテナランタイムが iptables / nftables ルールを追加するため、単純な初期化スクリプトと相性が悪い場合がある。
  • 本格的な新規設計では nftables への移行も検討する。

iptables と nftables の関係

Ubuntu 22.04 で iptables コマンドを使っていても、内部的には nftables で処理されている場合があります。このため、トラブルシューティングでは iptables -S だけでなく、必要に応じて nft list ruleset も確認します。

sudo nft list ruleset | less

ただし、iptables と nftables を混在して手動管理すると、ルールの見通しが悪くなります。運用では、どちらを正本として管理するのかを決めておくべきです。

まとめ

Ubuntu 22.04 でも iptables によるホストファイアウォール設定は可能です。ただし、現在の Linux firewall は nftables へ移行しており、iptables は互換フロントエンドとして扱われる場面が増えています。

既存運用やスクリプト資産を活かすなら iptables 形式でもよいですが、新規設計では nftables や ufw との関係を整理し、どの設定を正本にするのかを明確にしておくことが重要です。

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

コメントを残す

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

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

トップへ戻る