Debian 11でUFWを使用してファイアウォールを設定する方法
イントロダクション
UFW(Uncomplicated Firewall)は、iptablesやnftablesなどの下位パケットフィルタリング技術の複雑さを隠蔽した、シンプルなファイアウォール管理インターフェースです。ネットワークのセキュリティを始めるために、どのツールを使うか迷っている場合、UFWは適切な選択肢かもしれません。
このチュートリアルでは、Debian 11上でUFWを使用してファイアウォールを設定する方法を説明します。
前提条件
このチュートリアルに従うためには、sudoノンルートユーザーを持つDebian 11サーバーが1つ必要です。これは、「Debian 11での初期サーバーセットアップ」チュートリアルのステップ1から3を実行することで設定できます。
ステップ1 – UFWのインストール
デビアンはデフォルトではUFWをインストールしません。もし初期サーバーセットアップチュートリアルを完全に実行した場合、UFWがインストールされ、有効になっているはずです。そうでない場合は、aptを使って今すぐインストールしてください。
- sudo apt install ufw
以下の手順でUFWを設定し、有効にします。
ステップ2 — IPv6をUFWと使用する(オプション)
このチュートリアルはIPv4を念頭に置いて書かれていますが、IPv6も有効にすれば使えます。DebianサーバーがIPv6有効になっている場合は、UFWがIPv6をサポートするように設定する必要があります。これにより、UFWはIPv4に加えてIPv6のファイアウォールルールも管理できます。設定するためには、nanoまたはお気に入りのエディタでUFWの設定ファイルである/etc/default/ufwを開いてください。
- sudo nano /etc/default/ufw
ファイル内でIPV6を見つけて、値がyesになっていることを確認してください。
IPV6=yes
ファイルを保存して閉じてください。nanoを使っている場合は、CTRL + X、次にY、そしてENTERを押してファイルを保存し、終了してください。
今後、UFWを有効にすると、IPv4およびIPv6のファイアウォールルールが設定されるようになります。ただし、UFWを有効にする前に、SSH接続を許可するようファイアウォールが設定されていることを確認する必要があります。まずはデフォルトのポリシーを設定することから始めましょう。
ステップ3 — デフォルトポリシーの設定
ファイアウォールの設定を始めるなら、最初に定義するべきはデフォルトのポリシーです。これらのルールは、他のルールと明示的に一致しないトラフィックを処理します。デフォルトでは、UFWはすべての着信接続を拒否し、すべての送信接続を許可する設定になっています。つまり、サーバーに到達しようとする人は接続できない一方、サーバー内のアプリケーションは外部の世界に接続できます。
このチュートリアルに従うことができることを確認するために、UFWのルールをデフォルトに戻してください。UFWで使用されるデフォルトを設定するには、以下のコマンドを使用してください。
- sudo ufw default deny incoming
- sudo ufw default allow outgoing
以下のような出力が送られてきます。
Default incoming policy changed to ‘deny’ (be sure to update your rules accordingly) Default outgoing policy changed to ‘allow’ (be sure to update your rules accordingly)
これらのコマンドは、デフォルトで受信を拒否し、送信を許可するよう設定します。これらのファイアウォールのデフォルトだけでも、個人用のコンピューターには十分かもしれませんが、サーバーは通常、外部ユーザーからの受信要求に対応する必要があります。次のステップでこのプロセスを開始します。
ステップ4:SSH接続を許可する
あなたはまだUFWファイアウォールを有効化することはできません。なぜなら、サーバーへのアクセスを含むすべての受信接続を拒否するからです。したがって、サーバーがこれらの種類のリクエストに応答するためには、合法的な受信接続(例えばSSHやHTTP接続)を明示的に許可するルールを作成する必要があります。クラウドサーバーを使用している場合、SSH接続を許可してサーバーに接続し、管理することができるでしょう。
サーバーを設定して、SSH接続を許可するには、このコマンドを使用してください。
- sudo ufw allow ssh
以下の文を日本語で言い換えると:
これにより、SSHデーモンがデフォルトでリッスンするポートであるポート22でのすべての接続を許可するファイアウォールルールが作成されます。UFWは、/etc/servicesファイルにサービスとしてリストされているため、sshを許可するためのポートを知っています。
ただし、サービス名の代わりにポートを指定することで、実際に同等のルールを書くことができます。例えば、このコマンドは上記のものと同じ結果を出力します。
- sudo ufw allow 22
もしSSHデーモンを異なるポートに設定した場合は、適切なポートを指定する必要があります。例えば、SSHサーバーがポート2222でリスニングしている場合、この同じコマンドを使用しますが、22を2222に置き換えます。
ファイアウォールが受信SSH接続を許可するように設定されたので、有効にすることができます。
ステップ5 – UFWの有効化
UFWを有効にするために、このコマンドを使用してください。
- sudo ufw enable
「既存のSSH接続に影響を与える可能性があると警告が表示されます。すでにSSH接続を許可するファイアウォールルールを設定しているので、続行しても問題ありません。yと入力し、ENTERキーを押しましょう」というメッセージが表示されます。
ファイアウォールが現在アクティブです。設定したルールを確認するには、このコマンドを実行してください。
- sudo ufw status verbose
このチュートリアルの残りの部分では、UFWの詳細な使い方について説明します。これには、さまざまな種類の接続を許可または拒否する方法も含まれます。
ステップ6 — 他の接続を許可します。
この時点では、サーバーが正常に機能するために必要な他の接続も許可する必要があります。許可すべき接続は、具体的なニーズによります。既に22ポートのSSHの接続に基づいて接続を許可するルールの作成方法を知っています。
80ポート上のHTTPについては、これを行うことができます。これは、暗号化されていないウェブサーバーが使用するものです。このタイプのトラフィックを許可するためには、次のように入力します。
- sudo ufw allow http
HTTPSを使用するために、ポート443でも同様に行うことができます。この種類のトラフィックを許可するには、次のように入力します。
- sudo ufw allow https
両方のシナリオで、ポートを指定することもできます。HTTPの場合は80、HTTPSの場合は443です。例えば:
- sudo ufw allow 80
ポートや既知のサービスを特定する以外にも、接続を許可する別の方法があります。次に、それについて説明します。
特定のポート範囲
UWFでは、ポート範囲を指定することができます。例えば、複数のポートを使用するアプリケーションもあります。
例えば、ポート番号6000から6007を使用するX11接続を許可するためには、次のコマンドを使用してください。
- sudo ufw allow 6000:6007/tcp
- sudo ufw allow 6000:6007/udp
UFWを使用してポート範囲を指定する際には、適用するルールにプロトコル(tcpまたはudp)を指定する必要があります。これまで言及されていなかったのは、プロトコルを指定しないことで両方のプロトコルが自動的に許可されるため、ほとんどの場合には問題ありません。
特定のIPアドレス
UFWを使用する際には、IPアドレスも指定することができます。例えば、特定のIPアドレス(労働場所や自宅のIPアドレスである203.0.113.4など)からの接続を許可したい場合、fromとその後にIPアドレスを指定する必要があります。
- sudo ufw allow from 203.0.113.4
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
. . . 2: 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トラフィックを許可することができます。
- sudo ufw allow in on eth0 to any port 80
そうすることで、あなたのサーバーはインターネット上からHTTPリクエストを受信することができるようになります。
または、プライベートネットワークインターフェースeth1で接続を待ち受けるために、MySQLデータベースサーバー(ポート3306)を使用する場合は、次のコマンドを使用できます。
- sudo ufw allow in on eth1 to any port 3306
あなたのプライベートネットワーク上の他のサーバーが、あなたのMySQLデータベースへ接続できるようになります。
ステップ7 — 接続の拒否
デフォルトの受信接続ポリシーを変更していない場合、UFWはすべての受信接続を拒否するように設定されています。一般的には、特定のポートとIPアドレスを明示的に許可するルールを作成することで、安全なファイアウォールポリシーの作成プロセスが簡略化されます。
時には、特定の接続について、ソースIPアドレスやサブネットに基づいて拒否する必要があることがあります。もしかすると、サーバーが攻撃されていると知っているからかもしれません。また、デフォルトの着信ポリシーを許可に変更したい場合(おすすめされていませんが)、接続を許可したくないサービスやIPアドレスのために拒否ルールを作成する必要があります。
上記のコマンドを使って、拒否ルールを書くことができます。allowの部分をdenyに置き換えてください。
たとえば、HTTP接続を拒否するためには、このコマンドを使用することができます。
- sudo ufw deny http
もしあなたが203.0.113.4からの全ての接続を拒否したい場合、このコマンドを使用できます。
- sudo ufw deny from 203.0.113.4
今、あなたは削除ルールの実装方法を学ぶことができます。
第8ステップ:ルールの削除
ファイアウォールのルールを削除する方法を知ることは、作成する方法と同じくらい重要です。削除するルールを指定する方法は2つあります。ルールの番号で指定する方法と、ルールそのもので指定する方法です。これは、ルールが作成された際に指定された方法に似ています。
ルールナンバーによる
ファイアウォールのルールを削除する場合、まず最初にファイアウォールルールのリストを取得する必要があります。UFWステータスコマンドには、各ルールの横に数字が表示される番号オプションがあります。
- sudo ufw status numbered
Status: active To Action From — —— —- [ 1] 22 ALLOW IN 15.15.15.0/24 [ 2] 80 ALLOW IN Anywhere
以下のUFW削除コマンドで、80ポート上のHTTP接続を許可するルール2を削除したい場合は、それを指定することができます。
- sudo ufw delete 2
以下の日本語訳を提供いたします。
これにより確認のプロンプトが表示され、y/nで回答することができます。yと入力すると、ルール2が削除されます。IPv6が有効な場合は、対応するIPv6ルールも削除する必要があることに注意してください。
実際のルールによる。 (Jissai no rūru ni yoru.)
ルール番号の代替案は、削除する実際のルールを特定することです。例えば、「allow http」ルールを削除したい場合、次のように書くことができます。
- sudo ufw delete allow http
サービス名の代わりに、80を許可するルールも指定できます。
- sudo ufw delete allow 80
もしIPv4およびIPv6のルールが存在している場合、この方法は両方を削除します。
ステップ9 — UFWの状態とルールを確認する
いつでも、このコマンドでUFWのステータスをチェックすることができます。
- sudo ufw status verbose
もしUFWが無効になっている場合、デフォルトの場合、出力は以下の通りになります。
Status: inactive
もしUFWがアクティブであれば、Step 3に従った場合はアクティブであり、設定したルールが表示されます。例えば、ファイアウォールがSSH(ポート22)接続をどこからでも許可するように設定されている場合、出力には次のような内容が含まれるかもしれません。
Status: active To Action From — —— —- 22/tcp ALLOW IN Anywhere
ファイアウォールの設定を確認したい場合は、ステータスコマンドを使用してください。
ステップ10: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というチュートリアルを参照してください。