このチュートリアルの以前のバージョンはHazel Virdóによって書かれました
前書き
UFW(Uncomplicated Firewall)は、ファイアウォールの構成プロセスを簡素化することを目的としたiptables
へのインターフェースです。 iptables
は堅実で柔軟なツールですが、初心者がファイアウォールを適切に構成するために使用する方法を学ぶのは難しい場合があります。 ネットワークの保護を開始しようとしていて、使用するツールがわからない場合は、UFWが適切な選択である可能性があります。
このチュートリアルでは、Ubuntu 18.04でUFWを使用してファイアウォールを設定する方法を示します。
前提条件
このチュートリアルを実行するには、次のものが必要です。
-
sudo非rootユーザーを持つ1つのUbuntu18.04サーバー。これは、Initial Server Setup with Ubuntu 18.04 tutorialの手順1〜3に従ってセットアップできます。
UFWはデフォルトでUbuntuにインストールされます。 何らかの理由でアンインストールされている場合は、sudo apt 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は、/etc/services
ファイルにサービスとしてリストされているため、ポートallow ssh
の意味を認識しています。
ただし、サービス名の代わりにポートを指定することで、実際に同等のルールを作成できます。 たとえば、このコマンドは上記のコマンドと同じように機能します。
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
で応答し、ENTER
を押します。
ファイアウォールがアクティブになりました。 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
ポートまたは既知のサービスを指定する以外に、他の接続を許可する方法がいくつかあります。
特定のポート範囲
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: mtu 1500 qdisc pfifo_fast state
. . .
3: eth1: 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データベースに接続できるようになります。
[[step-6 -—- denying-connections]] ==ステップ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
では、ルールを削除する方法を見てみましょう。
[[step-7 -—- deleting-rules]] ==ステップ7—ルールの削除
ファイアウォールルールを削除する方法を知ることは、ルールを作成する方法を知ることと同じくらい重要です。 削除するルールを指定するには、ルール番号による方法と実際のルールによる方法の2つの方法があります(作成時にルールが指定された方法と同様)。 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チュートリアルをご覧ください。