Ubuntu 22.04 サーバーで UFW を使ってファイアウォールを設定する方法

Ubuntu 22.04 サーバーでは、UFW(Uncomplicated Firewall)を使って入力および出力のネットワークトラフィックを管理できます。リモートサーバーの場合、ファイアウォールを有効化する前に、現在使用している SSH ポートを許可するようにし、別の端末やコンソールでアクセスを回復できることを確認してください。

開始する前に確認すること

UFWはLinuxのファイアウォールを管理するためのツールです。ファイアウォールでポートが許可されていても、サービスがインストールされており、実行中で、正しいアドレスとポートでリッスンしている場合にのみ接続が可能です。クラウドセキュリティグループや外部ファイアウォールがある場合は、それらのルールも別途確認してください。

稼働中のサーバーで既存のポリシーを任意に変更しないでください。まず、現在のファイアウォールの状態、登録されているルール、必要なサービス、アクセス可能なポートを確認し、SSH切断時でも利用可能なアクセス方法(クラウドコンソールやサーバー管理コンソールなど)を準備してください。コマンドの実行には管理者権限が必要です。

sudo ufw status verbose
sudo ufw show added
sudo ss -lntup

status verbose は、アクティブな UFW ポリシーとルールを表示します。UFW が非アクティブの場合、この画面だけでは登録されているすべてのルールを確認することはできないため、show added も参照してください。ss はリッスン中のソケットを特定するのに役立ちますが、サービスが外部から到達可能かどうかは判断できません。

SSH を許可した後に有効化します

以下は、デフォルトの TCP ポート 22 で SSH を実行している新しいサーバーの例です。ポートが異なる場合は、実際のポートに変更してください。このルールは特定の IP に制限せずにそのポートを許可するため、アクセス範囲が広いことに注意してください。すでにアクティブなサーバーでは、既存のルールと優先順位を先に確認してください。

sudo ufw allow 22/tcp

他の必要なサービスルールとデフォルトポリシーを確認し、ファイアウォールをオンにします。UFWを有効にすると、既存のSSH接続がルールの再適用により中断される場合があります。現在のセッションを維持したまま別の端末から新しいSSH接続をテストし、接続が失敗した場合は、準備しておいたコンソールからルールを修正します。

sudo ufw enable
sudo ufw status verbose

ステータスがactiveで、意図したSSHルールが表示されていることを確認します。その後、許可されたネットワークおよび許可されていないネットワークの両方から、実際に必要なサービスへの接続をテストします。この手順や例外は、Ubuntu 22.04 UFWのリモート管理セクションでも確認できます。

基本ポリシーとポートルール

新しくインストールされた UFW のデフォルト設定では、通常、受信接続は拒否され、送信接続は許可されますが、これはサーバーによって異なる場合があります。実際のポリシーは status verbose で確認してください。例えば、必要なサービスがすべて確認済みの新しいサーバーで、デフォルトで受信接続を拒否したい場合は、次のコマンドを使用できます。すでに運用中のサーバーでは、まずポリシー変更が既存のサービスや接続にどのように影響するかを確認してください。

sudo ufw default deny incoming

外部にウェブサーバーを提供する必要がある場合は、実際に使用されるポートとプロトコルを許可してください。以下は、HTTP および HTTPS の TCP ポートの例であり、ウェブサービスを実行していないサーバーに対してこれらを一律に適用する必要はありません。

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

サーバーがDNSサービスを提供する場合、必要に応じてポート53でUDPおよびTCPを許可できます。例だからといって、DNSサービスを提供していないサーバーのポートを開けないでください。

sudo ufw allow 53/udp
sudo ufw allow 53/tcp

allowは許可ルールを追加し、denyは拒否ルールを追加します。プロトコルが指定されていないポートルールはTCPとUDPの両方に適用される可能性があるため、必要なプロトコルを明確に指定する方がわかりやすいです。ルールの順序は重要で、最初に一致したルールが適用される可能性があるため、既に許可ルールが存在する場合に拒否ルールを追加しても必ずしもアクセスがブロックされるわけではありません。

特定のIPからのみアクセスを許可する

以下は、単一のIPv4アドレスからのみTCPポート22への接続を許可する例です。192.0.2.10は説明用のプレースホルダーアドレスなので、実際の管理者アクセスIPに置き換えてください。また、IPを変更できる場合は、事前に回復方法を準備してください。

sudo ufw allow from 192.0.2.10 to any port 22 proto tcp

このルールを追加しても、すべてのアドレスからポート22を許可するルールが残っている場合、アクセス制限は有効にならない可能性があります。番号付きリストを使用して既存のルールとその順序を確認し、実際に必要なルールのみを残してください。サーバーでIPv6が有効になっている場合、IPv4のみのルールでIPv6アクセスが制限されるとは限りません。IPv6のポリシーとルールも確認してください。

sudo ufw status numbered

ルールの削除とファイアウォールの無効化

正確な内容で追加したルールを削除するには、元のコマンドでdeleteを使用します。例えば、以下のコマンドはUDPポート53を許可するルールを削除します。TCPルールは別です。

sudo ufw delete allow 53/udp

番号で削除することもできますが、1つのルールを削除すると番号が変わります。必ず現在の番号と内容をsudo ufw status numberedで再確認してください。番号による削除は、表示されているIPv4またはIPv6のルール1つのみを削除するので、他のIPバージョンの対応するルールも確認してください。削除後は、再度ステータスを確認し、実際の接続をテストしてください。

ファイアウォールをオフにするには、以下のコマンドを使用します。無効にするとUFWによる保護が解除されるため、他のファイアウォールが存在するからといって安全と考えず、まず影響範囲を確認してください。

sudo ufw disable

ルールが期待どおりに動作しない場合

サービスが稼働しているか、正しいポートとプロトコルが許可されているか、ルールの順序、およびデフォルトポリシーを確認してください。また、クラウドファイアウォール、ルーター、上流ネットワークのルールや、接続に使用されるIPv4およびIPv6アドレスも確認してください。コンテナや個別に管理されたネットワークルールが存在する場合、UFWのステータスリストだけでは全体の動作を判断するのは難しい場合があります。

ルールを実際に変更する前に、--dry-runを使用して変更内容をプレビューすることができます。例えば、以下のコマンドは、TCP 80許可ルールの変更を適用せずに表示します。

sudo ufw --dry-run allow 80/tcp

UFWのステータス画面は主にUFWコマンドで管理されるルールを表示し、システム上のすべてのファイアウォール設定を表すものではありません。追加の説明やコマンド形式については、Ubuntuサーバーのファイアウォールドキュメントを参照してください。