導入
UFW、またはUncomplicated Firewallは、ファイアウォールの構成プロセスを簡素化することを目的としたiptables
のインターフェースです。 iptables
は堅牢で柔軟なツールですが、初心者がファイアウォールを適切に構成する方法を学ぶのは難しい場合があります。 ネットワークのセキュリティを確保し始めたいが、どのツールを使用すべきかわからない場合は、UFWが適切な選択肢になるかもしれません。
このチュートリアルでは、Ubuntu v18.04以降でUFWを使用してファイアウォールを設定する方法を紹介します。
前提条件
Ubuntuバージョン16.04またはそれ以下を使用している場合は、これらのバージョンに対するサポートがUbuntuによって提供されなくなったため、より新しいバージョンにアップグレードすることをお勧めします。 このガイドのコレクションを使用して、Ubuntuバージョンをアップグレードする手順を確認してください。
このチュートリアルに従うには、次のものが必要です:
-
sudo特権を持つ非ルートユーザーとともにUbuntuを実行するサーバー。これらを設定する手順については、このリストからディストリビューションを選択し、初期サーバーセットアップガイドに従ってください。
-
UbuntuにはデフォルトでUFWがインストールされています。何らかの理由でアンインストールされている場合は、
sudo apt install ufw
を使用してインストールできます。
UFWでUbuntuファイアウォールを設定する
- IPv6を有効にする
- デフォルトポリシーを設定する
- SSH接続を許可する
- UFWを有効にする
- その他必要な接続を許可する
- 接続を拒否する
- ファイアウォールルールの削除
- UFWのステータスとルールの確認
- Ubuntuでファイアウォールを無効にする方法
ステップ1 — IPv6が有効であることを確認する
最近のバージョンのUbuntuでは、IPv6がデフォルトで有効になっています。実際には、サーバーに追加されたほとんどのファイアウォールルールにはIPv4とIPv6の両方が含まれます。後者はUFWのステータスコマンドの出力内でv6
で識別されます。IPv6が有効になっていることを確認するには、UFWの設定ファイルである/etc/default/ufw
を確認できます。このファイルをnano
またはお気に入りのコマンドラインエディタで開きます:
次に、IPV6
の値がyes
に設定されていることを確認します。次のように表示されるはずです:
ファイルを保存して閉じます。もしnano
を使用している場合は、CTRL+X
を入力し、次にY
を押して確認します。
このガイドの後の手順でUFWが有効になっている場合、IPv4とIPv6の両方のファイアウォールルールを書き込むように構成されます。
ステップ2 — デフォルトポリシーの設定
UFWを始めたばかりの場合、まずはデフォルトのファイアウォールポリシーを確認するのが良い第一歩です。これらのルールは、明示的に他のルールに一致しないトラフィックの処理方法を制御します。
デフォルトでは、UFWはすべての着信接続を拒否し、すべての送信接続を許可するように設定されています。これは、サーバーに到達しようとする人は接続できない一方で、サーバー内のアプリケーションは外部と通信できることを意味します。特定のサービスやポートを許可する追加のルールは、この一般的なポリシーの例外として含まれています。
このチュートリアルの残りの部分について確実に追跡できるようにするために、今度はUFWのデフォルトの着信および送信トラフィックのポリシーを設定します。
デフォルトのUFW着信ポリシーをdeny
に設定するには、次のコマンドを実行します:
OutputDefault incoming policy changed to 'deny'
(be sure to update your rules accordingly)
デフォルトのUFW送信ポリシーをallow
に設定するには、次のコマンドを実行します:
OutputDefault outgoing policy changed to 'allow'
(be sure to update your rules accordingly)
これらのコマンドは、着信を拒否し、送信を許可するデフォルトを設定します。これらのファイアウォールのデフォルトだけで個人用コンピューターに十分かもしれませんが、通常、サーバーは外部のユーザーからの着信要求に応答する必要があります。次にその方法を見ていきます。
ステップ3 — SSH接続の許可
現時点でUFWファイアウォールを有効にすると、すべての着信接続が拒否されます。これは、SSHやHTTP接続などの正当な着信接続を明示的に許可するルールを作成する必要があることを意味します。たとえば、サーバーがそのようなリクエストに応答する場合、SSH接続またはHTTP接続を許可するルールを作成する必要があります。クラウドサーバーを使用している場合、サーバーに接続して管理するためにSSH接続を許可する必要があるでしょう。
OpenSSH UFWアプリケーションプロファイルの許可
インストール時に、ネットワーク接続に依存するほとんどのアプリケーションは、UFW内にアプリケーションプロファイルを登録します。これにより、ユーザーはサービスへの外部アクセスを素早く許可または拒否できます。現在UFWに登録されているプロファイルを確認するには、次のコマンドを使用します:
OutputAvailable applications:
OpenSSH
OpenSSHアプリケーションプロファイルを有効にするには、次のコマンドを実行します:
OutputRule added
Rule added (v6)
これにより、SSHデーモンがデフォルトでリッスンしているポートであるポート22
上のすべての接続を許可するファイアウォールルールが作成されます。
サービス名によるSSHの許可
UFWを設定して、着信SSH接続を許可する別の方法は、そのサービス名ssh
を参照することです。
OutputRule added
Rule added (v6)
UFWは、/etc/services
ファイルに基づいてサービスが使用するポートとプロトコルを認識しています。
ポート番号によるSSHの許可
また、アプリケーションプロファイルやサービス名の代わりにポートを指定して同等のルールを記述することもできます。たとえば、次のコマンドは前述の例と同じく機能します:
OutputRule added
Rule added (v6)
SSHデーモンを別のポートで使用するように構成した場合は、適切なポートを指定する必要があります。たとえば、SSHサーバーがポート2222
でリッスンしている場合、このコマンドを使用してそのポートでの接続を許可できます:
OutputRule added
Rule added (v6)
ファイアウォールが着信SSH接続を許可するように設定されたので、これを有効にできます。
ステップ4 — UFWの有効化
ファイアウォールは、現在SSH接続を許可するように設定されています。まだファイアウォールが無効の場合でも、これまでに追加されたルールを確認するには、以下を使用できます:
OutputAdded user rules (see 'ufw status' for running firewall):
ufw allow OpenSSH
着信SSH接続を許可するルールがあることを確認した後、ファイアウォールを有効にするには、以下を使用します:
OutputCommand may disrupt existing ssh connections. Proceed with operation (y|n)? y
Firewall is active and enabled on system startup
既存のSSH接続に影響を与える可能性があると警告が表示されます。すでにSSH接続を許可するファイアウォールルールを設定しているため、続行しても問題ありません。プロンプトにy
と入力し、ENTER
キーを押して応答してください。
ファイアウォールは現在アクティブです。ルールを確認するにはsudo ufw status verbose
コマンドを実行してください。このチュートリアルの残りの部分では、UFWの詳細な使用方法について説明します。異なる種類の接続を許可または拒否する方法についても説明します。
ステップ5 — 他の接続を許可する
この時点で、サーバーが応答する必要がある他のすべての接続を許可する必要があります。許可する接続は、特定のニーズに基づきます。アプリケーションプロファイル、サービス名、またはポートに基づいて接続を許可するルールを書く方法はすでに知っています。これは、ポート22
上のSSHに対してすでに行いました。HTTP(ポート80)は、暗号化されていないWebサーバーが使用するものであり、これに対してはsudo ufw allow http
またはsudo ufw allow 80
を使用できます。
- ポート443上のHTTPSは、暗号化されたWebサーバーが使用するものです。
sudo ufw allow https
またはsudo ufw allow 443
を使用します。 - HTTPとHTTPSの両方を備えたApacheを使用する場合、
sudo ufw allow ‘Apache Full’
を使用します。 - HTTPとHTTPSの両方を備えたNginxを使用する場合、
sudo ufw allow ‘Nginx Full’
を使用します。
サーバーで利用可能なアプリケーションプロファイルを確認するには、sudo ufw app list
を使用してください。
ポートや既知のサービス名を指定する以外に、接続を許可する他の方法がいくつかあります。次にいくつかを見てみましょう。
特定のポート範囲
UFWでは、ポート範囲を指定できます。一部のアプリケーションは、単一のポートではなく複数のポートを使用します。
たとえば、ポート6000
〜6007
を使用するX11接続を許可するには、次のコマンドを使用します。
UFWでポート範囲を指定する場合は、適用するプロトコル(tcp
またはudp
)を指定する必要があります。これまで言及していなかったのは、プロトコルを指定しないと自動的に両方のプロトコルが許可されるためですが、ほとんどの場合は問題ありません。
特定のIPアドレス
UFWを使用する際は、ルール内でIPアドレスを指定することもできます。たとえば、特定のIPアドレス(作業用または自宅のIPアドレスなど)からの接続を許可したい場合は、from
パラメーターを使用して、許可するIPアドレスを指定する必要があります:
OutputRule added
IPアドレスが接続を許可されるポートも指定できます。ポート番号の後にto any port
を追加します。たとえば、203.0.113.4
がポート22
(SSH)に接続することを許可したい場合は、次のコマンドを使用します:
OutputRule added
サブネット
IPアドレスのサブネットを許可する場合は、CIDR表記を使用してネットマスクを指定できます。たとえば、203.0.113.1
から203.0.113.254
までのすべてのIPアドレスを許可したい場合は、次のコマンドを使用できます:
OutputRule added
同様に、サブネット203.0.113.0/24
が接続を許可される宛先ポートも指定できます。再び、ポート22
(SSH)を例にします:
OutputRule added
特定のネットワークインターフェースへの接続
特定のネットワークインターフェースにのみ適用されるファイアウォールルールを作成したい場合は、「allow in on」に続いてネットワークインターフェースの名前を指定します。
続行する前にネットワークインターフェースを調べる必要があります。次のコマンドを使用してください:
Output Excerpt2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state
. . .
3: eth1: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default
. . .
ハイライトされた出力はネットワークインターフェースの名前を示しています。通常、それらはeth0
やenp3s2
などの名前が付けられています。
したがって、サーバーにeth0
という名前のパブリックネットワークインターフェースがある場合、次のコマンドでHTTPトラフィック(ポート80
)を許可できます:
OutputRule added
Rule added (v6)
これにより、サーバーがパブリックインターネットからのHTTPリクエストを受信できるようになります。
または、MySQLデータベースサーバー(ポート3306
)がプライベートネットワークインターフェースeth1
で接続を受け付けるようにしたい場合は、次のコマンドを使用できます:
OutputRule added
Rule added (v6)
これにより、プライベートネットワーク上の他のサーバーがMySQLデータベースに接続できるようになります。
ステップ6 — 接続の拒否
デフォルトの受信接続ポリシーを変更していない場合、UFWはすべての受信接続を拒否するように構成されています。一般的には、これにより特定のポートとIPアドレスを明示的に許可するルールを作成する必要があるため、セキュアなファイアウォールポリシーの作成プロセスが簡素化されます。
しかしながら、時々特定の接続を拒否したくなる場合があります。たとえば、ソースIPアドレスまたはサブネットに基づいて、おそらくサーバーがそこから攻撃を受けていることを知っているためです。また、デフォルトの受信ポリシーを許可に変更したい場合(これは推奨されませんが)、接続を許可したくないサービスやIPアドレスに対して拒否ルールを作成する必要があります。
拒否ルールを記述するには、以前に説明したコマンドを使用し、許可を拒否に置き換えます。
たとえば、HTTP接続を拒否する場合、次のコマンドを使用できます:
OutputRule added
Rule added (v6)
または、203.0.113.4
からのすべての接続を拒否したい場合、次のコマンドを使用できます:
OutputRule added
場合によっては、サーバーからの送信接続をブロックしたい場合もあります。サーバー上のポート(たとえばSMTPトラフィックのポート25
)の使用をすべてのユーザーに拒否するには、ポート番号に続いてdeny out
を使用できます:
OutputRule added
Rule added (v6)
これにより、サーバー上のすべての送信SMTPトラフィックがブロックされます。
ステップ7 — ルールの削除
ファイアウォールルールを削除する方法を知ることは、それを作成する方法と同じくらい重要です。削除するルールを指定する方法は、ルール番号または人が読みやすい名前(ルールが作成されたときと同様の方法)で指定できます。
番号でUFWルールを削除する
UFWルールを番号で削除するには、まずファイアウォールルールの番号付きリストを取得する必要があります。 UFWステータスコマンドには、各ルールの横に番号を表示するオプションがあります。以下に示すように:
Numbered Output:Status: active
To Action From
-- ------ ----
[ 1] 22 ALLOW IN 15.15.15.0/24
[ 2] 80 ALLOW IN Anywhere
ポート80(HTTP)接続を許可するルール番号2を削除することを決定した場合、次のようにUFW削除コマンドで指定できます:
OutputDeleting:
allow 80
Proceed with operation (y|n)? y
Rule deleted
これにより、確認が求められ、HTTP接続を許可するルール2が削除されます。 IPv6が有効になっている場合は、対応するIPv6ルールも削除する必要があることに注意してください。
名前でUFWルールを削除する
ルール番号を使用する代わりに、ルールを人間が読み取れる名称で参照することもできます。これは、ルールのタイプ(通常は allow
または deny
)と、このルールの対象となるサービス名またはポート番号、または使用されたアプリケーションプロファイル名に基づきます。たとえば、以前に有効になっていた Apache Full
というアプリケーションプロファイルの allow
ルールを削除したい場合は、次のようにします:
OutputRule deleted
Rule deleted (v6)
delete
コマンドは、サービスを名前やポートで参照して作成されたルールに対して同じように機能します。例えば、以前にsudo ufw allow http
でHTTP接続を許可するルールを設定した場合、次のようにしてそのルールを削除できます:
OutputRule deleted
Rule deleted (v6)
サービス名はルールを指定する際にポート番号と交換可能なため、同じルールをallow 80
ではなくallow http
としても参照できます:
OutputRule deleted
Rule deleted (v6)
名前でUFWルールを削除する際には、IPv4およびIPv6の両方のルールが存在する場合に削除されます。
ステップ8 — UFWのステータスとルールの確認
いつでも、次のコマンドでUFWのステータスを確認できます:
デフォルトでは無効になっている場合、UFWが無効になっていることが表示されます:
OutputStatus: inactive
UFWがアクティブである場合、ステップ3に従った場合は、アクティブであり、設定されているルールが表示されます。例えば、ファイアウォールがどこからでもSSH(ポート22
)接続を許可するように設定されている場合、出力は次のようになります:
OutputStatus: active
Logging: on (low)
Default: deny (incoming), allow (outgoing), disabled (routed)
New profiles: skip
To Action From
-- ------ ----
22/tcp ALLOW IN Anywhere
ファイアウォールの構成を確認したい場合はstatus
コマンドを使用してください。
ステップ9 — ファイアウォールの無効化またはリセット
UFWファイアウォールを使用したくない場合は、次のコマンドで無効にできます:
OutputFirewall stopped and disabled on system startup
UFWで作成したルールは無効になります。後で必要に応じてsudo ufw enable
を実行して有効にすることができます。
すでにUFWルールが構成されているが、最初からやり直したい場合は、リセットコマンドを使用できます:
OutputResetting all rules to installed defaults. This may disrupt existing ssh
connections. Proceed with operation (y|n)? y
Backing up 'user.rules' to '/etc/ufw/user.rules.20210729_170353'
Backing up 'before.rules' to '/etc/ufw/before.rules.20210729_170353'
Backing up 'after.rules' to '/etc/ufw/after.rules.20210729_170353'
Backing up 'user6.rules' to '/etc/ufw/user6.rules.20210729_170353'
Backing up 'before6.rules' to '/etc/ufw/before6.rules.20210729_170353'
Backing up 'after6.rules' to '/etc/ufw/after6.rules.20210729_170353'
これにより、UFWが無効になり、以前に定義されたルールが削除されます。これにより、UFWで新しいスタートができます。ただし、デフォルトのポリシーは、いつでも変更されず、元の設定に戻りません。いつか修正した場合は注意してください。
DigitalOcean App Platformを使用してGitHubからフロントエンドアプリケーションを展開します。DigitalOceanにアプリのスケーリングを任せましょう。
結論
ファイアウォールは、少なくともSSH接続を許可するように構成されました。サーバーが機能し、セキュリティが確保されるよう、サーバーが必要とする他のすべての着信接続を許可し、不必要な接続を制限してください。
UFWの設定についてもっと学ぶには、UFW Essentials: 一般的なファイアウォールのルールとコマンド チュートリアルをチェックしてください。
Source:
https://www.digitalocean.com/community/tutorials/how-to-set-up-a-firewall-with-ufw-on-ubuntu-22-04