紹介
UFW、またはUncomplicated Firewallは、iptables
やnftables
などの低レベルのパケットフィルタリング技術の複雑さを隠す、簡略化されたファイアウォール管理インターフェースです。ネットワークのセキュリティを強化し始めたいが、どのツールを使用するかわからない場合は、UFWが適しているかもしれません。
このチュートリアルでは、Debian 11でUFWを使用したファイアウォールの設定方法を説明します。
前提条件
このチュートリアルに従うには、sudo
を使用できる非rootユーザーが1つ含まれたDebian 11サーバーが必要です。これは、デビアン11の初期サーバーセットアップチュートリアルのステップ1から3に従って設定できます。
ステップ1 – UFWのインストール
DebianはデフォルトではUFWをインストールしません。もし、Initial Server Setup tutorialを完全に実行した場合、UFWがインストールされ、有効になっているはずです。そうでない場合は、apt
を使用して今すぐインストールしてください:
- sudo apt install ufw
以下の手順でUFWを設定して有効にします。
ステップ2 — IPv6をUFWで使用する(オプション)
このチュートリアルはIPv4を前提としていますが、IPv6にも適用されます。DebianサーバーがIPv6を有効にしている場合、UFWがIPv6をサポートするように設定する必要があります。これにより、UFWがIPv4に加えてIPv6のファイアウォールルールを管理するようになります。これを設定するには、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
以下のような出力が得られます:
OutputDefault 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 — 他の接続を許可する
この時点で、サーバーが正常に機能するために必要な他のすべての接続を許可する必要があります。許可する接続は、特定のニーズに基づいて異なります。SSHの場合と同様に、サービス名またはポートに基づいて接続を許可するルールを記述する方法を既に知っています。
これは、非暗号化のウェブサーバーが使用するHTTPのポート80
に対して行うことができます。この種のトラフィックを許可するには、次のように入力します:
- sudo ufw allow http
また、暗号化されたウェブサーバーが使用するHTTPSのポート443
に対しても同様に行うことができます。この種のトラフィックを許可するには、次のように入力します:
- sudo ufw allow https
両方のシナリオで、ポートを指定することもできます。HTTPが80
、HTTPSが443
です。例えば:
- sudo ufw allow 80
ただし、ポートや既知のサービスを指定する以外にも、接続を許可する方法があります。次にその方法について説明します。
特定のポート範囲
UFWでは、ポート範囲を指定できます。たとえば、複数のポートを使用するアプリケーションがあります。
たとえば、ポート6000
〜6007
を使用するX11
接続を許可するには、次のコマンドを使用します:
- sudo ufw allow 6000:6007/tcp
- sudo ufw allow 6000:6007/udp
UFWでポート範囲を指定する場合、適用するルールにプロトコル(tcp
またはudp
)を指定する必要があります。これは以前に言及されていなかったので、プロトコルを指定しないと自動的に両方のプロトコルが許可されるため、ほとんどの場合は問題ありません。
特定のIPアドレス
UFWを使用する場合、IPアドレスも指定できます。たとえば、特定のIPアドレス(作業場所または家庭のIPアドレス)からの接続を許可したい場合は、from
の後にIPアドレスを指定する必要があります:
- sudo ufw allow from 203.0.113.4
IPアドレスが接続を許可される特定のポートも指定できます。これは、to any port
に続けてポート番号を追加することで行います。たとえば、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. . .
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リクエストを受信できるようになります。
または、MySQLデータベースサーバー(ポート3306
)がプライベートネットワークインターフェースeth1
で接続を待機するようにしたい場合は、次のコマンドを使用できます:
- sudo ufw allow in on eth1 to any port 3306
これにより、プライベートネットワーク上の他のサーバーがMySQLデータベースに接続できるようになります。
ステップ7 — 接続の拒否
受信接続のデフォルトポリシーを変更していない場合、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
これで、削除ルールの実装方法を学ぶことができます。
ステップ8 — ルールの削除
ファイアウォールルールを削除する方法を知っていることは、それを作成する方法と同じくらい重要です。削除するルールを指定する方法は、ルール番号またはルール自体で指定する2つの方法があります。これは、ルールが作成されたときにそれらが指定された方法と類似しています。
ルール番号で
ファイアウォールルールを削除するためにルール番号を使用している場合、まず最初にファイアウォールルールのリストを取得する必要があります。UFW status
コマンドには、各ルールの横に番号が表示されるnumbered
オプションがあります。
- sudo ufw status numbered
OutputStatus: active
To Action From
-- ------ ----
[ 1] 22 ALLOW IN 15.15.15.0/24
[ 2] 80 ALLOW IN Anywhere
HTTP接続を許可するルール 2
を削除することに決定した場合、次のUFW delete
コマンドでこれを指定できます:
- sudo ufw delete 2
これにより、確認プロンプトが表示されます。 y/n
で回答できます。 y
を入力すると、ルール 2
が削除されます。IPv6が有効になっている場合は、対応するIPv6ルールも削除する必要があることに注意してください。
実際のルールで
代わりに、削除するルールの番号を指定する代わりに、削除する実際のルールを指定することです。たとえば、allow http
ルールを削除したい場合は、次のように書くことができます:
- sudo ufw delete allow http
allow 80
というサービス名の代わりにルールを指定することもできます:
- sudo ufw delete allow 80
この方法では、IPv4とIPv6の両方のルールを削除します(存在する場合)。
ステップ9 — UFWの状態とルールの確認
いつでも、次のコマンドでUFWの状態を確認できます:
- sudo ufw status verbose
デフォルトで無効になっている場合は、出力は次のようになります:
OutputStatus: inactive
UFWがアクティブである場合、つまり、ステップ3に従った場合、出力にはアクティブであり、設定したルールが表示されます。たとえば、ファイアウォールがどこからでもSSH(ポート22
)接続を許可するように設定されている場合、出力には次のようなものが含まれる場合があります:
OutputStatus: active
To Action From
-- ------ ----
22/tcp ALLOW IN Anywhere
ファイアウォールの構成を確認したい場合は、status
コマンドを使用してください。
ステップ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のチュートリアルを参照してください。