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
nft flush ruleset はすべてのルールを即座に削除する。デフォルトポリシーが DROP のチェーンがあるとパケットがすべて遮断されるため、リモートサーバでの実行は接続状態を確認してから行うこと。
設定の永続化
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 を直接操作するのは細かい制御が必要な場面や学習目的に絞るとよい。