Ubuntu 16.04でUFWを使用してファイアウォールを設定する方法

前書き

UFW(Uncomplicated Firewall)は、ファイアウォールの構成プロセスを簡素化することを目的としたiptablesへのインターフェースです。 iptablesは堅実で柔軟なツールですが、初心者がファイアウォールを適切に構成するために使用する方法を学ぶのは難しい場合があります。 ネットワークの保護を開始しようとしていて、使用するツールがわからない場合は、UFWが適切な選択である可能性があります。

このチュートリアルでは、Ubuntu 16.04でUFWを使用してファイアウォールを設定する方法を示します。

前提条件

このチュートリアルを実行するには、次のものが必要です。

UFWはデフォルトでUbuntuにインストールされます。 何らかの理由でアンインストールされている場合は、sudo apt-get install ufwでインストールできます。

[[step-1 -—- using-ipv6-with-ufw-optional]] ==ステップ1— UFWでのIPv6の使用(オプション)

このチュートリアルはIPv4を念頭に置いて書かれていますが、IPv6を有効にしている限り機能します。 UbuntuサーバーでIPv6が有効になっている場合、UFWがIPv4に加えてIPv6のファイアウォールルールを管理するようにIPv6をサポートするように構成されていることを確認します。 これを行うには、nanoまたはお気に入りのエディターでUFW構成を開きます。

sudo nano /etc/default/ufw

次に、IPV6の値がyesであることを確認します。 これは次のようになります。

/etc/default/ufw excerpt

...
IPV6=yes
...

ファイルを保存して閉じます。 これで、UFWが有効になると、IPv4とIPv6の両方のファイアウォールルールを記述するように構成されます。 ただし、UFWを有効にする前に、SSH経由で接続できるようにファイアウォールを構成する必要があります。 デフォルトのポリシーの設定から始めましょう。

[[step-2 -—- setting-up-default-policies]] ==ステップ2—デフォルトポリシーの設定

ファイアウォールを使い始めたばかりの場合、最初に定義するルールはデフォルトのポリシーです。 これらのルールは、他のルールと明示的に一致しないトラフィックの処理方法を制御します。 デフォルトでは、UFWはすべての着信接続を拒否し、すべての発信接続を許可するように設定されています。 つまり、クラウドサーバーにアクセスしようとするユーザーは接続できず、サーバー内のアプリケーションは外部にアクセスできます。

UFWルールをデフォルトに戻して、このチュートリアルを確実に実行できるようにします。 UFWで使用されるデフォルトを設定するには、次のコマンドを使用します。

sudo ufw default deny incoming
sudo ufw default allow outgoing

これらのコマンドは、着信接続を拒否し、発信接続を許可するようにデフォルトを設定します。 これらのファイアウォールの既定値だけで、パーソナルコンピューターには十分かもしれませんが、サーバーは通常、外部ユーザーからの着信要求に応答する必要があります。 次にそのことを検討します。

[[step-3 -—- allowing-ssh-connections]] ==ステップ3—SSH接続を許可する

ここでUFWファイアウォールを有効にすると、すべての着信接続が拒否されます。 これは、サーバーがこれらの種類の要求に応答する場合、正当な着信接続(たとえば、SSHまたはHTTP接続)を明示的に許可するルールを作成する必要があることを意味します。 クラウドサーバーを使用している場合は、サーバーに接続して管理できるように、着信SSH接続を許可することをお勧めします。

着信SSH接続を許可するようにサーバーを構成するには、次のコマンドを使用できます。

sudo ufw allow ssh

これにより、SSHデーモンがデフォルトでリッスンするポートであるポート22ですべての接続を許可するファイアウォールルールが作成されます。 UFWは、SSHおよびその他の多くのサービス名が/etc/servicesファイルにサービスとしてリストされているため、それらが何を意味するかを認識しています。

ただし、サービス名の代わりにポートを指定することで、実際に同等のルールを作成できます。 たとえば、このコマンドは上記のコマンドと同じように機能します。

sudo ufw allow 22

別のポートを使用するようにSSHデーモンを構成した場合、適切なポートを指定する必要があります。 たとえば、SSHサーバーがポート2222でリッスンしている場合、次のコマンドを使用して、そのポートでの接続を許可できます。

sudo ufw allow 2222

ファイアウォールが着信SSH接続を許可するように設定されたので、有効にすることができます。

[[step-4 -—- enableing-ufw]] ==ステップ4—UFWを有効にする

UFWを有効にするには、次のコマンドを使用します。

sudo ufw enable

コマンドが既存のSSH接続を中断する可能性があるという警告が表示されます。 SSH接続を許可するファイアウォールルールを既に設定しているため、続行しても問題ありません。 プロンプトにyで応答します。

ファイアウォールがアクティブになりました。 sudo ufw status verboseコマンドを実行して、設定されているルールを確認してください。 このチュートリアルの残りの部分では、さまざまな種類の接続を許可または拒否するなど、UFWをより詳細に使用する方法について説明します。

[[step-5 -—- allowing-other-connections]] ==ステップ5—他の接続を許可する

この時点で、サーバーが応答する必要がある他のすべての接続を許可する必要があります。 許可する接続は、特定のニーズによって異なります。 幸いなことに、サービス名またはポートに基づいて接続を許可するルールを作成する方法はすでに知っています。ポート22のSSHに対してすでにこれを実行しました。 これは次の場合にも実行できます。

  • sudo ufw allow httpまたはsudo ufw allow 80を使用して、暗号化されていないWebサーバーが使用するポート80のHTTP

  • sudo ufw allow httpsまたはsudo ufw allow 443を使用して、暗号化されたWebサーバーが使用するポート443のHTTPS

  • sudo ufw allow ftpまたはsudo ufw allow 21/tcpを使用した、暗号化されていないファイル転送(とにかく使用すべきではない)に使用されるポート21のFTP

ポートまたは既知のサービスを指定する以外に、他の接続を許可する方法がいくつかあります。

特定のポート範囲

UFWでポート範囲を指定できます。 一部のアプリケーションは、単一のポートではなく複数のポートを使用します。

たとえば、ポート6000-6007を使用するX11接続を許可するには、次のコマンドを使用します。

sudo ufw allow 6000:6007/tcp
sudo ufw allow 6000:6007/udp

UFWでポート範囲を指定する場合は、ルールを適用するプロトコル(tcpまたはudp)を指定する必要があります。 プロトコルを指定しないと両方のプロトコルが許可されるだけなので、これについてはこれまで言及していませんでした。

特定のIPアドレス

UFWを使用する場合、IPアドレスも指定できます。 たとえば、15.15.15.51の職場または自宅のIPアドレスなど、特定のIPアドレスからの接続を許可する場合は、fromを指定してから、IPアドレスを指定する必要があります。

sudo ufw allow from 15.15.15.51

to any portの後にポート番号を追加して、IPアドレスが接続を許可される特定のポートを指定することもできます。 たとえば、15.15.15.51がポート22(SSH)に接続できるようにする場合は、次のコマンドを使用します。

sudo ufw allow from 15.15.15.51 to any port 22

サブネット

IPアドレスのサブネットを許可する場合は、CIDR表記を使用してネットマスクを指定できます。 たとえば、15.15.15.1から15.15.15.254の範囲のすべてのIPアドレスを許可する場合は、次のコマンドを使用できます。

sudo ufw allow from 15.15.15.0/24

同様に、サブネット15.15.15.0/24が接続を許可されている宛先ポートを指定することもできます。 ここでも、例としてポート22(SSH)を使用します。

sudo ufw allow from 15.15.15.0/24 to any port 22

特定のネットワークインターフェイスへの接続

特定のネットワークインターフェースにのみ適用されるファイアウォールルールを作成する場合は、「allow in on」の後にネットワークインターフェースの名前を指定することで作成できます。

続行する前に、ネットワークインターフェイスを検索することをお勧めします。 これを行うには、次のコマンドを使用します。

ip addr
Output Excerpt:...
2: eth0:  mtu 1500 qdisc pfifo_fast state
...
3: eth1:  mtu 1500 qdisc noop state DOWN group default
...

強調表示された出力は、ネットワークインターフェイス名を示しています。 これらは通常、eth0またはeth1のような名前が付けられます。

したがって、サーバーに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データベースに接続できるようになります。

[[step-6 -—- denying-connections]] ==ステップ6—接続を拒否する

着信接続のデフォルトポリシーを変更していない場合、UFWはすべての着信接続を拒否するように設定されます。 一般に、これにより、特定のポートとIPアドレスを明示的に許可するルールを作成する必要があるため、安全なファイアウォールポリシーの作成プロセスが簡素化されます。

ただし、ソースIPアドレスまたはサブネットに基づいて特定の接続を拒否したい場合があります。これは、サーバーがそこから攻撃されていることを知っている可能性があるためです。 また、デフォルトの受信ポリシーをallowに変更する場合(セキュリティ上の理由から推奨されていません)、使用しないサービスまたはIPアドレスに対してdenyルールを作成する必要があります。の接続を許可したい。

denyルールを作成するには、上記のコマンドを使用して、allowdenyに置き換えます。

たとえば、HTTP接続を拒否するには、次のコマンドを使用できます。

sudo ufw deny http

または、15.15.15.51からのすべての接続を拒否する場合は、次のコマンドを使用できます。

sudo ufw deny from 15.15.15.51

では、ルールを削除する方法を見てみましょう。

[[step-7 -—- deleting-rules]] ==ステップ7—ルールの削除

ファイアウォールルールを削除する方法を知ることは、ルールを作成する方法を知ることと同じくらい重要です。 削除するルールを指定する2つの異なる方法があります。ルール番号または実際のルール(ルールが作成されたときに指定された方法に似ています)。 UFWを初めて使用する場合は、削除する実際のルールを作成するよりも簡単なので、delete by rule numberメソッドから始めます。

ルール番号別

ルール番号を使用してファイアウォールルールを削除する場合、最初にすることはファイアウォールルールのリストを取得することです。 UFWステータスコマンドには、次に示すように、各ルールの横に数字を表示するオプションがあります。

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のdeleteコマンドで指定できます。

sudo ufw delete 2

これにより、確認プロンプトが表示され、ルール2が削除され、HTTP接続が許可されます。 IPv6を有効にしている場合、対応するIPv6ルールも削除することに注意してください。

実際のルールによる

ルール番号の代わりに、削除する実際のルールを指定します。 たとえば、allow httpルールを削除する場合は、次のように記述できます。

sudo ufw delete allow http

サービス名ではなく、allow 80でルールを指定することもできます。

sudo ufw delete allow 80

このメソッドは、IPv4とIPv6の両方のルールが存在する場合、それらを削除します。

[[step-8 -—- checking-ufw-status-and-rules]] ==ステップ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コマンドを使用します。

[[step-9 -—- disabling-or-resetting-ufw-optional]] ==ステップ9— UFWの無効化またはリセット(オプション)

UFWを使用したくない場合は、次のコマンドでUFWを無効にできます。

sudo ufw disable

UFWで作成したルールは無効になります。 後でアクティブ化する必要がある場合は、いつでもsudo ufw enableを実行できます。

すでにUFWルールが設定されているが、最初からやり直すことにした場合は、resetコマンドを使用できます。

sudo ufw reset

これにより、UFWが無効になり、以前に定義されたルールが削除されます。 デフォルトのポリシーは、いつでも変更しても元の設定に変更されないことに注意してください。 これにより、UFWで新たなスタートを切ることができます。

結論

これで、(少なくとも)SSH接続を許可するようにファイアウォールを構成する必要があります。 サーバーが機能し、安全であるように、不要な接続を制限しながら、サーバーの他の着信接続を必ず許可してください。

より一般的なUFW構成については、UFW Essentials: Common Firewall Rules and Commandsチュートリアルをご覧ください。