はじめに
UFW(Uncomplicated Firewall)は、iptables
によるファイアウォール設定を簡素化するためのインターフェースです。iptables
は堅実で柔軟性があるツールですが、その使用方法を学ぶのが初学者にとって困難な場合があります。ネットワークを保護するために始めることが望まれている場合、どのツールを使用すべきかわからない場合は、UFWがあなたに適しているかもしれません。
このチュートリアルは、UFWを使用してUbuntu v18.04およびそれ以上のバージョンにてファイアウォールを設定する方法をお教えします。
前提条件
Ubuntu 16.04または以下のバージョンを使用している場合、最新のバージョンにアップグレードすることを推奨します。なぜなら、Ubuntuはこれらのバージョンのサポートをもっていないからです。このガイドのコレクションがあなたのUbuntuバージョンのアップグレードを助けることを期待します。
このチュートリアルに従うためには、以下が必要です。
-
Ubuntuを実行しているサーバーと、
sudo
権限を持つ非rootユーザー。これらの設定方法についてのガイドラインは、このリストからあなたのディストリビューションを選んで、私たちのInitial Server Setup Guideに従ってください。 -
UFWはUbuntuにデフォルトでインストールされています。何か理由でアンインストールされている場合、
sudo apt install ufw
でインストールできます。
UFWを使用してUbuntuのファイアウォールを設定する
- IPv6を有効にする
- デフォルトポリシーを設定する
- SSH接続を許可する
- UFWを有効にする
- 他の必要な接続をすべて許可する
- 接続を拒否する
- ファイアウォールルールを削除する
- UFWのステータスとルールを確認する
- Ubuntuでファイアウォールを無効にするまたはリセットする方法
ステップ 1 — IPv6を有効化していることを確認する
Ubuntuの最近のバージョンでは、IPv6はデフォルトで有効化されています。实践的には、サーバに追加されるほとんどのファイアウォールルールには、IPv4とIPv6のバージョンが含まれていて、后者はUFWのステータスコマンドの出力でv6
として識別されます。IPv6が有効化されていることを確認するためには、/etc/default/ufw
にあるUFWの設定ファイルを確認することができます。このファイルをnano
やお気に入りのコマンドラインエディタで開いてください。
そしてIPV6
の値がyes
に設定されていることを確認してください。以下のようになっているはずです:
ファイルを保存し閉じる。nano
を使用している場合、これを行うにはCTRL+X
を押し、次にY
とENTER
を押すことで確認します。
後の手順でUFWを有効にしたとき、UFWはIPv4とIPv6の両方のファイアウォールルールを書き込む設定になります。
ステップ 2 — デフォルトのポリシーを設定する
UFWを初めて使う場合、最初のステップとしてデフォルトのファイアウォールポリシーを確認するのが良いことです。これらのルールは、他のルールに合致しないトラフィックに対する処理方法を控制在ります。
デフォルトでUFWは全ての受信接続を拒否し、全ての送信接続を許可しています。これはあなたが試みているサーバーと外部から通信することができませんが、サーバー内のアプリケーションは外部に通信できます。追加のルールを使って特定のサービスやポートを許可することで、通常のポリシーを上書きします。
次の手順でUFWのデフォルトポリシーを受信側と送信側両方に設定します。
受信側のデフォルトポリシーをdeny
に設定するには、以下のコマンドを実行します:
OutputDefault incoming policy changed to 'deny'
(be sure to update your rules accordingly)
送信側のデフォルトポリシーをallow
に設定するには、以下のコマンドを実行します:
OutputDefault outgoing policy changed to 'allow'
(be sure to update your rules accordingly)
これらのコマンドで受信側のデフォルトは拒否し、送信側のデフォルトは許可します。これらの默认値だけでは、私たちの人々は一般的に自分のPCで良いですが、サーバーでは通常、外部からの要求を応答する必要があります。そのため、次のステップでは正規的な入力接続(SSHやHTTPなど)を許可します。
3. SSH接続を許可する
UFWを有効にすると、現在の状態では全ての受信接続を拒否し、全ての送信接続を許可しています。これはおそらく私たちの人々は一般に自分のPCで良いですが、サーバーでは通常、外部からの要求を応答する必要があります。そのため、次のスtepでは正規的な入力接続(SSHやHTTPなど)を許可します。
UFWを使うと、受信側のデフォルトポリシーは拒否され、送信側のデフォルトポリシーは許可されます。これはあなたがサーバーに接続して管理するために必要です。
今回はSSH接続を許可します。SSH接続を許可するには、次の手順を実行します:
1. SSH接続を許可するには、以下のコマンドを実行します:
“`bash
ufw allow ssh
“`
2. 完了後、UFWの状態を確認するには、以下のコマンドを実行します:
“`bash
ufw status
“`
3. 結果が以下のように表示された場合、SSH接続は許可されます:
“`
Status: active
To: Allow 22/tcp (SSH)
From: Anywhere
New profiles: 0
Allow 22/tcp (SSH)
“`
4. 完了したら、UFWを保存するには、以下のコマンドを実行します:
“`bash
ufw save
“`
5. 完了したら、UFWの状態を再度確認するには、以下のコマンドを実行します:
“`bash
ufw status
“`
6. 結果が以下のように表示された場合、SSH接続は許可されます:
“`
Status: active
To: Allow 22/tcp (SSH)
From: Anywhere
New profiles: 0
Allow
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 — 他の接続を許可する
この段階では、サーバーが応答する必要がある他のすべての接続を許可する必要があります。許可すべき接続は、具体的なニーズによって異なります。アプリケーションプロファイル、サービス名、ポートに基づいて接続を許可するルールを書く方法はすでにお分かりでしょう。SSHのポート22
用にすでに行ったことです。以下のような場合でも同様に行えます:
- HTTPが利用するポート80。これは暗号化されていないウェブサーバー用です。以下のコマンドを使用して許可できます。
sudo ufw allow http
またはsudo ufw allow 80
- HTTPSが利用するポート443。これは暗号化されたウェブサーバー用です。以下のコマンドを使用して許可できます。
sudo ufw allow https
またはsudo ufw allow 443
- Apacheに対してHTTPとHTTPSの両方を許可するには、以下のコマンドを使用します。
sudo ufw allow ‘Apache Full’
- Nginxに対してHTTPとHTTPSの両方を許可するには、以下のコマンドを使用します。
sudo ufw allow ‘Nginx Full’
サーバーで利用可能なアプリケーションプロファイルを確認するためにsudo ufw app list
を忘れないでください。
ポートや既知のサービス名を指定する以外にも、接続を許可する方法はいくつかあります。そのいくつかを次に見ていきましょう。
特定のポート範囲
UFWを使用することで、ポート範囲を指定することができます。一部のアプリケーションでは、单一のポートではなく、複数のポートを使用しています。
たとえば、X11接続にはポート6000
から6007
が使用されるため、以下のコマンドを使用することで許可することができます:
UFWを使用してポート範囲を指定する際には、ルールに適用されるProtocol(tcp
またはudp
)を指定する必要があります。これまでにこの点を提及していなかった理由は、Protocolを指定しないことで自動的に両方のProtocolを許可することができるためであり、ほとんどの場合には問題ないからです。
特定のIPアドレス
UFWを使用する際には、ルール内でIPアドレスを指定することもできます。たとえば、特定のIPアドレスからの接続を許可したい場合、例えば職場や自宅のIPアドレス203.0.113.4
の場合、from
パラメーターを使用してIPアドレスを許可する必要があります:
OutputRule added
IPアドレスが接続するポートを指定するには、to any port
を追加してポート番号の後に書くことができます。たとえば、203.0.113.4
がポート22
(SSH)に接続することを許可したい場合、このコマンドを使用します:
OutputRule added
サブネット
CIDR記法を使用して、IPアドレスのサブネットを許可することができます。たとえば、203.0.113.1
から203.0.113.254
のIPアドレスをすべて許可したい場合、以下のコマンドを使用できます:
OutputRule added
同様に、サブネット203.0.113.0/24
が接続することを許可されるデスティンATIONポートを指定することもできます。また、ここではポート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
のような名前が与えられます。
サーバーにpublic network interfaceがeth0
と名付けられている場合、このようなコマンドを使用してHTTPトラフィック(ポート80
)を許可することができます:
OutputRule added
Rule added (v6)
これにより、あなたのサーバーは公のインターネットからHTTPリクエストを受け取ることができます。
MySQLデータベースサーバー(ポート 3306
)が、例えばプライベートネットワークインターフェース eth1
で接続をリスンするようにしたい場合、以下のコマンドを使用することができます:
OutputRule added
Rule added (v6)
これにより、プライベートネットワーク上の他のサーバーがMySQLデータベースに接続できるようになります。
ステップ6 — 接続の拒否
デフォルトの受信接続ポリシーを変更していない場合、UFWはすべての受信接続を拒否するように設定されています。一般的に、これにより、特定のポートとIPアドレスを明示的に許可するルールを作成することで、安全なファイアウォールポリシーを作成するプロセスが簡素化されます。
しかし、時には特定の接続を拒否する必要があります。例えば、サーバーがその元から攻撃されていると知っている場合、ソースIPアドレスやサブネットに基づいてです。また、デフォルトの受信ポリシーを 許可 に変更したい場合(推奨されません)、接続を許可したくないサービスやIPアドレスに対して 拒否 ルールを作成する必要があります。
拒否 ルールを書くには、先ほど説明したコマンドを使用し、allow を deny に置き換えます。
例えば、HTTP接続を拒否する場合、以下のコマンドを使用することができます:
OutputRule added
Rule added (v6)
また、203.0.113.4
からのすべての接続を拒否したい場合、以下のコマンドを使用することができます:
OutputRule added
いくつかの場合、サーバーから出力した接続を拒否することも必要になります。サーバーでは、全てのユーザーが特定のポート(例如:SMTP通信用のポート25
)を使用した場合,以下のようにdeny out
を使ってポート番号を指定してください:
OutputRule added
Rule added (v6)
これで、サーバーからのすべてのSMTP通信を拒否します。
ステップ7 — ruleの削除
ruleの削除はrule creationのように重要です。ruleを削除する方法は二種類あります:rule numberやhuman-readable name(rule creation時に指定した名前)を指定できます。
UFWでruleをnumberで削除
rule numberを取得したい場合、UFW statusコマンドでnumbered listを表示することができます。次の例では、rule numberを表示させています:
Numbered Output:Status: active
To Action From
-- ------ ----
[ 1] 22 ALLOW IN 15.15.15.0/24
[ 2] 80 ALLOW IN Anywhere
rule numberを見るには、statusコマンドでoptionを追加します:rule numberを指定して削除する場合、deleteコマンドでrule numberを指定します:
OutputDeleting:
allow 80
Proceed with operation (y|n)? y
Rule deleted
rule number 2を削除する場合、HTTP接続を許可していたものです。確認を求めて削除します。IPv6が有効になっていた場合、同じruleを削除します。
名前によってUFWルールを削除する
ルール番号を使用する代わりに、ルールの種類(通常はallow
またはdeny
)と、このルールの対象であるサービス名またはポート番号、またはアプリケーションプロファイル名(使用されている場合)に基づいた人間が読解可能な名前でルールを参照することもできます。例えば、以前に有効にされたApache Full
という名前のアプリケーションプロファイル用のallow
ルールを削除したい場合、以下のように使用できます:
OutputRule deleted
Rule deleted (v6)
delete
コマンドは、サービスの名前またはポートを参照して作成されたルールに対して同様に機能します。例えば、以前にsudo ufw allow http
でHTTP接続を許可するルールを設定した場合、そのルールを削除する方法は以下の通りです:
OutputRule deleted
Rule deleted (v6)
サービス名はルールを指定する際にポート番号と交換可能であるため、allow http
の代わりにallow 80
として同じルールを参照することもできます:
OutputRule deleted
Rule deleted (v6)
UFWルールを名前によって削除する際、IPv4とIPv6の両方のルールが存在する場合、それらが削除されます。
ステップ8 — UFWのステータスとルールを確認する
いつでも、以下のコマンドでUFWのステータスを確認できます:
UFWはデフォルトで無効になっているので、以下のような表示が見えます:
OutputStatus: inactive
UFWを有効にした場合、输出は「UFWは有効です」ということであり、設定されたruleの一覧を示します。例えば、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を無効にしたい場合、次のコマンドを使用します:
OutputFirewall stopped and disabled on system startup
UFWを有効にしたい場合は、後で再度sudo ufw enable
します。
もし既にUFWのruleを設定していて、新たに始めたい場合であっても、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は無効になり、以前に定義した全てのruleは削除されます。これはUFWのデフォルトポリシーを変更せず、元々の状態を保持します。
アプリケーションをGitHubからDigitalOcean App Platformで deploy します。DigitalOceanはあなたのアプリケーションの伸縮をお手伝いします。
結論
您的防火墙现已配置好,允许(至少)SSH连接。请确保允许服务器所需的所有其他传入连接,同时限制任何不必要的连接,以便您的服务器运行正常且安全。
若想了解更多常见的UFW配置,请参阅UFW基础:常见的防火墙规则与命令教程。
Source:
https://www.digitalocean.com/community/tutorials/how-to-set-up-a-firewall-with-ufw-on-ubuntu-20-04