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

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

ファイアウォール ルールを作成する

ファイアウォール ルールは 1 つのネットワークにのみ適用されますが、そのファイアウォール ルール名はプロジェクト内で一意である必要があります。

Console

  1. Google Cloud Platform Console で [ファイアウォール ルール] ページに移動します。
    [ファイアウォール ルール] ページに移動
  2. [ファイアウォール ルールの作成] をクリックします。
  3. ファイアウォール ルールの [名前] を入力します。
    この名前はプロジェクトで一意にする必要があります。
  4. ファイアウォール ルールが実装される [ネットワーク] を指定します。
  5. ルールの [優先度] を指定します。
    このルールが他のルールと競合していない場合、優先度をデフォルトの 1000 のままにしておくことができます。他のルールより高いまたは低い優先度を指定する場合、値を小さくすると優先的に評価され、値を大きくすると評価が後回しにされます。
  6. ルールを適用する [トラフィックの方向] を指定します。
  7. [一致したときのアクション] として、一致するトラフィックの許可または拒否を指定します。
  8. ルールの [ターゲット] を指定します。
    • ルールをネットワーク内のすべてのインスタンスに適用する場合、[All instances in the network] を選択します。
    • ターゲットタグに基づいて特定のインスタンスのみに適用する場合、[Specified target tags] を選択し、[Target tags] フィールドにそれらのタグを一覧表示します。
    • これらのインスタンスを所有するサービス アカウントに基づいて特定のインスタンスにルール適用する場合、[Specified service account] を選択し、サービス アカウントが現在のプロジェクトにあるか別のプロジェクトにあるかを [サービス アカウントのスコープ] フィールドに示し、[ターゲットのサービス アカウント] フィールドにサービス アカウントを指定します。
  9. 上りルールの場合、[ソースフィルタ] を指定します。
    • 特定のソース IP の範囲からのパケットにルールを適用する場合、[IP ranges] を選択し、[Source IP ranges] フィールドでそれらの範囲を指定します。
    • すべての範囲に適用する場合、0.0.0.0/0 と指定します。ネットワーク内の 1 つまたは複数のサブネットからのトラフィックにルールを適用する場合は、[Subnetworks] を選択し、[サブネットワーク] フィールドでサブネットを指定します。
    • 特定のソース インスタンスを持つインスタンスのみにルールを適用する場合、[Specified source tags] を選択し、[Source tags] フィールドにそれらのタグを一覧表示します。
    • これらのインスタンスを所有するサービス アカウントに基づいて特定のインスタンスにルール適用する場合、[Service account] を選択し、サービス アカウントが現在のプロジェクトにあるか別のプロジェクトにあるかを [サービス アカウントのスコープ] フィールドに示し、[ターゲットのサービス アカウント] フィールドにサービス アカウントを指定します。
  10. 必要に応じて、2 番目のソースフィルタを指定します。
  11. 下りルールの場合、[送信先フィルタ] を指定します。
    特定の IP 範囲に送信されるパケットのみにルールを適用する場合、[IP ranges] を選択し、それらの範囲を [Destination IP ranges] で指定します。すべての範囲に適用する場合、0.0.0.0/0 と指定します。ネットワーク内の 1 つまたは複数のサブネットでのトラフィックにルールを適用する場合は、[Subnetworks] を選択し、[サブネットワーク] フィールドでサブネットを指定します。
  12. ルールを適用する必要がある [プロトコルとポート] を指定します。
    allow ルールの場合は [Allow all]、deny ルールの場合は [Deny all] を選択するか、または許可あるいは拒否する必要があるプロトコルとポートを指定します。
  13. [作成] をクリックします。

gcloud

gcloud compute firewall-rules create [NAME] \
    [--network [NETWORK]; default=”default”] \
    [--allow ([PROTOCOL][:PORT[-PORT]],[PROTOCOL[:PORT[-PORT]],...]] | all ) \
    [--action (deny | allow )] \
    [--rules ([PROTOCOL][:PORT[-PORT]],[PROTOCOL[:PORT[-PORT]],...]] | all ) \
    [--direction (ingress|egress|in|out); default=”ingress”] \
    [--priority [PRIORITY];default=1000] \
    [--destination-ranges [CIDR-RANGE][,CIDR-RANGE...]] \
    [--source-ranges [CIDR-RANGE][,CIDR-RANGE…]] \
    [--source-tags [TAG][,TAG,...]] \
    [--target-tags [TAG][,TAG,...]] \
    [--source-service-accounts=[EMAIL] \
    [--target-service-accounts=[EMAIL]

  • --network このルールを適用するネットワーク。省略した場合、ルールが default ネットワークに適用されます。
  • --allow トラフィックが許可されるプロトコルとポートのリスト。キーワード「all」の使用は、任意のポート範囲の任意の IP プロトコルを意味します。--action deny フラグと一緒に指定することはできません(将来的にはサポートが終了します)。
  • --action ファイアウォール ルールに対するアクション: 一致するトラフィックを許可または拒否します。指定した場合、--rules も指定する必要があります。
  • --rules --action パラメータに従ってトラフィックが影響を受けるプロトコルとポートのリスト。キーワード「all」の使用は、任意のポート範囲の任意の IP プロトコルを意味します。--action と一緒に指定する必要があります。
  • --direction ファイアウォール ルールが適用される接続の方向。ingress(デフォルト)または egress。上りトラフィックの場合、送信先の範囲はサポートされません。下りトラフィックの場合、ソース範囲やソースタグはサポートされません。
  • --priority このファイアウォール ルールの優先度。これは 065535 の整数(境界を含む)になります。指定されていない場合、想定される値は 1000 です。相対的な優先度は競合するルールの優先順位を決定します。優先度の値が小さいほど、優先順位が高くなります。つまり、12 より優先順位が高いです。deny ルールは、同じ優先順位を持つ allow ルールよりも優先されます。
  • --destination-ranges 送信先範囲が指定されている場合、ファイアウォールがこの範囲内の送信先 IP アドレスがあるトラフィックのみに適用されます。この範囲は CIDR 形式で表現する必要があります。
  • --source-ranges 送信元範囲が指定されている場合、ファイアウォールがこの範囲内の送信元 IP アドレスがあるトラフィックのみに適用されます。これらの範囲は CIDR 形式で表現する必要があります。source-ranges と source-tags のいずれかまたは両方を設定できます。両方のプロパティが設定されている場合、source-ranges 内の送信元 IP アドレスまたは source-tags プロパティに一覧表示されているタグに属している送信元 IP を持つトラフィックにファイアウォールが適用されます。ファイアウォールを適用するために、接続が両方のプロパティに一致している必要はありません。
  • --source-tags ソースタグが指定されている場合、ファイアウォール ルールは ingress 接続と、ソースタグを持つインスタンスのプライマリ IP アドレスと一致するソース IP アドレスとを一致させます。ソースタグは、インスタンスの外部 IP アドレスまたはセカンダリ内部 IP アドレスへのトラフィックの制御には使用できません。ルール内にタグとサービス アカウントの両方を指定することはできません。
  • --target-tags インスタンス タグのリスト。問題のルールは、ネットワーク内のいずれかのタグが付けられたインスタンスに割り当てられ、タグが付けられていないインスタンスには適用されません。ルール内にタグとサービス アカウントの両方を指定することはできません。
  • --source-service-accounts ソース サービス アカウントが指定されている場合、ルールは、作成されたインスタンスのプライマリ内部 IP アドレスと一致するソース IP アドレスを持つ接続と、そのサービス アカウントを一致させます。ソース サービス アカウントは、インスタンスの外部 IP アドレスまたはセカンダリ内部 IP アドレスへのトラフィックの制御には使用できません。ルール内にタグとサービス アカウントの両方を指定することはできません。
  • --target-service-accounts 問題のルールは、サービス アカウントで作成されたネットワーク内のインスタンスに割り当てられ、そのアカウントで作成されていないインスタンスには割り当てられません。ルール内にタグとサービス アカウントの両方を指定することはできません。

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

ファイアウォール ルールを更新するには、次のオプションのいずれかを使用します。

すべてのフィールドを変更する必要はありません。変更できないフィールドを変更する場合は、既存のルールを削除して、同じ名前の新しいルールを作成する必要があります。

Console

  1. Google Cloud Platform Console で [ファイアウォール ルール] ページに移動します。
    [ファイアウォール ルール] ページに移動
  2. 変更するファイアウォール ルールをクリックします。
  3. [編集] をクリックします。
  4. 目的のフィールドを変更します。
  5. [保存] をクリックします。

gcloud

gcloud compute firewall-rules update [NAME] \
    [--allow=[[PROTOCOL][:PORT[-PORT]],…]] \
    [--description=[DESCRIPTION]] \
    [--destination-ranges=[CIDR_RANGE,…]] \
    [--priority=[PRIORITY]] \
    [--rules=[[PROTOCOL][:PORT[-PORT]],…]] \
    [--source-ranges=[[CIDR_RANGE],…]] \
    [--source-tags=[[TAG],…]] \
    [--target-tags=[[TAG],…]] \
    [--source-service-accounts=[EMAIL] \
    [--target-service-accounts=[EMAIL]

指定する必要があるのは、変更するフラグだけです。他のすべてのフラグは変更されません。

その他のファイアウォール ルールコマンド

Console

ファイアウォール ルールを一覧表示する

  1. Google Cloud Platform Console で [ファイアウォール ルール] ページに移動します。
    [ファイアウォール ルール] ページに移動

詳細を表示する

  1. Google Cloud Platform Console で [ファイアウォール ルール] ページに移動します。
    [ファイアウォール ルール] ページに移動
  2. [ファイアウォール ルール] ページで、表示するルールをクリックします。

ルールを削除する

  1. Google Cloud Platform Console で [ファイアウォール ルール] ページに移動します。
    [ファイアウォール ルール] ページに移動
  2. [ファイアウォール ルール] ページで、削除するルールをクリックします。
  3. [削除] をクリックします。
  4. もう一度 [削除] をクリックして確定します。

gcloud

ファイアウォール ルールを並べ替えたリスト

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]
        )"

その他のファイアウォール ルールコマンド

その他のファイアウォール ルールの gcloud コマンドについては、SDK のドキュメントをご覧ください。

設定例

以下に、ファイアウォール設定の例を示します。このシナリオには、以下を含めた 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 my-network \
        --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 my-network \
        --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 my-network \
        --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 my-network \
        --action allow \
        --direction egress \
        --rules tcp:80 \
        --destination-ranges 192.168.10.2/32 \
        --priority 60
    

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

タグ webserver が付けられたインスタンスの外部 IP アドレス 192.0.2.5 のポート 443 への下り TCP トラフィックを許可するファイアウォール ルールを作成します。

gcloud beta compute firewall-rules create vm1-allow-egress-tcp-port443-to-192-0-2-5 \
    --network my-network \
    --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 my-network \
    --action allow \
    --direction ingress \
    --rules tcp:22 \
    --sourceTags database \
    --priority 80 \
    --target-tags webserver

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

サービス アカウントと役割の詳細については、「サービス アカウントへの役割の付与」を参照してください。

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

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

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

  1. プロジェクト EDITOR またはプロジェクト OWNER によって、my-sa-web および my-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. プロジェクト OWNER が、IAM ポリシーを設定し、ウェブサーバー デベロッパー web-dev@example.com にサービス アカウント my-sa-web の役割 serviceAccountActor を割り当てます。

    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.serviceAccountActor'
       

  3. プロジェクト OWNER が、IAM ポリシーを設定して、データベース デベロッパー「db-dev@example.com」にサービス アカウント my-sa-db の役割 serviceAccountActor を割り当てます。

    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.serviceAccountActor'
       

  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-web として実行する権限を与えます。

    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 beta compute firewall-rules create [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.

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

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

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

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

    gcloud compute firewall-rules list --filter network=[NETWORK_NAME] \
        --filter direction=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],
            targetTags.list():label=[TARGET_TAGS]
            )"
    

  2. 送信先 IP がすべての下りルールによって拒否されているかどうかを確認します。最も高い優先順位(最も低い優先順位の番号)を持つルールは、優先順位がより低いルールよりも優先されます。同じ優先順位を持つ 2 つのルールの場合、拒否ルールのほうが優先されます。

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

    gcloud compute firewall-rules list --filter network=[NETWORK_NAME] \
        --filter direction=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],
            targetTags.list():label=[TARGET_TAGS]
            )"
    

次のステップ

このページは役立ちましたか?評価をお願いいたします。

フィードバックを送信...

Compute Engine ドキュメント