📚

初心者向け ufw、iptables、nftablesの設定メモ

に公開

wireguardのVPN構築のときにハマったのでメモとして記録しておきます。

ufw、iptables、nftables はすべて Linux 系 OS での パケットフィルタリング(ファイアウォール) に関するツールですが、使いやすさや抽象度が異なります。順番に整理して解説します。


1. iptables

  • 概要
    Linux の標準的なパケットフィルタリングツール。

  • 仕組み
    カーネルの netfilter 機能を直接操作する。

  • 特徴
    非常に柔軟で強力。
    ルールを直接書く必要があり、複雑になりやすい。

  • コマンド例

# SSHを許可
sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT

# 全ての入力を拒否
sudo iptables -P INPUT DROP
  • 注意

設定はリブートすると消えるので、永続化する必要がある。

一番シンプルに永続化するなら iptables-save と netfilter-persistent を使う方法 が簡単。


  1. iptables-persistent インストール
sudo apt update
sudo apt install iptables-persistent -y

インストール時に 現在のルールを保存するか 聞かれます → 「はい」でOK


  1. 手動で保存(インストール済みの場合)
sudo netfilter-persistent save

これで /etc/iptables/rules.v4 に保存されます

リブートしてもルールが復元されます


  1. 確認
sudo iptables -L

リブート後も 22/tcp が ACCEPT になっていればOK


2. nftables

  • 概要
    iptables の後継として登場した Linux 標準のファイアウォール。

nftables は iptables よりモダンで整理された仕組みになっていて、テーブル (table) と チェイン (chain) が基本構造です。


  • nftables の基本構造

nftables は大きく分けて

テーブル → チェイン → ルール

という階層構造でできています。


  • テーブル (table)

ルールを入れる箱 のようなもの。

プロトコルごとに作ることができる。

種類(ファミリー):

ip(IPv4のみ)

ip6(IPv6のみ)

inet(IPv4とIPv6両方)

arp, bridge, netdev(特殊用途)

通常のサーバー用途なら inet を使うのがベスト。

sudo nft add table inet filter

→ IPv4/IPv6両方を扱える「filter」テーブルを作成。


  • チェイン (chain)

テーブルの中に作る処理の流れ。

iptables の INPUT, OUTPUT, FORWARD のような役割を持つ。

フック (hook) を指定することで、どのタイミングで処理するかを決める。

代表的なフック

input: 外部から自分のサーバーへの通信

output: 自分のサーバーから外へ出る通信

forward: サーバーを経由する通信(ルーター的役割)

prerouting/postrouting: NAT に使う

優先度(priority)も指定できる(0が標準)。

sudo nft add chain inet filter input { type filter hook input priority 0 \; }

→ filter テーブルの中に input チェインを作り、受信パケットを処理。


  • ルール (rule)

チェインの中に並べる具体的な許可・拒否ルール。

sudo nft add rule inet filter input tcp dport 22 accept

→ filter テーブルの input チェインに「SSHを許可」のルールを追加。


  • 全体の流れの例
# テーブル作成
sudo nft add table inet filter

# チェイン作成
sudo nft add chain inet filter input { type filter hook input priority 0 \; }

# ルール追加
sudo nft add rule inet filter input tcp dport 22 accept
sudo nft add rule inet filter input tcp dport 80 accept
sudo nft add rule inet filter input tcp dport 443 accept
sudo nft add rule inet filter input drop   # その他は拒否

# 確認

sudo nft list ruleset

  • まとめイメージ

テーブル (inet filter)
└── チェイン (input)
├── ルール (tcp dport 22 accept)
├── ルール (tcp dport 80 accept)
├── ルール (tcp dport 443 accept)
└── ルール (drop)


nftables では「テーブルを作る → チェインを作る → ルールを入れる」が基本です。


nftables は iptables みたいにルールがリブートで消えるので、永続化するには設定をファイルに保存して再起動時に自動読み込みさせます。


    1. 現在のルールを保存する

まず、今のルールセットを確認して保存します。

sudo nft list ruleset

ファイルに保存

sudo nft list ruleset > /etc/nftables.conf

    1. 永続化の仕組み

nftables は systemd サービスで起動時に /etc/nftables.conf を読み込みます。

有効化

sudo systemctl enable nftables

起動(読み込み)

sudo systemctl start nftables

    1. 保存したいときのシンプルなコマンド

ルールを編集したあと、永続化したいならこれだけでOKです

sudo nft list ruleset > /etc/nftables.conf

    1. 確認

リブート後にルールが復元されているか確認

sudo nft list ruleset

  • まとめ
  1. ルール作成(例:nft add rule ...)

  2. sudo nft list ruleset > /etc/nftables.conf で保存

  3. sudo systemctl enable nftables で自動読み込み有効化


  • 注意

新しいシステムでは iptables より推奨される。

iptables との互換レイヤーもある (iptables-nft など)。


3. ufw (Uncomplicated Firewall)

  • 概要
    Ubuntu 系でよく使われる、iptables/nftables のフロントエンド。

  • 特徴
    コマンドが簡単で初心者向き。
    ルールを簡単に追加・削除できる。
    内部で iptables や nftables を使っている。

  • コマンド例

# SSHを許可
sudo ufw allow 22/tcp

# HTTPを許可
sudo ufw allow 80/tcp

# ufw有効化
sudo ufw enable

# 状態確認
sudo ufw status

それぞれのフィルターまとめ

  • iptables
    上級者・細かい制御 柔軟だが複雑、古い
  • nftables
    上級者・現行推奨
    iptablesよりモダン、構造化されている
  • ufw
    初心者・簡単設定
    内部でiptables/nftablesを使用

自分の環境はどのフィルターを使っているのか

Linux には ファイアウォールエンジン(netfilter/nftables) があって、それを操作するツールが iptables や nft(nftables)、ufw です。

同時に全部が動いているわけではなく
裏で使っているフィルターは1種類 です。


  1. それぞれの関係
  • iptables
    古くからのツール。netfilter を直接操作。

  • nftables
    iptablesの後継。新しいカーネルでは標準。

  • ufw
    単なるフロントエンド。
    裏では iptables か nftables を呼び出している。

Ubuntu 20.04 くらいからは iptables 互換モード(iptables-nft) で nftables を使うことが多いです。


  1. 自分のVPSがどれを使っているか確認する方法

(A) iptables が nftables ベースか確認

sudo update-alternatives --display iptables

出力例:

iptables - auto mode
  link best version is /usr/sbin/iptables-nft
  link currently points to /usr/sbin/iptables-nft

→ iptables-nft なら内部的には nftables を使用。
→ iptables-legacy なら昔ながらの iptables を使用。


(B) nftables が有効かどうか確認

sudo nft list ruleset

ルールが表示されたら nftables が有効

何もなければまだ使っていない


(C) ufw が何を使っているか確認

sudo ufw status verbose

さらに:

ps aux | grep ufw

ufw は内部で iptables または nftables コマンドを呼び出しています。


  1. まとめ

VPSなどで iptables / nftables / ufw が全部同時に動くわけではない。

実際には ufw → iptables互換コマンド → nftablesカーネルAPI という流れが多い。

Ubuntu 22.04 以降なら、ufwを使っていても裏側は nftablesというパターンが多い。

Discussion