ファイアウォール ルールの使用

このページでは、ファイアウォール ルールの処理のためのコマンドについて説明し、それらの使用例を紹介します。

始める前に

暗黙のルールやデフォルト ネットワークのシステム生成ルールなど、ファイアウォール ルールの詳細については、ファイアウォール ルールの概要をご覧ください。

ファイアウォール ルールを構成する前に、ファイアウォール ルールのコンポーネントを確認して、Google Cloud で使用されるファイアウォールのコンポーネントについて理解してください。

ファイアウォール ルールの作成

ファイアウォール ルールはネットワーク レベルで定義され、ルールが作成されたネットワークにのみ適用されます。ただし、それぞれの名前はプロジェクトごとに一意である必要があります。

ファイアウォール ルールには IPv4 または IPv6 の範囲のいずれかを含めることができますが、両方を含めることはできません。

ファイアウォール ルールを作成する際に、ファイアウォール ルールロギングを有効にするかどうかを選択できます。ロギングを有効にすると、ストレージ フィールドを節約するためにメタデータ フィールドを省略できます。詳細については、ファイアウォール ルールロギングの使用をご覧ください。

IPv6 ファイアウォール ルールは Google Cloud Console ではサポートされていません。代わりに、gcloud コマンドライン ツールまたは API を使用してください。

ターゲットまたはソースのサービス アカウントのフィールドに複数のサービス アカウントを指定する場合は、gcloud ツールまたは API を使用します。

Console

  1. Google Cloud Console の [ファイアウォール] ページに移動します。
    [ファイアウォール] ページに移動
  2. [ファイアウォール ルールを作成] をクリックします。
  3. ファイアウォール ルールの [名前] を入力します。
    この名前はプロジェクトで一意にする必要があります。
  4. (省略可)ファイアウォール ルール ロギングを有効にできます。
    • [ログ] > [オン] をクリックします。
    • メタデータを省略するには、[ログの詳細] を展開して [メタデータを含める] をオフにします。
  5. ファイアウォール ルールの [ネットワーク] を指定します。
  6. ルールの [優先度] を指定します。
    数字が小さいほど、優先順位が高くなります。
  7. [トラフィックの方向] には、上りと下りのいずれかを選択します。
  8. [一致したときのアクション] には、許可と拒否のいずれかを選択します。
  9. ルールの [ターゲット] を指定します。
    • ルールをネットワーク内のすべてのインスタンスに適用する場合は All instances in the network を選択します。
    • ネットワーク(ターゲット)のタグを使用して一部のインスタンスにルールを適用する場合は Specified target tags を選択し、ルールの適用対象にするタグを [ターゲットタグ] フィールドに入力します。
    • 関連するサービス アカウントを使用して一部のインスタンスにルールを適用する場合は Specified service account を選択し、[サービス アカウントのスコープ] でサービス アカウントがある場所を現在のプロジェクトまたは別のプロジェクトと指定します。続いて、[ターゲット サービス アカウント] フィールドでサービス アカウント名を選択するか入力します。
  10. 上り(内向き)ルールの場合、[ソースフィルタ] を指定します。
    • IP アドレスの範囲を使用して受信トラフィックのソースを定義するには、IP ranges を選択し、[ソース IP の範囲] フィールドに CIDR ブロックを入力します。ソースを任意のネットワークにするには、0.0.0.0/0 を使用します。
    • ネットワーク タグを使用してソースを制限するには Source tags を選択し、ネットワーク タグを [ソースタグ] フィールドに入力します。ソースタグ数の上限については、VPC の割り当てと上限をご覧ください。ソースタグによるフィルタリングを使用できるのは、サービス アカウントによってターゲットが指定されていない場合に限られます。詳しくは、サービス アカウントによるフィルタリングとネットワーク タグによるフィルタリングをご覧ください。
    • サービス アカウントを使用してソースを制限するには Service account を選択し、[サービス アカウントのスコープ] でサービス アカウントが現在のプロジェクトにあるか、別のプロジェクトにあるかを示します。その後、[ソースのサービス アカウント] フィールドでサービス アカウント名を選択するか入力します。ソースのサービス アカウントによるフィルタリングを使用できるのは、ネットワーク タグによってターゲットが指定されていない場合に限られます。詳しくは、サービス アカウントによるフィルタリングとネットワーク タグによるフィルタリングをご覧ください。
    • 必要に応じて、[2 番目のソースフィルタ] を指定します。2 番目のソースフィルタで、メインのソースフィルタと同じフィルタ条件を使用することはできません。[ソース IP の範囲] は、[ソースタグ] または [ソースのサービス アカウント] と併用できます。有効なソースセットは、ソース範囲の IP アドレスと、ネットワーク タグ(またはサービス アカウント)によって特定されるインスタンスを組み合わせたものです。
    • [ソースタグ] と [ソースのサービス アカウント] は併用できません。
  11. 下り(外向き)ルールの場合、[送信先フィルタ] を指定します。
    • IP アドレスの範囲を使用して発信トラフィックの送信先を定義するには IP ranges を選択し、[送信先 IP 範囲] フィールドに CIDR ブロックを入力します。0.0.0.0/0 を使用すると、任意の場所になります。
  12. ルールを適用する [プロトコルとポート] を定義します。

    • すべてのプロトコルと宛先ポートにルールを適用する場合は、アクションに応じて Allow allDeny all のいずれかを選択します。

    • 特定のプロトコルと宛先ポートを定義します。

      • TCP のプロトコルと宛先ポートを指定する場合は [tcp] を選択します。「all」と入力するか、20-22, 80, 8080 などの宛先ポートのカンマ区切りのリストを入力します。
      • UDP のプロトコルと宛先ポートを指定するには [udp] を選択します。「all」と入力するか、67-69, 123 などの宛先ポートのカンマ区切りのリストを入力します。
      • icmpsctp などのプロトコルを含めるには [その他のプロトコル] を選択します。
  13. (省略可)ファイアウォール ルールを作成しても、その適用状態を無効に設定すれば、ルールは適用されません。[ルールを無効にする] をクリックし、[無効] を選択します。

  14. [作成] をクリックします。

gcloud

ファイアウォール ルールを作成する gcloud コマンドは次のとおりです。

gcloud compute firewall-rules create NAME \
    [--network NETWORK; default="default"] \
    [--priority PRIORITY;default=1000] \
    [--direction (ingress|egress|in|out); default="ingress"] \
    [--action (deny | allow )] \
    [--target-tags TAG[,TAG,...]] \
    [--target-service-accounts=IAM_SERVICE_ACCOUNT[,IAM_SERVICE_ACCOUNT,...]] \
    [--source-ranges CIDR_RANGE[,CIDR_RANGE,...]] \
    [--source-tags TAG,TAG,] \
    [--source-service-accounts=IAM_SERVICE_ACCOUNT[,IAM_SERVICE_ACCOUNT,...]] \
    [--destination-ranges CIDR_RANGE[,CIDR_RANGE,...]] \
    [--rules (PROTOCOL[:PORT[-PORT]],[PROTOCOL[:PORT[-PORT]],...]] | all ) \
    [--disabled | --no-disabled] \
    [--enable-logging | --no-enable-logging] \
    [--logging-metadata LOGGING_METADATA]

パラメータは以下のように使用します。各パラメータの詳細については、SDK リファレンス ドキュメントをご覧ください。

  • --network: ルールのネットワーク。省略した場合、ルールは default ネットワークに作成されます。デフォルト ネットワークがない場合や、特定のネットワークにルールを作成する場合は、このフィールドを使用する必要があります。
  • --priority: ルールの優先度を示す数値です。数字が小さいほど、優先度が高くなります。
  • --direction: トラフィックの方向です。ingressegress のいずれかを指定します。
  • --action: 一致したときのアクションです。allowdeny のいずれかを指定します。--rules フラグとともに使用する必要があります。
  • ターゲットは、次の 3 つの方法のいずれかで指定します。
    • ルールをネットワーク内のすべてのターゲットに適用する場合は、--target-tags--target-service-accounts を省略します。
    • --target-tags: ネットワーク タグを使用してターゲットを定義する場合は、このフラグを使用します。
    • --target-service-accounts: 関連するサービス アカウントを使用してターゲットを定義する場合は、このフラグを使用します。
  • 上り(内向き)ルールの場合は、ソースを指定します。
    • --source-ranges: 送信元 IPv4 または IPv6 アドレスの範囲を CIDR 形式で指定する場合は、このフラグを使用します。
    • --source-rangessource-tags--source-service-accounts が省略されている場合、上り(内向き)のソースは任意の IPv4 アドレス 0.0.0.0/0 です。
    • --source-tags: ネットワーク タグを使用してソース インスタンスを指定する場合は、このフラグを使用します。ソースタグによるフィルタリングを使用できるのは、サービス アカウントによってターゲットが指定されていない場合に限られます。詳しくは、サービス アカウントによるフィルタリングとネットワーク タグによるフィルタリングをご覧ください。
    • --source-ranges--source-tags併用できます。両方が指定されている場合、有効なソースセットは、ソース範囲の IP アドレスと、ネットワーク タグによって特定されるインスタンスを組み合わせたものです(タグ付けされたインスタンスがソース範囲の IP を持たない場合であっても対象に含まれます)。
    • --source-service-accounts: 使用するサービス アカウントでインスタンスを指定する場合は、このフラグを使用します。ソースのサービス アカウントによるフィルタリングを使用できるのは、ネットワーク タグによってターゲットが指定されていない場合に限られます。詳しくは、サービス アカウントによるフィルタリングとネットワーク タグによるフィルタリングをご覧ください。--source-ranges--source-service-accounts併用できます。両方が指定されている場合、有効なソースセットは、ソース範囲の IP アドレスと、ソースのサービス アカウントによって特定されるインスタンスを組み合わせたものです(ソースのサービス アカウントによって特定されるインスタンスがソース範囲の IP を持たない場合であっても対象に含まれます)。
  • 下り(外向き)ルールの場合は、送信先を指定します。
    • --destination-ranges: 送信先 IPv4 または IPv6 アドレスの範囲を CIDR 形式で指定する場合は、このフラグを使用します。
    • --destination-ranges を省略すると、下り(外向き)の送信先は任意の IPv4 アドレス 0.0.0.0/0 になります。
  • --rules: ルールの適用対象となるプロトコルとポートのリスト。すべてのプロトコルと宛先ポートにルールを適用する場合は、all を使用します。--action フラグが必要です。
  • デフォルトでは、ファイアウォール ルールが作成されると自動的に適用されますが、この動作は変更できます。
    • --disabled--no-disabled の両方が省略されている場合は、ファイアウォール ルールが作成され、適用されます。
    • --disabled: ファイアウォール ルールを作成して適用しない場合は、このフラグを追加します。ファイアウォール ルールを更新して有効にするまで、ファイアウォール ルールは無効のままです。
    • --no-disabled: ファイアウォール ルールを確実に適用するには、このフラグを追加します。
  • --enable-logging | --no-enable-logging ファイアウォール ルールロギングは、ルールの作成時、更新時に適用できます。ファイアウォール ルールロギングを使用すると、ファイアウォール ルールの効果を監査、検証、分析できます。詳しくは、ファイアウォール ルールのロギングをご覧ください。
    • --logging-metadata: ロギングを有効にすると、デフォルトでは、ファイアウォール ルールのロギングにベース フィールドとメタデータ フィールドが含まれます。ストレージ費用を節約するために、メタデータ フィールドを省略できます。詳細については、ファイアウォール ルールロギングの使用をご覧ください。

API

ファイアウォール ルールを作成します。

POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/global/firewalls
{
  "name": "FIREWALL_NAME",
  "network": "projects/PROJECT-ID/global/networks/NETWORK_NAME",
  ... other fields
}

プレースホルダを有効な値に置き換えます。

  • PROJECT_ID は、VPC ネットワークが配置されているプロジェクトの ID です。
  • NETWORK_NAME は、ファイアウォール ルールが作成される VPC ネットワークの名前です。
  • FIREWALL_NAME は、ファイアウォール ルールの名前です。

  • 上り(内向き)ファイアウォール ルールで、次のフィールドを使用して上り(内向き)のソース(sourceRangessourceTagssourceServiceAccounts)を指定します。sourceRanges は、IPv4 と IPv6 のどちらの範囲でも指定できます。ただし、両方を組み合わせることはできません。範囲 0.0.0.0/0 を使用する場合は、フィールドを指定しないでください。sourceTags フィールドと sourceServiceAccounts フィールドは併用できません。ただし、sourceRangessourceTags または sourceServiceAccounts と併用できます。その場合、ファイアウォール ルールを適用するには、接続がどちらか一方と一致する必要があります。

    ターゲット フィールドで sourceTags フィールドを使用している場合は、targetServiceAccounts フィールドを使用できません。targetTags フィールドを使用するか、ターゲット フィールドは使用しないでください。同様に、sourceServiceAccounts フィールドを使用している場合、targetTags フィールドは使用できません。ターゲット フィールドを指定しない場合、ルールはネットワーク内のすべてのターゲットに適用されます。

  • 下り(外向き)ファイアウォール ルールで、destinationRanges フィールドを使用して送信先を指定します。destinationRanges は、IPv4 と IPv6 のどちらの範囲でも指定できます。ただし、両方を組み合わせることはできません。送信先を指定しない場合、Google Cloud は 0.0.0.0/0 を使用します。targetTags または targetServiceAccounts フィールドを使用して、ルールを適用するターゲットを指定します。ターゲット フィールドを指定しない場合、ルールはネットワーク内のすべてのターゲットに適用されます。

各フィールドの詳細と説明については、firewalls.insert メソッドをご覧ください。

Terraform

Terraform リソースを使用してファイアウォール ルールを作成できます。

resource "google_compute_firewall" "rules" {
  project     = var.project_id # Replace this with your project ID in quotes
  name        = "my-firewall-rule"
  network     = "default"
  description = "Creates firewall rule targeting tagged instances"

  allow {
    protocol = "tcp"
    ports    = ["80", "8080", "1000-2000"]
  }
  target_tags = ["web"]
}

ファイアウォール ルールを更新する

条件を一致させるために、指定されたプロトコルや宛先ポートなど、ファイアウォール ルールのコンポーネントの一部を変更できます。ファイアウォール ルールの名前、ネットワーク、一致したときのアクショントラフィックの方向は変更できません。

名前、ネットワーク、アクション、方向のコンポーネントを変更する必要がある場合は、ルールを削除して新しいルールを作成する必要があります。

IPv6 ファイアウォール ルールは Google Cloud Console ではサポートされていません。代わりに、gcloud コマンドライン ツールまたは API を使用してください。

複数のサービス アカウントを追加または削除する場合は、gcloud コマンドライン ツールか API を使用します。コンソールを使用して、ターゲットのサービス アカウントやソースのサービス アカウントを複数指定することはできません。

Console

  1. Google Cloud Console の [ファイアウォール] ページに移動します。
    [ファイアウォール] ページに移動
  2. 変更するファイアウォール ルールをクリックします。
  3. [編集] をクリックします。
  4. いずれかの編集可能コンポーネントをニーズに合うように変更します。

    [指定したプロトコルとポート] フィールドで、セミコロン区切りリストを使用して複数のプロトコル、およびプロトコルと宛先ポートのペアを指定します。

  5. [保存] をクリックします。

gcloud

ファイアウォール ルールを更新する gcloud コマンドは次のとおりです。

gcloud compute firewall-rules update NAME \
    [--priority=PRIORITY] \
    [--description=DESCRIPTION] \
    [--target-tags=TAG,...] \
    [--target-service-accounts=IAM_SERVICE_ACCOUNT,_] \
    [--source-ranges=CIDR_RANGE,...] \
    [--source-tags=TAG,...] \
    [--source-service-accounts=IAM_SERVICE_ACCOUNT,_] \
    [--destination-ranges=CIDR_RANGE,...] \
    [--rules=[PROTOCOL[:PORT[-PORT]],…]] \
    [--disabled | --no-disabled] \
    [--enable-logging | --no-enable-logging]

各フラグの説明は、ファイアウォール ルールを作成での説明と同じです。各フラグの詳細については、SDK リファレンス ドキュメントをご覧ください。

API

PATCH を使用して、フィールド alloweddescriptionsourceRangessourceTags、または targetTags を更新します。それ以外のフィールドには PUT または POST を使用します。

(PATCH|(POST|PUT)) https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/firewalls/FIREWALL_NAME
{
  "name": "FIREWALL_NAME",
  "network": "projects/PROJECT-ID/global/networks/NETWORK_NAME",
  ... other fields
}

プレースホルダを有効な値に置き換えます。

  • PROJECT_ID は、VPC ネットワークが配置されているプロジェクトの ID です。
  • NETWORK_NAME は、ファイアウォール ルールが配置されている VPC ネットワークの名前です。
  • FIREWALL_NAME は、更新するファイアウォール ルールの名前です。

各フィールドの詳細と説明については、firewalls.patch または firewalls.update メソッドをご覧ください。

VPC ネットワークのファイアウォール ルールを一覧表示する

Cloud Console では、プロジェクトまたは特定の VPC ネットワークのすべてのファイアウォール ルールを一覧表示できます。ファイアウォール ルールごとに、ルールのタイプ、ターゲット、フィルタなどの詳細が表示されます。

ファイアウォール ルールロギングを有効にすると、ファイアウォールのインサイトでファイアウォール ルールに関する分析情報が示されるため、構成の理解を深め、より安全に最適化できます。たとえば、過去 6 週間に使用されていない allow ルールを確認できます。詳細については、ファイアウォールのインサイトのドキュメントにあるファイアウォール ルールの詳細画面の使用をご覧ください。

Console

プロジェクト内のすべてのネットワークのファイアウォール ルールをすべて表示するには:

特定のネットワーク内のファイアウォール ルールを表示するには:

  1. Google Cloud Console で [VPC ネットワーク] ページに移動します。
    [VPC ネットワーク] ページに移動
  2. VPC ネットワークの名前をクリックして、その詳細ページに移動します。
  3. ネットワークの詳細ページで、[ファイアウォール ルール] タブをクリックします。

gcloud

次のコマンドを実行すると、特定のネットワーク([NETWORK-NAME])に関するファイアウォール ルールの並べ替え済みリストが出力されます。

gcloud compute firewall-rules list --filter network=NETWORK_NAME \
    --sort-by priority \
    --format="table(
        name,
        network,
        direction,
        priority,
        sourceRanges.list():label=SRC_RANGES,
        destinationRanges.list():label=DEST_RANGES,
        allowed[].map().firewall_rule().list():label=ALLOW,
        denied[].map().firewall_rule().list():label=DENY,
        sourceTags.list():label=SRC_TAGS,
        targetTags.list():label=TARGET_TAGS
        )"

API

指定されたネットワークのすべてのファイアウォール ルールを一覧表示します。

GET https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/global/firewalls/?filter=network="NETWORK_NAME

プレースホルダを有効な値に置き換えます。

  • PROJECT_ID は、VPC ネットワークが配置されているプロジェクトの ID です。
  • NETWORK_NAME は、一覧表示するファイアウォール ルールを含む VPC ネットワークの名前です。

詳細については、firewalls.list メソッドをご覧ください。

VM インスタンスのネットワーク インターフェースのファイアウォール ルールを一覧表示する

Cloud Console には、インターフェースに適用されるすべてのファイアウォール ルールと、実際にインターフェースで使用されているルールの一覧がネットワーク インターフェースごとに表示されます。ファイアウォール ルールは他のルールをマスキングできるため、インターフェースに適用されるすべてのルールが実際にインターフェースで使用されないことがあります。

ファイアウォール ルールを VM インスタンスに関連付けて適用するには、ルールの target パラメータを使用します。適用されているすべてのルールを表示して、特定のルールがインターフェースに適用されているかどうかを確認できます。

ファイアウォール ルールロギングを有効にすると、ファイアウォールのインサイトでファイアウォール ルールに関する分析情報が示されるため、構成の理解を深め、より安全に最適化できます。たとえば、過去 6 週間にインターフェースでヒットしたルールを確認できます。 詳細については、ファイアウォールのインサイトのドキュメントにある VM ネットワーク インターフェースの詳細画面の使用をご覧ください。

VM インスタンスの特定のネットワーク インターフェースに適用されているファイアウォール ルールを表示するには:

  1. Google Cloud Console で、[VM インスタンス] ページに移動して、表示するインスタンスを探します。
    [VM インスタンス] ページに移動
  2. インスタンスの [その他の操作] メニュー()で、[ネットワークの詳細の表示] を選択します。
  3. インスタンスに複数のネットワーク インターフェースがある場合は、[ネットワーク インターフェースの詳細] セクションに表示するネットワーク インターフェースを選択します。
  4. [ファイアウォール ルール] タブをクリックすると、ネットワーク インターフェースに適用されているすべてのルールがルール名順に表示されます。

ネットワーク インターフェースでは、そのインターフェースに適用されているルールのすべてが使用されるわけではありません。一部のルールが、より具体的な範囲を持つルールや優先度の高いルールで上書きされることがあります。使用中のルールを表示して、どの IP 範囲、プロトコル、宛先ポートがインスタンスに対して開いているか閉じているかをすばやく確認できます。

VM インスタンスの特定のネットワーク インターフェースで使用されているファイアウォール ルールを表示するには:

  1. Google Cloud Console で、[VM インスタンス] ページに移動して、表示するインスタンスを探します。
    [VM インスタンス] ページに移動
  2. インスタンスの [その他の操作] メニュー()で、[ネットワークの詳細の表示] を選択します。
  3. インスタンスに複数のネットワーク インターフェースがある場合は、[ネットワーク インターフェースの詳細] セクションに表示するネットワーク インターフェースを選択します。
  4. [ネットワーク分析] セクションの [上り分析] タブまたは [下り分析] タブを選択します。
  5. IP アドレス範囲が最も具体的なものから順にテーブルに表示されるので、特定の IP アドレスとの間のトラフィックが許可されているかどうかを確認します。

ファイアウォール ルールの詳細を表示する

ファイアウォール ルールを調べると、名前、適用されるネットワーク、コンポーネントなどの情報を確認できます(ルールの有効 / 無効も確認できます)。

Console

  1. ファイアウォール ルールを一覧表示します。すべてのルールのリスト、または特定のネットワーク内のルールのみを表示できます。
  2. 表示するルールをクリックします。

gcloud

次のコマンドを実行すると、個別のファイアウォール ルールの情報が取得できます。[FIREWALL-NAME] の部分は、ファイアウォール ルールの名前に置き換えてください。ファイアウォール ルールの名前はプロジェクトで一意であるため、既存のルールの情報を出力する場合、ネットワークを指定する必要はありません。

gcloud compute firewall-rules describe [FIREWALL-NAME]

API

指定されたファイアウォール ルールの情報を取得します。

GET https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/global/firewalls/FIREWALL_NAME

プレースホルダを有効な値に置き換えます。

  • PROJECT_ID は、ファイアウォール ルールが配置されているプロジェクトの ID です。
  • FIREWALL_NAME は、説明するファイアウォール ルールの名前です。

詳細については、firewalls.get メソッドをご覧ください。

ファイアウォール ルールを削除する

Console

  1. ファイアウォール ルールを一覧表示します。すべてのルールのリスト、または特定のネットワーク内のルールのみを表示できます。
  2. 削除するルールをクリックします。
  3. [削除] をクリックします。
  4. もう一度 [削除] をクリックして確定します。

gcloud

次のコマンドは、ファイアウォール ルールを削除します。[FIREWALL-NAME] の部分は、削除するルールの名前に置き換えてください。

gcloud compute firewall-rules delete [FIREWALL-NAME]

API

ファイアウォール ルールを削除します。

DELETE https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/global/firewalls/FIREWALL_NAME

プレースホルダを有効な値に置き換えます。

  • PROJECT_ID は、ファイアウォール ルールが配置されているプロジェクトの ID です。
  • FIREWALL_NAME は、削除するファイアウォール ルールの名前です。

詳細については、firewalls.delete メソッドをご覧ください。

ファイアウォール ルールのモニタリング

ファイアウォール ルールのロギングを有効にして、どのルールがどのトラフィックを許可またはブロックしているかを確認できます。詳しくは、ファイアウォール ルール ロギングの使用をご覧ください。

構成例

次の図は、ファイアウォール構成の例を示しています。このシナリオには、以下を含めた my-network が含まれています。

  • IP 範囲が 10.240.10.0/24 のサブネット subnet1
  • IP 範囲が 192.168.1.0/24 のサブネット subnet2
  • タグが webserver および内部 IP が 192.168.1.2subnet2 内のインスタンス vm1
  • タグが database および内部 IP が 192.168.1.3subnet2 内のインスタンス vm2
ネットワーク構成例(クリックして拡大)
ネットワーク構成例(クリックして拡大)

例 1: subnet1 からポート 80 への接続を除くすべての上り(内向き)TCP 接続を拒否する

この例では、subnet1 からポート 80 への接続を除くすべての上り(内向き)TCP 接続を拒否するファイアウォール ルールのセットを作成します。

  1. webserver でタグ付けされたインスタンスへのすべての上り(内向き)TCP トラフィックを拒否するファイアウォール ルールを作成します。

    gcloud compute firewall-rules create deny-subnet1-webserver-access \
        --network NETWORK_NAME \
        --action deny \
        --direction ingress \
        --rules tcp \
        --source-ranges 0.0.0.0/0 \
        --priority 1000 \
        --target-tags webserver
    
  2. webserver でタグ付けされたインスタンス上の TCP ポート 80 にアクセスする subnet110.240.10.0/24)内のすべての IP を許可するファイアウォール ルールを作成します。

    gcloud compute firewall-rules create vm1-allow-ingress-tcp-port80-from-subnet1 \
        --network NETWORK_NAME \
        --action allow \
        --direction ingress \
        --rules tcp:80 \
        --source-ranges 10.240.10.0/24 \
        --priority 50 \
        --target-tags webserver
    

例 2: vm1 のポート 80 への接続を除くすべての下り(外向き)TCP 接続を拒否する

  1. すべての下り(外向き)TCP トラフィックを拒否するファイアウォール ルールを作成します。

    gcloud compute firewall-rules create deny-all-access \
        --network NETWORK_NAME \
        --action deny \
        --direction egress \
        --rules tcp \
        --destination-ranges 0.0.0.0/0 \
        --priority 1000
    
  2. vm1 ポート 80 への TCP トラフィックを許可するファイアウォール ルールを作成します。

    gcloud compute firewall-rules create vm1-allow-egress-tcp-port80-to-vm1 \
        --network NETWORK_NAME \
        --action allow \
        --direction egress \
        --rules tcp:80 \
        --destination-ranges 192.168.1.2/32 \
        --priority 60
    

例 3: 外部ホストのポート 443 への下り(外向き)TCP 接続を許可する

webserver でタグ付けされたインスタンスが、サンプル外部 IP アドレス 192.0.2.5 のポート 443 へ下り(外向き)TCP トラフィックを送信できるように許可するファイアウォール ルールを作成します。

gcloud compute firewall-rules create vm1-allow-egress-tcp-port443-to-192-0-2-5 \
    --network NETWORK_NAME \
    --action allow \
    --direction egress \
    --rules tcp:443 \
    --destination-ranges 192.0.2.5/32 \
    --priority 70 \
    --target-tags webserver

例 4: vm2 から vm1 への SSH 接続を許可する

タグ databasevm2)が付いたインスタンスからタグ webservervm1)が付いたインスタンスに到達する SSH トラフィックを許可するファイアウォール ルールを作成します。

gcloud compute firewall-rules create vm1-allow-ingress-tcp-ssh-from-vm2 \
    --network NETWORK_NAME \
    --action allow \
    --direction ingress \
    --rules tcp:22 \
    --source-tags database \
    --priority 80 \
    --target-tags webserver

例 5: サービス アカウントを使用し、ウェブサーバーからデータベースへの TCP: 1443 を許可する

サービス アカウントとロールの詳細については、サービス アカウントへのロールの付与をご覧ください。

テンプレート、ウェブサーバー アプリケーション my-sa-web、データベース アプリケーション「my-sa-db」を使用して自動スケーリングされる 2 つのアプリケーションを含む、以下の図のようなシナリオについて考えます。セキュリティ管理者は、my-sa-web から my-sa-db への宛先ポート 1443 の TCP フローを許可しようと考えています。

ファイアウォール ルールをサービス アカウントで使用する(クリックして拡大)
ファイアウォール ルールをサービス アカウントで使用する(クリックして拡大)

サービス アカウントの作成を含む構成手順は次のとおりです。

  1. プロジェクトの編集者またはオーナーが、my-sa-webmy-sa-db というサービス アカウントを作成します。

    gcloud iam service-accounts create my-sa-web \
        --display-name "webserver service account"
    
    gcloud iam service-accounts create my-sa-db \
        --display-name "database service account"
    
  2. プロジェクト オーナーが Identity and Access Management(IAM)ポリシーを設定して、ウェブサーバー開発者 web-dev@example.com にサービス アカウント my-sa-webserviceAccountUser のロールを割り当てます。

    gcloud iam service-accounts add-iam-policy-binding \
       my-sa-web@my-project.iam.gserviceaccount.com \
       --member='user:web-dev@example.com' \
       --role='roles/iam.serviceAccountUser'
    
  3. プロジェクト オーナーが IAM ポリシーを設定して、データベース開発者「db-dev@example.com」にサービス アカウント my-sa-dbserviceAccountUser のロールを割り当てます。

    gcloud iam service-accounts add-iam-policy-binding \
       my-sa-db@my-project.iam.gserviceaccount.com \
       --member='user:db-dev@example.com' \
       --role='roles/iam.serviceAccountUser'
    
  4. インスタンス管理者のロールを持つ開発者 web-dev@example.com が、ウェブサーバー インスタンス テンプレートを作成し、インスタンスをサービス アカウント my-sa-web として実行する権限を与えます。

    gcloud compute instance-templates create [INSTANCE_TEMPLATE_NAME]  \
        --service-account my-sa-web@my-project-123.iam.gserviceaccount.com
    
  5. インスタンス管理者のロールを持つ開発者 db-dev@example.com が、データベース インスタンス テンプレートを作成し、インスタンスをサービス アカウント my-sa-db として実行する権限を与えます。

    gcloud compute instance-templates create [INSTANCE_TEMPLATE_NAME] \
        --service-account my-sa-db@my-project-123.iam.gserviceaccount.com
    
  6. セキュリティ管理者が、サービス アカウントを使用してファイアウォール ルールを作成し、サービス アカウント my-sa-web からサービス アカウント my-sa-db への TCP:1443 トラフィックを許可します。

    gcloud compute firewall-rules create FIREWALL_NAME \
        --network network_a \
        --allow TCP:1443 \
        --source-service-accounts my-sa-web@my-project.iam.gserviceaccount.com \
        --target-service-accounts my-sa-db@my-project.iam.gserviceaccount.com
    

トラブルシューティング

ファイアウォール ルールの作成または更新時のエラー メッセージ

以下のエラー メッセージのいずれかが表示される場合があります。

  • Should not specify destination range for ingress direction.

    送信先の範囲が、上り(内向き)のファイアウォール ルールの有効なパラメータではありません。ファイアウォール ルールは、egress の方向が特に指定されていない限り、上り(内向き)ルールとみなされます。方向を指定せずにルールを作成すると、上り(内向き)ルールとして作成され、宛先の範囲は許可されません。また、送信元の範囲も下り(外向き)ルールの有効なパラメータではありません。

  • Firewall direction cannot be changed once created.

    既存のファイアウォール ルールの方向は変更できません。正しいパラメータで新しいルールを作成してから、古いルールを削除する必要があります。

  • Firewall traffic control action cannot be changed once created.

    既存のファイアウォール ルールのアクションは変更できません。正しいパラメータで新しいルールを作成してから、古いルールを削除する必要があります。

  • Service accounts must be valid RFC 822 email addresses. ファイアウォール ルールで指定するサービス アカウントは、RFC 822 形式のメールアドレスである必要があります。

    gcloud compute firewall-rules create bad --allow tcp --source-service-accounts invalid-email
    
    Creating firewall...failed.
    ERROR: (gcloud.compute.firewall-rules.create) Could not fetch resource:
    – Invalid value for field 'resource.sourceServiceAccounts[0]': 'invalid-email'. Service accounts must be valid RFC 822 email addresses.
    
  • ServiceAccounts and Tags are mutually exclusive and can't be combined in the same firewall rule. 同じルール内にサービス アカウントとタグの両方を指定することはできません。

    gcloud compute firewall-rules create bad --allow tcp --source-service-accounts test@google.com --target-tags target
    
    Creating firewall...failed.
     ERROR: (gcloud.compute.firewall-rules.create) Could not fetch resource:
    – ServiceAccounts and Tags are mutually exclusive and can't be combined in the same firewall rule.
    

VM インスタンスに接続できない

VM インスタンスに接続できない場合、ファイアウォール ルールを確認してください。

  1. 別の VM インスタンスから接続を開始する場合は、そのインスタンスの下りファイアウォール ルールを一覧表示します。

    gcloud compute firewall-rules list --filter network=[NETWORK-NAME] \
        --filter EGRESS \
        --sort-by priority \
        --format="table(
            name,
            network,
            direction,
            priority,
            sourceRanges.list():label=SRC_RANGES,
            destinationRanges.list():label=DEST_RANGES,
            allowed[].map().firewall_rule().list():label=ALLOW,
            denied[].map().firewall_rule().list():label=DENY,
            sourceTags.list():label=SRC_TAGS,
            sourceServiceAccounts.list():label=SRC_SVC_ACCT,
            targetTags.list():label=TARGET_TAGS,
            targetServiceAccounts.list():label=TARGET_SVC_ACCT
            )"
    
  2. 送信先 IP がすべての下り(外向き)ルールによって拒否されているかどうかを確認します。最も高い優先度(優先度の数字が最も小さいもの)を持つルールは、優先度がより低いルールよりも優先されます。同じ優先度を持つ 2 つのルールの場合、拒否ルールのほうが優先されます。

  3. ネットワークの上り(内向き)ファイアウォール ルールに送信先 VM インスタンスが含まれているかどうか確認します。

    gcloud compute firewall-rules list --filter network=[NETWORK-NAME] \
        --filter INGRESS \
        --sort-by priority \
        --format="table(
            name,
            network,
            direction,
            priority,
            sourceRanges.list():label=SRC_RANGES,
            destinationRanges.list():label=DEST_RANGES,
            allowed[].map().firewall_rule().list():label=ALLOW,
            denied[].map().firewall_rule().list():label=DENY,
            sourceTags.list():label=SRC_TAGS,
            sourceServiceAccounts.list():label=SRC_SVC_ACCT,
            targetTags.list():label=TARGET_TAGS,
            targetServiceAccounts.list():label=TARGET_SVC_ACCT
            )"
    

    出力例。出力は、ファイアウォール ルールのリストによって異なります。

    NAME                    NETWORK  DIRECTION  PRIORITY  SRC_RANGES    DEST_RANGES  ALLOW                         DENY  SRC_TAGS  SRC_SVC_ACCT      TARGET_TAGS  TARGET_SVC_ACCT
    default-allow-icmp      default  INGRESS    65534     0.0.0.0/0                  icmp
    default-allow-internal  default  INGRESS    65534     10.128.0.0/9               tcp:0-65535,udp:0-65535,icmp
    default-allow-rdp       default  INGRESS    65534     0.0.0.0/0                  tcp:3389
    default-allow-ssh       default  INGRESS    65534     0.0.0.0/0                  tcp:22
    firewall-with-sa        default  INGRESS    1000                                 tcp:10000                                     test1@google.com               target@google.com
    
  4. 上り(内向き)または下り(外向き)のファイアウォール ルールによってトラフィックがドロップされているかどうかをトラブルシューティングする場合は、VPC ネットワーク内の VM インスタンスと、別の VPC ネットワークまたは Google Cloud 以外のネットワークとの間で接続テストを実施します。接続テストを実施してさまざまなシナリオのトラブルシューティングを行う方法については、接続テストの実施をご覧ください。

ファイアウォール ルールの有効 / 無効を確認する

ファイアウォール ルールの有効 / 無効を確認するには、ファイアウォール ルールの詳細を表示します。

Google Cloud Console の [適用] に Enabled と表示されているか、Disabled と表示されているかを確認します。

gcloud コマンドライン ツールの出力で、disabled フィールドを見つけます。disabled:false である場合、ルールは有効で、適用されています。disabled: true である場合、ルールは無効です。

VM インスタンスに適用されているルールを確認する

VPC ネットワークに新しいファイアウォール ルールを追加して、10.1.2.3 にあるデータベース サーバーへの tcp:1433 経由のトラフィックを許可するとします。ルールを作成したら、そのルールが特定のインスタンスに正しく適用されているかどうかを確認できます。詳細については、VM インスタンスのネットワーク インターフェースのファイアウォール ルールを一覧表示するをご覧ください。

次に示すコンソールの例では、[下り分析] タブにこの VM インスタンスの database-access ルールが一覧表示されており、10.1.2.3 の下り(外向き)トラフィックが宛先ポート 1433 で許可されていることがわかります。範囲 10.1.0.0/16 のその他の下り(外向き)トラフィックは、deny-database-subnet ファイアウォール ルールによりブロックされます。

VM インスタンスで許可されている下り(外向き)トラフィック(クリックして拡大)
VM インスタンスで許可されている下り(外向き)トラフィック(クリックして拡大)

ソースタグ付きのファイアウォール ルールがすぐに適用されない

ソースタグを使用する上り(内向き)ファイアウォール ルールが反映されるまで、時間がかかることがあります。詳しくは、上り(内向き)ファイアウォール ルールのソースタグに関する考慮事項をご覧ください。

次のステップ