UFWでVPSのファイアウォールを設定する方法
UFWでVPSを安全に保護する手順です。default denyを設定し、必要なポートだけを許可します。SSHを先に許可して接続を失わずに有効化する方法も紹介します。
UFW とは何か、なぜ導入するのか
UFW は Uncomplicated Firewall の略で、その名前どおりのツールです。Linux カーネルに組み込まれたファイアウォールを操作するための使いやすいフロントエンドなので、低レベルのルールを直接記述せず、ufw allow 22/tcp のような短いコマンドを入力できます。新しい VPS では、待ち受けているすべてのサービスに、デフォルトでインターネットからアクセスできます。ファイアウォールを使うと、この状態を逆転させられます。すべてを拒否し、実際に使用する少数のポートだけを許可します。この変更だけで、約 4 個のコマンドにより外部に公開される範囲の大部分を減らせます。UFW は Ubuntu と Debian のツールです。そのため、VPS が Rocky または AlmaLinux で動作している場合は、代わりにルールをゾーンで管理する firewalld を使用します。
設定を変更する前に、何が待ち受けているかを確認してください。ファイアウォールは、待ち受けているサービスへのアクセス可否を決めるためです。ss -tlnp を使って 待ち受け状態を確認することが、最初に行うべき手順です。
自分自身を締め出さないための唯一のルール
ファイアウォールで問題になる典型的なミスは、デフォルト拒否ポリシーで UFW を有効にしたのに、SSH を許可していないことです。ファイアウォールが有効になった瞬間に自分の接続が切断され、再接続できなくなります。これを避けるには、必ず UFW を有効にする前に SSH を許可します。重要なのはこれだけです。以下の手順では、安全な順序で設定します。
それでも発生した場合でも、対処できないわけではありません。プロバイダーの VNC またはシリアル接続による Web コンソールは SSH を経由しないため、そこからログインして ufw disable を実行するか、不足しているルールを追加できます。ファイアウォールによる接続不能には見分ける手掛かりもあります。パケットが破棄されると、タイムアウトするまで SSH クライアントは応答を待ち続けます。一方、SSH デーモンが停止している場合は、接続が直ちに拒否されます。これは、接続拒否と接続タイムアウトの違いです。
手順 1: デフォルトポリシーを設定する
まず、着信をすべて拒否し、発信をすべて許可するように UFW に指示します。
sudo ufw default deny incoming
sudo ufw default allow outgoingdeny incoming が重要です。明示的な許可ルールがないポートは、サービスが待ち受けている場合でも外部から閉じられます。allow outgoing により、更新などのためにサーバーから通常どおりインターネットへ接続できます。この 2 つのコマンドはポリシーだけを変更します。手順 3 で UFW を有効にするまで、設定は適用されません。
手順 2: 実際に必要なポートを許可する
有効化する前に、接続を維持できるよう SSH を開放します。
sudo ufw allow 22/tcpUFW では SSH のレート制限も設定できます。sudo ufw limit 22/tcp はポートを許可しますが、30 秒間に 6 回以上接続したアドレスをブロックします。追加のソフトウェアなしで、ブルートフォース攻撃用のスクリプトによる試行を抑制できます。
Web サーバーを運用する場合は、HTTP と HTTPS も許可します。
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp外部に公開するサービスだけを許可します。5432 番ポートの Postgres のようなデータベースに allow ルールを設定することは、ほとんどありません。代わりに 127.0.0.1 にバインドすると、そのマシン上からのみアクセスできるようになります。開放した各ポートは防御が必要な入口になるため、許可するポートは少数に保ちます。
ここでサーバー用の ufw コマンドをすべて含む一連のコマンドを作成し、順番に実行することもできます。
ステップ 3: 有効化し、稼働を確認する
sudo ufw enable既存の SSH 接続に影響する可能性があるという警告が表示されます。ステップ 2 で 22/tcp を許可しているため、現在のセッションは維持されます。結果を確認します。
sudo ufw status verboseStatus: active
Default: deny (incoming), allow (outgoing)
To Action From
-- ------ ----
22/tcp ALLOW IN Anywhere
22/tcp (v6) ALLOW IN Anywhere (v6)
80/tcp ALLOW IN Anywhereここでは 2 点を確認します。Status: active はファイアウォールが稼働していることを示します。また、すべてのルールが通常の形式と (v6) 付きの形式で 2 回ずつ表示されます。これは、UFW が IPv4 だけでなく IPv6 も対象にしていることを示します。(v6) の行がない場合、IPv6 側が管理されていません。これは別の注意点であり、IPv6 ファイアウォールの記事で説明しています。
後からルールを管理する
番号付きでルールを表示し、不要なルールを削除するには、次を実行します。
sudo ufw status numbered
sudo ufw delete 31 つのアドレスからのみポートへの接続を許可するには、次を実行します。管理サービスを自分の IP アドレスだけに公開する場合に適しています。
sudo ufw allow from 10.0.0.24 to any port 5432 proto tcp自分のアドレスが変わったり、複数のマシンから接続する必要が生じたりすると、この方法は機能しなくなります。通常は、ポートを公開すること自体をやめ、代わりにプライベートネットワーク経由でサービスへ接続します。そのために サーバーのプライベートサブネットを tailnet に広告する を使用します。
ファイアウォールは防御の 1 層です。ポートに到達できる接続を制御しますが、SSH のように開放したポートへ大量の接続を繰り返す相手の通信速度を低下させることはできません。その場合は、SSH の前段に Fail2ban を配置することで、違反を繰り返す接続元を禁止します。多層防御では、各層が他の層で対処できない部分を補います。
ファイアウォールは、ポートとは何か、サービスがどのように待ち受けるかを理解して初めて意味を持ちます。ファイアウォールの設定は、新しい VPS で最初の 10 分間に行う作業の 1 つです。
FAQ
UFW を有効にすると SSH セッションは切断されますか?
先に SSH を許可しておけば、切断されません。sudo ufw allow 22/tcp を sudo ufw enable の前に実行してください。ファイアウォールがポート 22 を許可するため、接続は維持されます。危険なのは、SSH の許可ルールがない状態でデフォルト拒否のファイアウォールを有効にすることです。この場合、接続できなくなります。その場合は、プロバイダーの VNC またはシリアルコンソールからログインし、ufw disable を実行してください。
VPS ではどのポートを開くべきですか?
公開するサービスに必要なポートだけを開きます。サーバーを管理するための SSH(22/tcp)と、Web サイトを運用する場合の HTTP および HTTPS(80/tcp、443/tcp)です。それ以外はすべて拒否したままにします。データベースなどの内部サービスは 127.0.0.1 にバインドし、ファイアウォールルールを設定しないでください。これにより、ネットワークから到達できない状態にします。
UFW は IPv6 に対応していますか?
最新の Ubuntu では対応しています。IPV6=yes は /etc/default/ufw に設定されているため、各ルールが IPv4 と IPv6 の両方に適用されます。また、ufw status では (v6) サフィックス付きの IPv6 ルールが表示されます。想定どおりに動作しない場合の原因については、IPv6 ファイアウォールの落とし穴で説明しています。
UFW ルールを削除するにはどうすればよいですか?
sudo ufw status numbered を実行して、インデックス番号付きのルール一覧を表示します。次に、削除するルールの番号を N に指定して sudo ufw delete N を実行します。仕様を指定して削除することもできます。たとえば sudo ufw delete allow 80/tcp です。
1 つの IP アドレスからだけポートを許可するにはどうすればよいですか?
通常の allow ではなく、from ルールを使用します。オフィスのアドレスからのみ PostgreSQL への接続を許可するには、sudo ufw allow from 10.0.0.10 to any port 5432 proto tcp を実行します。デフォルト拒否ポリシーでは、ルールで許可するまでポートは全員に対して閉じられています。そのため、この from ルールだけが接続経路になります。インターネット全体はブロックされ、指定したアドレスだけが通過できます。通常の allow 5432/tcp も追加しないでください。ポートが全員に開放されます。これは、データベースや管理パネルを公開する場合に最も安全な方法です。sudo ufw status verbose で、ポートの横に表示される送信元アドレスを確認してください。