Ubuntu20.04でUFWを使用してファイアウォールを設定する方法
序章
UFW(Uncomplicated Firewall)は、iptables
やnftables
などの低レベルのパケットフィルタリングテクノロジーの複雑さを隠す、簡素化されたファイアウォール管理インターフェイスです。 ネットワークの保護を開始しようとしていて、使用するツールがわからない場合は、UFWが適切な選択である可能性があります。
このチュートリアルでは、Ubuntu20.04でUFWを使用してファイアウォールを設定する方法を説明します。
前提条件
このチュートリアルに従うには、次のものが必要です。
- sudo非rootユーザーを持つ1つのUbuntu20.04サーバー。これは、Ubuntu20.04チュートリアルを使用した初期サーバーセットアップに従ってセットアップできます。
UFWはデフォルトでUbuntuにインストールされます。 何らかの理由でアンインストールされている場合は、sudo apt install ufw
でインストールできます。
ステップ1— UFWでのIPv6の使用(オプション)
このチュートリアルはIPv4を念頭に置いて書かれていますが、IPv6を有効にしている限り、IPv6でも機能します。 UbuntuサーバーでIPv6が有効になっている場合は、IPv4に加えてIPv6のファイアウォールルールを管理できるように、UFWがIPv6をサポートするように構成されていることを確認してください。 これを行うには、nano
またはお気に入りのエディターでUFW構成を開きます。
- sudo nano /etc/default/ufw
次に、IPV6
の値がyes
であることを確認します。 次のようになります。
IPV6=yes
ファイルを保存して閉じます。 これで、UFWを有効にすると、IPv4とIPv6の両方のファイアウォールルールを書き込むように構成されます。 ただし、UFWを有効にする前に、SSH経由で接続できるようにファイアウォールが構成されていることを確認する必要があります。 デフォルトのポリシーの設定から始めましょう。
ステップ2—デフォルトポリシーの設定
ファイアウォールを使い始めたばかりの場合、最初に定義するルールはデフォルトのポリシーです。 これらのルールは、他のルールと明示的に一致しないトラフィックの処理方法を制御します。 デフォルトでは、UFWはすべての着信接続を拒否し、すべての発信接続を許可するように設定されています。 つまり、サーバーにアクセスしようとするユーザーは接続できませんが、サーバー内のアプリケーションは外部にアクセスできます。
UFWルールをデフォルトに戻しましょう。そうすれば、このチュートリアルを確実に実行できるようになります。 UFWで使用されるデフォルトを設定するには、次のコマンドを使用します。
- sudo ufw default deny incoming
- sudo ufw default allow outgoing
これらのコマンドは、着信を拒否し、発信接続を許可するようにデフォルトを設定します。 これらのファイアウォールのデフォルトだけでパーソナルコンピュータには十分かもしれませんが、サーバーは通常、外部ユーザーからの着信要求に応答する必要があります。 次にそれを調べます。
ステップ3—SSH接続を許可する
ここでUFWファイアウォールを有効にすると、すべての着信接続が拒否されます。 これは、サーバーがこれらのタイプの要求に応答するようにする場合、正当な着信接続(SSHまたはHTTP接続など)を明示的に許可するルールを作成する必要があることを意味します。 クラウドサーバーを使用している場合は、サーバーに接続して管理できるように、着信SSH接続を許可することをお勧めします。
着信SSH接続を許可するようにサーバーを構成するには、次のコマンドを使用できます。
- sudo ufw allow ssh
これにより、SSHデーモンがデフォルトでリッスンするポートであるポート22
ですべての接続を許可するファイアウォールルールが作成されます。 UFWは、/etc/services
ファイルにサービスとしてリストされているため、ポートallow ssh
の意味を認識しています。
ただし、実際には、サービス名の代わりにポートを指定することで、同等のルールを記述できます。 たとえば、このコマンドは上記のコマンドと同じように機能します。
- sudo ufw allow 22
別のポートを使用するようにSSHデーモンを構成した場合は、適切なポートを指定する必要があります。 たとえば、SSHサーバーがポート2222
でリッスンしている場合、次のコマンドを使用して、そのポートでの接続を許可できます。
- sudo ufw allow 2222
着信SSH接続を許可するようにファイアウォールが構成されたので、ファイアウォールを有効にできます。
ステップ4—UFWを有効にする
UFWを有効にするには、次のコマンドを使用します。
- sudo ufw enable
コマンドが既存の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のHTTPS
ポートまたは既知のサービスを指定する以外に、他の接続を許可する方法は他にもいくつかあります。
特定のポート範囲
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
to any port
の後にポート番号を追加して、IPアドレスが接続できる特定のポートを指定することもできます。 たとえば、203.0.113.4
がポート22
(SSH)に接続できるようにする場合は、次のコマンドを使用します。
- sudo ufw allow from 203.0.113.4 to any port 22
サブネット
IPアドレスのサブネットを許可する場合は、CIDR表記を使用してネットマスクを指定できます。 たとえば、203.0.113.1
から203.0.113.254
の範囲のすべてのIPアドレスを許可する場合は、次のコマンドを使用できます。
- sudo ufw allow from 203.0.113.0/24
同様に、サブネット203.0.113.0/24
が接続を許可されている宛先ポートを指定することもできます。 ここでも、例としてポート22
(SSH)を使用します。
- sudo ufw allow from 203.0.113.0/24 to any port 22
特定のネットワークインターフェイスへの接続
特定のネットワークインターフェイスにのみ適用されるファイアウォールルールを作成する場合は、「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
そうすることで、サーバーがパブリックインターネットからHTTPリクエストを受信できるようになります。
または、MySQLデータベースサーバー(ポート3306
)でプライベートネットワークインターフェイスeth1
の接続をリッスンする場合は、次のコマンドを使用できます。
- sudo ufw allow in on eth1 to any port 3306
これにより、プライベートネットワーク上の他のサーバーがMySQLデータベースに接続できるようになります。
ステップ6—接続を拒否する
着信接続のデフォルトポリシーを変更していない場合、UFWはすべての着信接続を拒否するように設定されています。 一般に、これにより、特定のポートとIPアドレスの通過を明示的に許可するルールを作成する必要があるため、安全なファイアウォールポリシーを作成するプロセスが簡素化されます。
ただし、サーバーがそこから攻撃されていることがわかっている場合など、送信元IPアドレスまたはサブネットに基づいて特定の接続を拒否したい場合があります。 また、デフォルトの受信ポリシーを allow に変更する場合(これは推奨されません)、使用しないサービスまたはIPアドレスに対してdenyルールを作成する必要があります。の接続を許可したい。
deny ルールを作成するには、上記のコマンドを使用して、allowをdenyに置き換えます。
たとえば、HTTP接続を拒否するには、次のコマンドを使用できます。
- sudo ufw deny http
または、203.0.113.4
からのすべての接続を拒否する場合は、次のコマンドを使用できます。
- sudo ufw deny from 203.0.113.4
次に、ルールを削除する方法を見てみましょう。
ステップ7—ルールを削除する
ファイアウォールルールを削除する方法を知ることは、それらを作成する方法を知ることと同じくらい重要です。 削除するルールを指定するには、ルール番号または実際のルール(作成時にルールを指定した方法と同様)の2つの方法があります。 ルール番号による削除メソッドの方が簡単なので、まず始めます。
ルール番号別
ルール番号を使用してファイアウォールルールを削除している場合、最初に実行したいのは、ファイアウォールルールのリストを取得することです。 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を削除することにした場合は、次のようにUFWdeleteコマンドで指定できます。
- sudo ufw delete 2
これにより、確認プロンプトが表示され、HTTP接続を許可するルール2が削除されます。 IPv6を有効にしている場合は、対応するIPv6ルールも削除する必要があることに注意してください。
実際のルールによる
ルール番号の代わりに、削除する実際のルールを指定することもできます。 たとえば、allow http
ルールを削除する場合は、次のように記述できます。
- sudo ufw delete allow http
サービス名ではなく、allow 80
でルールを指定することもできます。
- sudo ufw delete allow 80
このメソッドは、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
UFWで作成したルールはアクティブではなくなります。 後でアクティブ化する必要がある場合は、いつでもsudo ufw enable
を実行できます。
すでにUFWルールを設定しているが、最初からやり直すことにした場合は、resetコマンドを使用できます。
- sudo ufw reset
これにより、UFWが無効になり、以前に定義されたルールがすべて削除されます。 いずれかの時点で変更した場合、デフォルトのポリシーは元の設定に変更されないことに注意してください。 これにより、UFWを新たに始めることができます。
結論
これで、ファイアウォールは(少なくとも)SSH接続を許可するように構成されました。 サーバーが機能し、安全になるように、不要な接続を制限しながら、サーバーが必要とするその他の着信接続を必ず許可してください。
より一般的なUFW構成については、 UFW Essentials:Common Firewall Rules andCommandsチュートリアルをご覧ください。