Ubuntu18.04でUFWを使用してファイアウォールを設定する方法
序章
UFW(Uncomplicated Firewall)は、iptables
へのインターフェースであり、ファイアウォールの構成プロセスを簡素化することを目的としています。 iptables
は堅実で柔軟なツールですが、初心者がファイアウォールを適切に構成するために使用する方法を学ぶのは難しい場合があります。 ネットワークの保護を開始しようとしていて、使用するツールがわからない場合は、UFWが適切な選択である可能性があります。
このチュートリアルでは、Ubuntu18.04でUFWを使用してファイアウォールを設定する方法を説明します。
前提条件
このチュートリアルに従うには、次のものが必要です。
sudo
非rootユーザーを持つ1つのUbuntu18.04サーバー。これは、 Ubuntu18.04チュートリアルの初期サーバーセットアップの手順1〜3に従ってセットアップできます。
UFWはデフォルトでUbuntuにインストールされます。 何らかの理由でアンインストールされている場合は、sudo apt install ufw
でインストールできます。
ステップ1—IPv6が有効になっていることを確認する
Ubuntuの最近のバージョンでは、IPv6がデフォルトで有効になっています。 実際には、サーバーに追加されるほとんどのファイアウォールルールにはIPv4バージョンとIPv6バージョンの両方が含まれ、後者はUFWのステータスコマンドの出力内でv6
によって識別されます。 IPv6が有効になっていることを確認するには、/etc/default/ufw
でUFW構成ファイルを確認できます。 nano
またはお好みのコマンドラインエディタを使用して、このファイルを開きます。
- sudo nano /etc/default/ufw
次に、IPV6
の値がyes
に設定されていることを確認します。 次のようになります。
IPV6=yes
ファイルを保存して閉じます。 nano
を使用している場合は、CTRL+X
、Y
、ENTER
の順に入力して確認できます。
このガイドの後のステップでUFWを有効にすると、IPv4とIPv6の両方のファイアウォールルールを書き込むように構成されます。
ステップ2—デフォルトポリシーの設定
UFWを使い始めたばかりの場合は、最初のステップとして、デフォルトのファイアウォールポリシーを確認することをお勧めします。 これらのルールは、他のルールと明示的に一致しないトラフィックの処理方法を制御します。
デフォルトでは、UFWはすべての着信接続を拒否し、すべての発信接続を許可するように設定されています。 つまり、サーバーにアクセスしようとするユーザーは接続できませんが、サーバー内のアプリケーションは外部にアクセスできます。 この一般的なポリシーの例外として、特定のサービスとポートを許可するための追加のルールが含まれています。
このチュートリアルの残りの部分を確実に実行できるようにするために、着信トラフィックと発信トラフィックのUFWデフォルトポリシーを設定します。
デフォルトのUFW着信ポリシーをdeny
に設定するには、次のコマンドを実行します。
- sudo ufw default deny incoming
OutputDefault incoming policy changed to 'deny'
(be sure to update your rules accordingly)
デフォルトのUFW発信ポリシーをallow
に設定するには、次のコマンドを実行します。
- sudo ufw default allow outgoing
OutputDefault outgoing policy changed to 'allow'
(be sure to update your rules accordingly)
これらのコマンドは、デフォルトで着信を拒否し、発信接続を許可するように設定します。 これらのファイアウォールのデフォルトだけでパーソナルコンピュータには十分かもしれませんが、サーバーは通常、外部ユーザーからの着信要求に応答する必要があります。 次にそれを調べます。
ステップ3—SSH接続を許可する
ここでUFWファイアウォールを有効にすると、すべての着信接続が拒否されます。 つまり、サーバーでこれらのタイプの要求に応答する場合は、正当な着信接続(SSHまたはHTTP接続など)を明示的に許可するルールを作成する必要があります。 クラウドサーバーを使用している場合は、サーバーに接続して管理できるように、着信SSH接続を許可することをお勧めします。
OpenSSHUFWアプリケーションプロファイルの許可
インストール時に、ネットワーク接続に依存するほとんどのアプリケーションは、UFW内にアプリケーションプロファイルを登録します。これにより、ユーザーはサービスへの外部アクセスをすばやく許可または拒否できます。 次の方法で、現在UFWに登録されているプロファイルを確認できます。
- sudo ufw app list
OutputAvailable applications:
OpenSSH
OpenSSHアプリケーションプロファイルを有効にするには、以下を実行します。
- sudo ufw allow OpenSSH
OutputRule added
Rule added (v6)
これにより、SSHデーモンがデフォルトでリッスンするポートであるポート22
ですべての接続を許可するファイアウォールルールが作成されます。
サービス名によるSSHの許可
着信SSH接続を許可するようにUFWを設定する別の方法は、そのサービス名ssh
を参照することです。
- sudo ufw allow ssh
OutputRule added
Rule added (v6)
UFWは、/etc/services
ファイルに基づいて、サービスが使用するポートとプロトコルを認識しています。
ポート番号によるSSHの許可
または、アプリケーションプロファイルやサービス名の代わりにポートを指定して、同等のルールを作成することもできます。 たとえば、このコマンドは前の例と同じように機能します。
- sudo ufw allow 22
OutputRule added
Rule added (v6)
別のポートを使用するようにSSHデーモンを構成した場合は、適切なポートを指定する必要があります。 たとえば、SSHサーバーがポート2222
でリッスンしている場合、次のコマンドを使用して、そのポートでの接続を許可できます。
- sudo ufw allow 2222
OutputRule added
Rule added (v6)
着信SSH接続を許可するようにファイアウォールが構成されたので、ファイアウォールを有効にできます。
ステップ4—UFWを有効にする
これで、SSH接続を許可するようにファイアウォールを構成する必要があります。 これまでに追加されたルールを確認するには、ファイアウォールがまだ無効になっている場合でも、次を使用できます。
- sudo ufw show added
OutputAdded user rules (see 'ufw status' for running firewall):
ufw allow OpenSSH
着信SSH接続を許可するルールがあることを確認したら、次の方法でファイアウォールを有効にできます。
- sudo ufw enable
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に対してすでにこれを行っています。 次の場合にもこれを行うことができます。
sudo ufw allow http
またはsudo ufw allow 80
を使用して、暗号化されていないWebサーバーが使用するポート80のHTTPsudo ufw allow https
またはsudo ufw allow 443
を使用して、暗号化されたWebサーバーが使用するポート443のHTTPSsudo ufw allow ‘Apache Full’
を使用した、HTTPとHTTPSの両方を備えたApachesudo ufw allow ‘Nginx Full’
を使用して、HTTPとHTTPSの両方を使用するNginx
sudo ufw app list
を使用して、サーバーで使用可能なアプリケーションプロファイルを確認することを忘れないでください。
ポートまたは既知のサービス名を指定する以外に、接続を許可する方法は他にもいくつかあります。 次に、これらのいくつかを見ていきます。
特定のポート範囲
UFWでポート範囲を指定できます。 一部のアプリケーションは、単一のポートではなく、複数のポートを使用します。
たとえば、ポート6000
–6007
を使用するX11接続を許可するには、次のコマンドを使用します。
- sudo ufw allow 6000:6007/tcp
- sudo ufw allow 6000:6007/udp
UFWでポート範囲を指定する場合は、ルールを適用するプロトコル(tcp
またはudp
)を指定する必要があります。 プロトコルを指定しないと自動的に両方のプロトコルが許可されるため、これについては前に説明しませんでした。ほとんどの場合、これで問題ありません。
特定のIPアドレス
UFWを使用する場合、ルール内でIPアドレスを指定することもできます。 たとえば、203.0.113.4
の職場または自宅のIPアドレスなど、特定のIPアドレスからの接続を許可する場合は、from
パラメーターを使用して、次のIPアドレスを指定する必要があります。許可したい:
- sudo ufw allow from 203.0.113.4
OutputRule added
to any port
の後にポート番号を追加して、IPアドレスが接続できるポートを指定することもできます。 たとえば、203.0.113.4
がポート22
(SSH)に接続できるようにする場合は、次のコマンドを使用します。
- sudo ufw allow from 203.0.113.4 to any port 22
OutputRule added
サブネット
IPアドレスのサブネットを許可する場合は、CIDR表記を使用してネットマスクを指定できます。 たとえば、203.0.113.1
から203.0.113.254
の範囲のすべてのIPアドレスを許可する場合は、次のコマンドを使用できます。
- sudo ufw allow from 203.0.113.0/24
OutputRule added
同様に、サブネット203.0.113.0/24
が接続を許可されている宛先ポートを指定することもできます。 ここでも、例としてポート22
(SSH)を使用します。
- sudo ufw allow from 203.0.113.0/24 to any port 22
OutputRule added
特定のネットワークインターフェイスへの接続
特定のネットワークインターフェイスにのみ適用されるファイアウォールルールを作成する場合は、「allow in on」に続けてネットワークインターフェイスの名前を指定することで、作成できます。
続行する前に、ネットワークインターフェイスを検索することをお勧めします。 これを行うには、次のコマンドを使用します。
- ip addr
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
)を許可できます。
- sudo ufw allow in on eth0 to any port 80
OutputRule added
Rule added (v6)
そうすることで、サーバーがパブリックインターネットからHTTPリクエストを受信できるようになります。
または、MySQLデータベースサーバー(ポート3306
)でプライベートネットワークインターフェイスeth1
の接続をリッスンする場合は、次のコマンドを使用できます。
- sudo ufw allow in on eth1 to any port 3306
OutputRule added
Rule added (v6)
これにより、プライベートネットワーク上の他のサーバーがMySQLデータベースに接続できるようになります。
ステップ6—接続を拒否する
着信接続のデフォルトポリシーを変更していない場合、UFWはすべての着信接続を拒否するように設定されています。 一般に、これにより、特定のポートとIPアドレスの通過を明示的に許可するルールを作成する必要があるため、安全なファイアウォールポリシーを作成するプロセスが簡素化されます。
ただし、サーバーがそこから攻撃されていることがわかっている場合など、送信元IPアドレスまたはサブネットに基づいて特定の接続を拒否したい場合があります。 また、デフォルトの着信ポリシーを allow に変更する場合(これは推奨されません)、使用しないサービスまたはIPアドレスに対してdenyルールを作成する必要があります。の接続を許可したい。
deny ルールを作成するには、前述のコマンドを使用して、allowをdenyに置き換えます。
たとえば、HTTP接続を拒否するには、次のコマンドを使用できます。
- sudo ufw deny http
OutputRule added
Rule added (v6)
または、203.0.113.4
からのすべての接続を拒否する場合は、次のコマンドを使用できます。
- sudo ufw deny from 203.0.113.4
OutputRule added
場合によっては、サーバーからの発信接続をブロックすることもできます。 すべてのユーザーがサーバー上のポート(SMTPトラフィック用のポート25
など)を使用できないようにするには、deny out
の後にポート番号を使用します。
- sudo ufw deny out 25
OutputRule added
Rule added (v6)
これにより、サーバー上のすべての送信SMTPトラフィックがブロックされます。
ステップ7—ルールを削除する
ファイアウォールルールを削除する方法を知ることは、それらを作成する方法を知ることと同じくらい重要です。 削除するルールを指定するには、ルール番号または人間が読める形式(ルールが作成されたときに指定された方法と同様)の2つの方法があります。
番号によるUFWルールの削除
UFWルールをその番号で削除するには、最初にすべてのファイアウォールルールの番号付きリストを取得する必要があります。 UFW statusコマンドには、次に示すように、各ルールの横に番号を表示するオプションがあります。
- sudo ufw status numbered
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削除コマンドで指定できます。
- sudo ufw delete 2
OutputDeleting:
allow 80
Proceed with operation (y|n)? y
Rule deleted
これにより、確認のプロンプトが表示され、HTTP接続を許可するルール2が削除されます。 IPv6を有効にしている場合は、対応するIPv6ルールも削除する必要があることに注意してください。
名前によるUFWルールの削除
ルール番号を使用する代わりに、ルールのタイプ(通常はallow
またはdeny
)とサービス名またはポート番号に基づく人間が読める形式でルールを参照することもできます。これがこのルールのターゲット、または使用された場合はアプリケーションプロファイル名でした。 たとえば、以前に有効にされたApache Full
というアプリケーションプロファイルのallow
ルールを削除する場合は、次を使用できます。
- sudo ufw delete allow "Apache Full"
OutputRule deleted
Rule deleted (v6)
delete
コマンドは、名前またはポートによってサービスを参照して作成されたルールに対して同じように機能します。 たとえば、以前にsudo ufw allow http
とのHTTP接続を許可するルールを設定した場合、次のようにしてそのルールを削除できます。
- sudo ufw delete allow http
OutputRule deleted
Rule deleted (v6)
ルールを指定するときにサービス名はポート番号と交換可能であるため、allow http
の代わりに、allow 80
と同じルールを参照することもできます。
- sudo ufw delete allow 80
OutputRule deleted
Rule deleted (v6)
UFWルールを名前で削除する場合、IPv4ルールとIPv6ルールの両方が存在する場合は削除されます。
ステップ8—UFWステータスとルールの確認
次のコマンドを使用して、いつでもUFWのステータスを確認できます。
- sudo ufw status verbose
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
UFWがファイアウォールをどのように構成したかを確認したい場合は、status
コマンドを使用してください。
ステップ9— UFWの無効化またはリセット(オプション)
UFWを使用したくない場合は、次のコマンドで無効にできます。
- sudo ufw disable
OutputFirewall stopped and disabled on system startup
UFWで作成したルールはアクティブではなくなります。 後でアクティブ化する必要がある場合は、いつでもsudo ufw enable
を実行できます。
すでにUFWルールを設定しているが、最初からやり直すことにした場合は、resetコマンドを使用できます。
- sudo ufw reset
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を新たに始めることができます。 いずれかの時点で変更した場合、デフォルトのポリシーは元の設定に変更されないことに注意してください。
結論
これで、ファイアウォールは(少なくとも)SSH接続を許可するように構成されました。 サーバーが機能し、安全になるように、不要な接続を制限しながら、サーバーが必要とするその他の着信接続を必ず許可してください。
より一般的なUFW構成については、 UFW Essentials:Common Firewall Rules andCommandsチュートリアルをご覧ください。