iptables/nftables 入門 - パケットフィルタの基礎

iptables/nftables 入門 - パケットフィルタの基礎

iptables と nftables の違いとは?

iptables は長年 Linux のデファクト標準ファイアウォールだったが、現在は nftables への移行が進んでいる。Ubuntu 22.04 以降はデフォルトで nftables(iptables-nft ラッパー経由)を使用している。既存サーバの保守なら iptables、新規構築なら nftables を選ぶのが基本方針だ。

比較項目 iptables nftables
導入時期 1998年〜 2014年〜(Linux 3.13)
構文 複雑・冗長 統一・簡潔
IPv4/IPv6 別コマンド(ip6tables) 統合(inet ファミリ)
Ubuntu 22.04 iptables-nft ラッパー経由 ネイティブ

Ubuntu 22.04 以降では iptables コマンドを実行しても、内部的には nftables が処理している。update-alternatives --list iptables で現在の実装を確認できる。

iptables の基本構造

iptables のルールは「テーブル → チェーン → ルール」の 3 層構造で管理される。通常のファイアウォール設定は filter テーブルの 3 チェーンで完結する。

filter テーブルの 3 チェーン:

  • INPUT: サーバ宛のパケット(外部 → 自機)
  • OUTPUT: サーバ発のパケット(自機 → 外部)
  • FORWARD: 転送パケット(ルーター構成時のみ使用)

ルールの判定(ターゲット):

  • ACCEPT: パケットを通過させる
  • DROP: 黙って破棄する(送信元に通知なし)
  • REJECT: エラーを返して破棄する

iptables コマンドの基本操作

既存ルールの確認から始めるのが基本。-n で DNS 逆引きをスキップし、-v でパケットカウントも表示する。

ルールの表示

# 全チェーンのルール一覧(詳細)
iptables -L -n -v

# ルール番号付きで表示
iptables -L INPUT -n -v --line-numbers

ルールの追加

# ループバックを許可(必須)
iptables -A INPUT -i lo -j ACCEPT

# 確立済み接続を許可(必須)
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

# SSH(ポート 22)を許可
iptables -A INPUT -p tcp --dport 22 -j ACCEPT

# HTTP/HTTPS を許可
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
iptables -A INPUT -p tcp --dport 443 -j ACCEPT

# それ以外を DROP
iptables -A INPUT -j DROP

ルールの削除・リセット

# 番号指定で削除(--line-numbers で確認後)
iptables -D INPUT 3

# ルール内容を指定して削除(-A を -D に置き換える)
iptables -D INPUT -p tcp --dport 80 -j ACCEPT

# 全チェーンのルールをクリア
iptables -F

# デフォルトポリシーを ACCEPT に戻す
iptables -P INPUT ACCEPT
iptables -P OUTPUT ACCEPT

iptables -F でルールをクリアした後にデフォルトポリシーが DROP のままだと SSH 接続が切断される。リモートサーバで作業する場合は必ずデフォルトポリシーを確認してから実行すること。

nftables の基本構造

nftables は「ファミリ → テーブル → チェーン → ルール」の構造を持つ。iptables と異なり、テーブルとチェーンを自分で作成する必要がある。inet ファミリを使えば IPv4/IPv6 を 1 つのルールセットで管理できる。

# 現在の全ルールを表示
nft list ruleset

# テーブル一覧
nft list tables

# 特定テーブルの詳細表示
nft list table inet filter

nftables コマンドの基本操作

nftables はテーブルとチェーンを先に作成してからルールを追加する。type filter hook input priority 0 が最も一般的なフィルタチェーンの設定だ。

テーブルとチェーンの作成

# テーブル作成
nft add table inet filter

# INPUT チェーン作成(デフォルトポリシー: drop)
nft add chain inet filter input '{ type filter hook input priority 0 ; policy drop ; }'

# OUTPUT チェーン作成(デフォルトポリシー: accept)
nft add chain inet filter output '{ type filter hook output priority 0 ; policy accept ; }'

ルールの追加

# ループバックを許可
nft add rule inet filter input iif lo accept

# 確立済み接続を許可
nft add rule inet filter input ct state established,related accept

# SSH を許可
nft add rule inet filter input tcp dport 22 accept

# HTTP/HTTPS を許可(複数ポートをまとめて指定可能)
nft add rule inet filter input tcp dport '{ 80, 443 }' accept

ルールの削除

# ハンドル番号で削除(-a オプションで番号を確認)
nft list ruleset -a

nft delete rule inet filter input handle 5

全ルールのリセット

# 全ルールをクリア
nft flush ruleset

# テーブルごと削除
nft delete table inet filter

設定の永続化

iptables / nftables のルールはデフォルトで再起動時にリセットされる。サーバ再起動後も設定を維持するには永続化が必要だ。

iptables の永続化(Ubuntu)

# iptables-persistent をインストール
apt install iptables-persistent

# 現在のルールを保存
netfilter-persistent save

# 手動で保存する場合
iptables-save > /etc/iptables/rules.v4
ip6tables-save > /etc/iptables/rules.v6

nftables の永続化(Ubuntu)

# nftables.service を有効化
systemctl enable nftables

# 現在のルールセットをファイルに保存
nft list ruleset > /etc/nftables.conf

# サービスを再起動して動作確認
systemctl restart nftables
systemctl status nftables

/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
        tcp dport { 80, 443 } accept
    }

    chain output {
        type filter hook output priority 0; policy accept;
    }
}

Ubuntu 22.04 では nftables.service がデフォルトで搭載されている。/etc/nftables.conf を編集して systemctl restart nftables で即反映できる。

firewalld / ufw との関係

RHEL / CentOS / Fedora では nftables のフロントエンドとして firewalld が使われている。Ubuntu では ufw(Uncomplicated Firewall)が nftables / iptables のフロントエンドとして提供されており、日常的な管理は ufw が最もシンプルだ。

# ufw の基本操作(Ubuntu)
ufw status verbose
ufw allow 22/tcp
ufw allow 80/tcp
ufw allow 443/tcp
ufw enable
ufw status numbered

Ubuntu での日常的なファイアウォール管理は ufw が最もシンプル。iptables / nftables を直接操作するのは細かい制御が必要な場面や学習目的に絞るとよい。

次に読む