UFWでファイアウォールを設定する【iptablesからの移行】

※本ページには広告(アフィリエイトプログラム等)が含まれます。

VPSを借りて最初に触るファイアウォールとしては、生のiptablesよりufw(Uncomplicated Firewall)のほうが圧倒的に取り回しやすい。ルールの記述量が少なく、typoによる設定ミスも起きにくい。この記事ではDebian環境でのUFWの基本設定を、実際に使うコマンド中心にまとめる。

UFWとは何か

UFWはiptables(実際にはDebian 12/13では内部的にnftablesバックエンドを使うことが多い)の薄いフロントエンドで、複雑なチェーンやテーブルの概念を意識せずに「このポートを許可/拒否」という直感的な書き方でルールを組める。生のiptablesコマンドを直接叩くと、ルールの順序やデフォルトポリシーの組み合わせでハマりやすいが、UFWなら基本操作は数個のコマンドで完結する。個人運用のVPSでは正直これで十分だと思う。

インストール

さくらのVPSのDebianイメージには標準で入っていないことが多いので、まずインストールする。

sudo apt update
sudo apt install ufw -y

デフォルトポリシーを決める

最初にやるべきは、受信(incoming)と送信(outgoing)のデフォルト方針を決めることだ。定石は「受信は拒否、送信は許可」。

sudo ufw default deny incoming
sudo ufw default allow outgoing

この状態で必要なポートだけを個別に allow していく方式が、後から見て何が開いているか分かりやすい。

必要なポートを許可する

SSH・HTTP・HTTPSは大抵のWebサーバーで必須になる。

sudo ufw allow 22/tcp
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp

サービス名でも指定できる(/etc/servicesを参照する)。

sudo ufw allow ssh
sudo ufw allow http
sudo ufw allow https

SSHのポートを22番から変更している場合は、変更後のポート番号で許可する。例えば10022番に変更しているなら以下のようになる。

sudo ufw allow 10022/tcp

管理画面やDB管理ツールなど、特定のIPからしかアクセスさせたくないポートは from で送信元を絞れる。

sudo ufw allow from 203.0.113.5 to any port 22

これは自宅やオフィスの固定グローバルIPが分かっている場合に有効な手段。ただしIPが動的に変わる回線だと逆にロックアウトの原因になるので、環境による。

SSHへのブルートフォース対策

SSHポートを開けておくと、ボットによる総当たりログイン試行が絶えず飛んでくる。allowの代わりにlimitを使うと、短時間に同一IPから繰り返し接続があった場合に自動でブロックしてくれる。

sudo ufw limit ssh

具体的には30秒間に6回以上の接続があったIPを一時的に拒否する動作になる。fail2banほど柔軟ではないが、設定1行で入る手軽さが良い。SSHポートを変更している場合はポート番号で指定する。

sudo ufw limit 10022/tcp

有効化する(順番に注意)

ルールを設定し終わったら有効化する。

sudo ufw enable

ここが一番重要な注意点。SSHの許可ルールを入れる前にufw enableを実行すると、デフォルトポリシーのdeny incomingが即座に効いてSSH接続そのものが遮断される。リモートのVPSでこれをやると、コンソール(VNC)からログインしてルールを直すしかなくなる。必ずallow ssh(または変更後のポート)を先に設定してからenableする順序を守ること。

状態確認とルール管理

設定したルールの一覧は次で確認できる。

sudo ufw status verbose

ルールに番号を振って表示したい場合は以下。削除するときにこの番号を使う。

sudo ufw status numbered
sudo ufw delete 3

番号ではなくルール内容を直接指定して消すこともできる。

sudo ufw delete allow 80/tcp

ログを有効にする

不正アクセスの試行やブロックされた通信を確認したい場合はログを有効にしておく。

sudo ufw logging on

ログは /var/log/ufw.log に出力される。

sudo tail -f /var/log/ufw.log

ログレベルはlow/medium/high/fullから選べて、ufw logging mediumのように指定する。デフォルトのlowでも拒否されたパケットの記録は十分に取れる。

iptables時代との対比

昔ながらのiptables -A INPUT -p tcp --dport 22 -j ACCEPTのような直書きルールは、チェーンの順序やデフォルトチェーンポリシーの設定を全部自分で管理する必要があり、1行間違えるだけで全ポート遮断や逆に全開放になりかねない。UFWはその複雑さを隠蔽してくれるレイヤーで、内部的には同じnetfilterの仕組み(Debian 12/13ではnftablesバックエンド)を使っているだけなので、パフォーマンス面のデメリットは特にない。生のiptablesルールを細かく制御したい上級者向けの用途を除けば、個人〜小規模運用のVPSではUFWで必要十分というのが実感だ。

まとめ

UFWは「デフォルト拒否 → 必要なポートだけallow → enable」という流れさえ守れば事故りにくい。特にSSHの許可を先に入れてからenableする順番と、ufw limit sshでのブルートフォース対策は最初にやっておく価値が高い。設定後はufw status verboseで定期的に見直す習慣をつけておくと、不要なポートが開きっぱなしになる事故も防げる。

読んで頂いて有り難うございます!